赞
踩
目录
(1)JavaScript是一个脚本语言,通过解释器运行;
(2)JavaScript主要在客户端(浏览器)上运行,如在chrome里有一个特定的模块:JS引擎,相当于JVM一样,能够解释执行JS代码,后来chrome上的JS引擎被单独封装成独立程序,称为V8引擎;
(3)JS最初只是为了进行前端页面开发,后来也被赋予了更多功能,可以用于开发桌面程序,手机app,服务器端的程序等等;
(4)JavaScrip又称liveScript或ECMAScript;
即:HTML构成网页的结构(骨),CSS构成网页的表现(皮),JavaScript构成网页的行为(魂);
(1)ECMAScript(简称ES):JavaScrip语法;
(2)DOM:页面文档对象模型,对页面中的元素进行操作;
(3)BOM:浏览器对象模型,对浏览器窗口进行操作;
浏览器还提供了很多API,主要学习ECMAScript半部分和DOM中一些常用API;
类似于CSS利用style标签嵌入到HTML中一样,JavaScript可以利用script标签嵌入HTML中:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- </head>
- <body>
- <script>
- alert('hello');
- // alert是弹出会话框显示字符串内容的API
- </script>
- </body>
- </html>
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- </head>
- <body>
- <div onclick="alert('hello')">
- click
- </div>
- </body>
- </html>
运行以下代码后,初始页面如下:
点击文本后出现弹窗:
将js代码直接嵌入到html元素内部,进行点击div时才加载运行script标签;
在同目录下创建.js文件:
alert("hello");
在.html文件中插入.js文件:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- </head>
- <body>
- <script src="hello.js"> </script>
- </body>
- </html>
以上三种方式运行后显示页面均如下:
注:(1)HTML的注释是<!-- -->,CSS的注释是/* */,JS的注释是 //或 /* */;
(2)内嵌式与外部式都是在页面加载的时候执行script代码,行内式是在执行到html标签内容时才会执行script代码;
(1)alert可以弹出一个警示对话框,从而看到输出;
(2)alert是一个模态对话框,即弹出来后会组织用户操作页面其他部分;
(1)console.log可以在控制台上进行输出;
(2)JavaScript没有字符、字符串的类型区分,单双引号均可(MySQL同);
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Document</title>
- </head>
- <body>
- <script>
- console.log('hello world');
- </script>
- </body>
- </html>
在Chrome网页开发者工具栏console标签页就可以看到输出结果:
注:console.log并不能被认为是一种可以和用户进行交互的一种手段,而是可以帮助程序员进行调试;
- <body>
- <script>
- var a=10;
- console.log(a);
- var b="hello";
- console.log(b);
- </script>
- </body>
注:(1)使用var 变量名=初始值;
(2)JS定义变量不必写类型,其类型是通过初始化操作的值来确定的;
(3)JS中没有整数、小数类型,即不区分int与double,只有number类型;
注:(1)var属于老式写法,存在一些弊端,如:无法报错变量重复定义:
- <script>
- var a=10;
- var a=10;
- console.log(a);
- </script>
在Chrome网页console标签页可查看该代码可正常运行不报错:
但是let是新式写法,更接近主流语言C++,Java等写法;
试将var改为let再运行后查看console标签页:
会发现重复定义变量报错;
还有变量作用域的问题等等,故而let使用的更多;
- <body>
- <script>
- let a=10;
- console.log(a);
- a="hello";
- console.log(a);
- </script>
- </body>
打开Chrome网页的console标签页可以查看运行结果:
注:(1)JavaScript是一个动态类型的编程语言,一个变量在程序运行过程中可以发生改变;
像C语言、C++、Java就是静态类型编程语言;
像Python、JS、PHP、Lua等就是动态类型编程语言;
(2)动态类型的优点在于代码非常灵活,但弊端在于一个变量的类型、数值以及相关方法与属性都是不确定的;
(1)number:数字,不区分整数和小数;
(2)boolean:true和false;
(3)string:字符串类型;
(4)undefined:只有唯一的值undefined,表示未定义的值;(没有盒子)
(5)null:只有唯一的值null,表示空值;(空盒子)
JavaScript的运算符与Java基本相同,此处仅罗列不同或新增运算符:
试运行以下代码:
- <script>
- let a=10;
- let b='10';
- console.log(a==b);
- console.log(a===b);
-
- let c=1;
- let d=0;
- let e=true;
- let f=false;
- console.log(c==e);
- console.log(d==f);
- </script>
打开Chrome网页的console标签页查看运行结果:
在JavaScript中,不只有==判等符号,还有===判等符号:
(1)== :比较相等(JS在进行不同类型的比较或运算时,会尝试尽可能地转成想同类型)
===:比较相等(不会进行隐式类型转换,先比较类型,类型不同则不等)
(2)!= 与 !== 同理;
注:像Java这种不太支持隐式类型转换的语言称为强类型语言,JS这种比较能支持隐式类型转换的语言称为弱类型语言;
let arr=new Array();
- let arr2=[];
- let arr3=[1,2,3,4];
注:JavaScript中不要求数组元素是相同类型,故而以下写法是允许的:
let arr4=[1,2.5,"hello",false];
- let arr=['Mike','Mary','Jhon'];
- console.log(arr[0]);
- console.log(arr[1]);
- console.log(arr[2]);
- console.log(arr);
- arr[1]='Lucy';
- console.log(arr);
打开Chrome网页的console标签页,查看运行结果:
注:(1)如果超出下标范围访问数组元素:
- let arr=['Mike','Mary','Jhon'];
- console.log(arr[100]);
- console.log(arr[-1]);
运行结果为:
程序仍然正常执行,并未因为下标越界而异常终止;
(2)试运行以下代码:
- let arr=['Mike','Mary','Jhon'];
- console.log(arr);
- console.log('arr[100]= '+arr[100]);
- arr[-1]="xxxx";
- console.log(arr);
- arr[100]="yyyy";
- console.log(arr);
- arr["hello"]="zzzz";
- console.log(arr);
运行结果为:
JS的数组不仅是一个传统意义的数组,更是一个数组+Map的混合体,即带有“键值对”性质,很多动态类型语言都是如此,如PHP;
- let arr=['Mike','Mary','Lucy'];
- console.log('方法1:for循环')
- for(let i=0;i<arr.length;i++){
- console.log(arr[i]);
- }
- console.log('方法2:for-each1')
- for(let i in arr){
- // i为数组元素下标
- console.log(arr[i]);
- }
- console.log('方法3:for-each2')
- for(let elem of arr){
- // elem为数组元素
- console.log(elem);
- }
运行结果如下:
- let arr=['Mike','Mary','Lucy'];
- console.log(arr);
- arr.push('Jike');
- console.log(arr);
运行结果如下:
splice不仅可以用于删除元素,还可以用来插入、删除等等,
- solice(startIndex, count, 变长参数)
- // 会将变长参数替换到参数位置指定区间之内
- // 如果没有变长参数,即删除;
- // 如果变长参数个数=指定区间元素个数,即修改;
- // 如果变长参数个数>指定区间元素个数,即新增;
试运行以下代码:
- let arr=['Mike','Mary','Lucy','Jike'];
- console.log(arr);
- arr.splice(2,1);
- console.log(arr);
- arr.splice(2,0,'John');
- console.log(arr);
运行结果如下:
- // 创建函数/函数声明/函数定义
- function 函数名(形参列表){
- 函数体
- return 返回值;
- }
- // 函数调用
- 函数名(实参列表) // 不考虑返回值
- 返回值=函数名(实参列表) // 考虑返回值
注:(1)JS函数定义时不需要写返回值类型;
(2)JS不是面向对象的编程语言,故而也不存在封装、继承、多态等特点;
示例如下:
- function add(x,y){
- return x+y;
- }
- console.log(add(10,2));
- console.log(add('hello','world'));
- console.log(add(10,true));
- console.log(add(undefined,10));
- console.log(add(undefined,'10'));
运行结果为:
注:(1)undefined与数字相加,是将undefined转换为"undefined"再与数字相加,即最终结果不是一个数字,会返回NaN,即not a number;
但undefined与字符串相加,即为字符串拼接;
(1)如果实参个数少于形参个数,则多出的形参值为undefined:
- function add(x,y){
- return x+y;
- }
- console.log(add(10));
- console.log(add('10'));
运行结果为:
(2)如果实参个数比形参个数多,则多出的实参不参与运算:
- function add(x,y){
- return x+y;
- }
- console.log(add(10, 20,30));
运行结果如下:
注:(1)每个函数内部会自动定义一个arguments变量,相当于一个数组,包含了所有实参,故而可以使用arguments获取到所有实参:
- function add(){
- let result=0;
- for(let elem of arguments){
- result += elem;
- }
- return result;
- }
- console.log(add(10));
- console.log(add(10,20));
- console.log(add(10,20,30));
- console.log(add(10,20,30,40));
运行结果如下:
对于JS这样的动态类型语言来说,不需要重载这样的语法;
- let add = function(){
- let result=0;
- for(let elem of arguments){
- result+=elem;
- }
- return result;
- }
注:(1)这种函数写法是:先定义了一个匿名函数,再将匿名函数赋值给一个add变量,这个add变量就是一个function类型变量:
console.log(typeof(add));
且function类型变量是可以调用的,即在该种函数定义方式下,以下代码仍然可以正常运行:
console.log(add(10,20,30));
JS中可以像普通变量一样将函数赋值给一个变量,同时也可以把函数作为一个函数的参数,或者把函数作为另一个函数的返回值,这一点Java是无法做到的;
JS中,有作用域链的概念,即:JS会先在当前作用域找,如果没有,依次向上层作用域找,直至全局作用域,如果仍然查询无果,就报错或undefined;
示例代码1:
- let num=1;
- function test1(){
- let num=2;
- function test2(){
- let num=3;
- console.log("test2:"+num);
- }
- test2();
- console.log("test1:"+num);
- }
- test1();
- console.log("global:"+num);
运行结果如下:
示例代码2:
- let num=1;
- function test1(){
- let num=2;
- function test2(){
- console.log("test2:"+num);
- }
- test2();
- console.log("test1:"+num);
- }
- test1();
- console.log("global:"+num);
运行结果如下:
当在test2函数中查找num无果,就会向上查找,找到定义在test1函数中的num=2,故而打印2;
首先需要明确:JS不是面向对象的编程语言,但是存在对象的概念;
故而JS中关于对象的设定与Java差别很大,JS中没有封装、继承、多态,甚至没有类;
在JS中没有类,所有的对象类型都是Object;
JS的对象是有属性也有方法的;
- let student={
- name:'Mike',
- age:20,
- height:180,
- weight:75,
- learn:function(){
- console.log("JavaScript");
- },
- leisure:function(){
- console.log("Entertainment");
- }
- };
- console.log(student.name);
- console.log(student.age);
- student.learn();
- student.leisure();
运行结果如下:
- let student = new Object();
- student.name="Mike";
- student.age=20;
- student.learn=function(){
- console.log("JavaScript");
- }
- student.leisure=function(){
- console.log("Entertainment");
- }
注:
(1)这种创建方式中的对象的属性、方法都不是提前约定好的,随时都可以新增属性或方法;
(2)其实还可以通过构造函数创建对象,但是并不常用;
(3)在JS的ES6版本中,引入了class关键字,JS也可以定义类,再通过类创建对象,更接近Java了;
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。