JavaScript使用的是ECMA(European Computer Manufacturers Association)的ECMAScript标准,也就是人们常说的ES6,ES7,ES8.而JavaScript本身是网景公司(Netscape)对ES标准的一种实现,JavaScript是该公司的注册商标.(这也是前阵子苹果下架了所有名称里带JavaScript的app的原因)
JavaScript 是Brendan Eich用两周写出来的一种语言.所以有点设计缺陷也可以理解,比如
typeof null == "object"
由于浏览器确定了使用的JavaScript版本,所以写JavaScript程序时,要注意ES版本与浏览器的支持是否匹配.
基本
写在哪里
JavaScript的代码可以直接写在网页html里,也可以单独写在js文件中.
html里的JavaScript代码要写在 <scrpt>
标签内,标签的 type
属性不需要定义:1
2
3
4
5
6
7
8
9<head>
<script>
alert('Hello, World!');
</script>:
</head>
<body>
...
</body>
</html>
我们也可以把alert('Hello, World!')
单独写在一个js文件中,取个名字hello.js
,然后把js文件的引用写入html的head中(其实写在body里也能跑)1
2
3
4
5
6
7
8<html>
<head>
<script src="hello.js"></script>
</head>
<body>
...
</body>
</html>
简单语法
JavaScript每个语句以;
结束,JavaScript的引擎会自动添加,所以这里并不强制要求,不过因为自动添加的;
有时会造成歧义,所以手动添加还是最保险的.
赋值语句1
var x = 1;
条件判断1
2
3if( 1 > 0 ){
x = 1;
}
一般规范:4空格缩进,80字换行
另外跟Java一样,JavaScript的注释写法也是//
和/* */
,JavaScript也对大小写敏感.
变量
- JavaScript是动态语言,变量的声明使用var,赋值使用=.
- 使用var声明的变量其作用域都在函数内,而不使用var声明的变量则是全局变量.
- 变量名要求由大小写英文,数字,
$
和_
组成,不可以用数字开头,也不可以使用JavaScript的关键字作为变量名.
数据类型
基本型
JavaScript有五种基本类型:
- number
- string
- boolean
- undefined
- null
1 | typeof 1;//"number" |
数字型 Number
JavaScript中数字型不区分整数和浮点数,正、负、整数、浮点数、NaN、Infinity都是Number型,可直接进行运算.
NaN: Not a Number
Infinity: ∞ 无穷大
字符串
JavaScript中字符串可以用双引号"
,也可以用单引号'
来表示.
布尔型
JavaScript中的布尔型由true和false构成,以及 与,或,取反的运算都与Java相同.
JavaScript中进行比较的时候,如果使用
==
,会自动转换类型再进行比较,不转换类型的比较则需使用三个等号===
.NaN与所有Number都不相等,包括它自己,判断NaN的时候只能使用
isNaN()
.
1
2
3
4 isNaN(NaN) //true
>// function isNaN(a){
>// return a != a;
>// }JavaScript的浮点数在运算时会产生误差,直接进行比较会出现错误结果.这点在Java中也是一样,所以要进行精确比较的时候,不应该使用浮点型.
可以通过检测误差绝对值来进行比较:
1 Math.abs(1/3 - (1 - 2/3)) < 0.000001; \\true
空值和未定义
JavaScript中类似于Java,也通过null来表示空值,空值与长度为零的字符串不同.JavScript同时还定义了一个表示未定义的常量undefined.一般在检测参数时可以用到,未输入的参数会被当做undefined处理.
引用类型
数组 Array
JavaScript通过[]
来表示数组,使用,
来分隔元素.也可以用new Array(1,2,3);
来定义数组.数组中的元素可以是任意的数据类型,通过索引arr[index]
来访问.
对象 Object
JavaScript的对象是由成对的key-value组成的无序集合.key都是字符串,value可以是任意数据类型.1
2
3
4
5
6
7var person = {
name: 'Bob',
age: 23,
tags: ['person', 'young'],
married: false,
code: null
}
通过以下格式获取对象的属性:1
2person.name;// Bob
person.age; // 23
作用域
传统的编程语言,作用域一般是块级,也就是一个{}
内是一个作用域,所以在if else while for
的范围内定义的局部变量不会影响到外面.而JavaScript的作用域是函数级,一个function
为一个作用域,在函数内部定义的变量,不受函数内部语法块的影响.1
2
3
4
5var x = 1; // 1
if(true){
var x = 2; //2
}
condole.log(x); //2
如果一定要实现块作用域的话,便需要插入函数来起到划分的作用1
2
3
4
5
6
7var x = 1; //1
if(true){
function print(){
var x = 2;//2
}
}
console.log(x);//1
函数作用域提升
函数声明分为:声明式 和 变量式
声明式会自动将声明放在函数最前面,并执行赋值的内容.1
2
3function name(){
}
所以下面的函数没有问题1
2
3
4test("test");
function test(arg){
console.log(arg); //test
}
变量式会将声明提升到函数最前,而后再赋值1
2
3var name = funciton(){
}
所以下面的代码中,函数被声明之后,还没有赋值,便被执行,会报错.1
2
3
4baz("baz"); //baz is not a function
var baz = function(arg){
console.log(arg);
};
需要注意的是,变量式声明中的函数,是不会被提升作用域的1
2
3
4
5
6
7
8
9var baz = function spam(arg){
if(arg < 5){
spam(arg + 1);//只在函数的作用域内有效
}else{
console.log(arg);
}
};
baz(1); //5
spam(1);//spam is not defined
使用var声明的变量或者函数,要放到其作用域的顶端.