介绍
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 | <head> |
1 |
|
1 | if( 1 > 0 ){ |
一般规范: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 | var person = { |
通过以下格式获取对象的属性:
1 | person.name;// Bob |
作用域
传统的编程语言,作用域一般是块级,也就是一个{}
内是一个作用域,所以在if else while for
的范围内定义的局部变量不会影响到外面.而JavaScript的作用域是函数级,一个function
为一个作用域,在函数内部定义的变量,不受函数内部语法块的影响.
1 | var x = 1; // 1 |
如果一定要实现块作用域的话,便需要插入函数来起到划分的作用
1 | var x = 1; //1 |
函数作用域提升
函数声明分为:声明式 和 变量式
声明式会自动将声明放在函数最前面,并执行赋值的内容.
1 | function name(){ |
所以下面的函数没有问题
1 | test("test"); |
变量式会将声明提升到函数最前,而后再赋值
1 | var name = funciton(){ |
所以下面的代码中,函数被声明之后,还没有赋值,便被执行,会报错.
1 | baz("baz"); //baz is not a function |
需要注意的是,变量式声明中的函数,是不会被提升作用域的
1 | var baz = function spam(arg){ |
使用var声明的变量或者函数,要放到其作用域的顶端.