- ECMAScript中的一切(变量,函数名和操作符)都是区分大小写的。
- 标识符是指变量,函数或属性的名字,或函数的参数。命名规则是:
- 第一个字符必须是字母,下划线(_)或美元符号($)
- 其他字符可以是字母,下划线,美元符号或数字
- 推荐使用驼峰大小写格式命名,即第一个单词字母小写,后面的每个单词首字母大写。如:myCar
- 严格模式,即"use strict"
- 在函数中使用var声明的变量为局部变量,当这个函数退出后,这个变量就会被销毁。
- 基本数据类型:undefined,null,boolean,number,string
- 复杂类型:object
- 使用typeof可以检测出变量的数据类型
- undefined --- 值undefined
- boolean --- 值是布尔值
- string --- 值是字符串
- number --- 值是数值
- object --- 值是对象或null(null值被认为是一个空的对象引用)
- function --- 值是函数
- undefined值是指有声明变量但未对其进行初始化时,这个变量的值就是undefined值。但对于未初始化的变量和未定义的变量进行typeof操作符时都会返回undefined。
- null值:如果定义的变量准备在将来用作保存对象,那么这个变量的值最好保存为Null值。这样直接检测Null值就可以知道相应的变量是否已经保存了一个对象的引用。
- undefined值派生于null值--->
console.log(undefined == null);//ture
- 只要意在保存对象的变量还没真正保存对象,就应该明确的让这个变量保存为null值
- undefined值派生于null值--->
- Boolean值:
true不一定等同于1,false不一定等同于0
true和false是区分大小写的。就是说Ture和False(以及其他混合大小写)都不是boolean值,只是标识符
-
所有类型的值都有与这两个Boolean值等价的值。可以调用转型函数Boolean(),可以对任何类型的值使用这个。
Boolean true false string 任何非空字符串 "" number 任何非零数值(包括无穷大) 0和NAN object 任何对象 Null undefined 不适用 undefined
- number值:
- 八进制字面值的第一位必须是0,然后是八进制数字序列(0-7).如果字面值中的数值超出了范围,那么前导0将会被忽略,后面的值被当成十进制数值解析。
- 十六进制字面值的前两位必须是0x,后面跟任何十六位进制数字(0-9以及a-f)。字母大小写都可。
- 浮点数值的最高精度是17位小数。浮点数字在某些情况下会自动转换为整数值,是为了节省内存空间。
- NaN值:
- 任何数值出一非数值会返回NaN,但并不会影响代码执行。
- NaN与任何值都不相等,包括和它自己都不相等
- isNaN()接受任何类型的参数,会告诉我们这个值是不是数值
- 数值转换
- Number()方法
- Boolean值,true和false值分别转换为1和0
- null值返回0
- undefined值返回NaN
- 如果是字符串,则有以下规则:
- 如果只包含数字(包括前面带正负号),则可以将其转换为十进制数值,而“001”则会变成11
- 包含有效的浮点格式,如“1.1”则会将其转换成对应的浮点数值(会忽略前导0)
- 包含有效的十六进制格式,如“0xff”,则会将其转换为相同大小的十进制整数值
- 字符串是空的,则会转换为0
- 包含有除上述以外的字符,则都转换为NaN
- parseInt()方法
- 会忽略字符串前面的空格,直至找到第一个非空字符。
- 如果第一个字符不是数字字符或者负号,就会返回NaN。
- 对空字符串也会返回NaN。
- 如果第一个字符是数字字符,那么会继续解析,直到解析完所有后续字符或遇到了一个非数字字符。
- 如果第一个字符是数字字符,那么它能识别出各种整数格式(十进制,八进制,十六进制)
- 还可以提供第二个参数,即转换时使用的基数(即多少进制)。当使用了第二个参数后,就可以不用带有0x或0了。
- parseFloat()方法
- 只解析十进制,所以没有第二个参数。
- 从第一个字符开始解析,一直解析到字符串末尾或者遇见一个无效的浮点数字字符。
- 始终会忽略前导0,就是说十六进制格式的字符串始终会被转换成0。
- String类型
- 了解几个常用的字符字面量
- \n 换行
- \t 制表
- \b 退格
- \r 回车
- \\ 斜杠
- \' 单引号
- \" 双引号
- 任何字符串的长度都可以通过访问其length属性来取得。
- 字符串是不可变的。一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先会销毁原来的字符串,再用另一个包含新值的字符串来填充该变量。
- 转换为字符串的两种方式
- toString()
- 数值,布尔值,对象和字符串值都有这个方法
- null和undefined值没有这个方法
- 多数情况下可以不传递参数。但当调用数值的toString()方法时,可以传递一个参数:输出数值的基数。
- String()
- 可以将任何类型的值转换为字符串。
- 如果值有toString方法,则调用该方法(没有参数)并返回相应的结果。
- 如果值是null,则返回"null"。
- 如果值是undefined,则返回"undefined"。
- toString()
- Object类型
- Object类型所具有的任何属性和方法同样存在于更具体的对象中。就是说Object的每个实例都具有以下方法和属性:
- constructor:保存着用于创建当前对象的函数
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。作为参数的属性名必须以字符串形式指定。
- isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型。
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能用for-in语句来枚举。作为参数的属性名必须以字符串形式指定。
- toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString():返回对象的字符串表示。
- valueOf():返回对象的字符串,数值或布尔值表示。
- Object类型所具有的任何属性和方法同样存在于更具体的对象中。就是说Object的每个实例都具有以下方法和属性:
- 操作符
-
一元操作符
- 递增和递减操作符
- ++a;--a; 前置递增,前置递减。执行时,变量的值都是在语句被求值之前改变的。
- a++;a--; 后置递增,后置递减。执行时,变量的值都是在语句被求值之后改变的。
- 这四个操作符对任何值都适用。就是说还可用于字符串,布尔值,浮点数值和对象。但有不同的规则:
- 在应用于一个包含有效数字字符的字符串时,会先将其转换为数字值,再执行加减1的操作。字符串变量变成数值变量。
- 在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN,字符串变量变成数值变量。
- 在应用于布尔值false和true时,分别将其转换为0和1再进行操作。布尔值变成数值变量。
- 在应用于浮点数值时,直接执行加减1的操作。
- 在应用于对象时,先调用对象的valueOf()方法,取得一个可以操作的值,然后对该值应用前述规则。如果结果是NaN,那么再调用toString()方法后再应用前述规则。对象变量变成数值变量。
- 一元加减操作符(+ -)
- +号放在数值前无影响。但放在非数值前,转换方法形同Number()。
- -号放在数值之前会变为负数。放在非数值之前,同上。
- 递增和递减操作符
-
位操作符
- ECMAScript中所有数值都是以IEEE-754 64位格式来存储。但位操作符不直接操作64位的值,而是先将64位的值转换为32位的整数,再执行操作,最后再转换回64位。
- 默认情况下,ECMAScript中的所有整数都是有符号整数。
- 对于有符号整数,32位中的前31位用来表示整数的值。第32位用来表示数值的符号:0表示正数,1表示负数。表示符号的叫做符号位。
- 正数用纯二级制格式存储。负数同样以二级制码存储,但使用的格式是二进制补码。
- 求一个二进制补码的步骤:
- 求这个数值绝对值的二进制码(如要求-18的二级制补码,先求18的二级制码)。
- 求二进制反码,即将1替换为0,将0替换为1。
- 将得到的二进制反码加1
- 对于NaN和Infinity值都将会被当成0处理
- 对于非数值应用位操作符,会自动调用Number()方法将该值转换为数值再进行计算。
- 非(NOT ~):返回数值的反码。本质是操作数的负值减一。
- 与(AND &):将两个数值的每一位对齐,然后对相同位置上的数值执行以下操作:只在两个数值的对应位都是1才返回1。任何一位是0,结果都是0。
第一个数值的位 第二个数值的位 结果 1 1 1 1 0 0 0 0 0 0 1 0 - 或(OR |):将两个数值的每一位对齐,然后对相同位置上的数值执行以下操作:在有一位是1的,结果就为1。只有在两个都是0的情况下结果才是0。
第一个数值的位 第二个数值的位 结果 1 1 1 1 0 1 0 1 1 0 0 0 - 异或(XOR ^):将两个数值的每一位对齐,然后对相同位置上的数值执行以下操作:在两个数值对应位上只有一个1时才返回1。如果对应位两个都是1或0,则返回0。
第一个数值的位 第二个数值的位 结果 1 1 0 1 0 1 0 1 1 0 0 0 - 左移(<<):将数值的所有位向左移动指定的位数。
- 左移操作会以0来填补这些空位,以便结果是一个完整的32位二进制数。如将数值2(二进制10)左移5位得到64(二进制1000000)。
- 左移不会影响操作数的符号位。如将-2左移5位得到-64。
- 有符号的右移(>>):将数值向右移动,但保留符号位(即正负号)。在位移过程中,原数值出现空位是用符号位的值来填充。
- 无符号的右移(>>>):将数值的所有32位都向右移动。在位移的过程中,原数值出现空位是用0来填充空位。
-
布尔操作符
-
逻辑非(!):可应用于任何值。使用这个操作符都会返回一个相反的布尔值。转换规则如下:
- 对象-->false
- 空字符串-->true
- 非空字符串-->false
- 数值0-->true
- 任意非0数值(包含Infinity)-->false
- null-->true
- undefined-->true
- 可同时使用两个该操作符,其作用类似于Boolean()
-
逻辑与(&&):可应用于任何类型的操作数。
- 如果两个值都是布尔值,那么会返回布尔值。真值表如下:
第一个操作数 第二个操作数 结果 true true true false false false true false false false true false - 如果有一个操作数不是布尔值,那么就不一定会返回布尔值。规则如下:
- 第一个操作数是对象,则返回第二个操作数。
- 第二个操作数是对象,则只有在第一个操作数的求值结果为true时才会返回该对象。
- 两个操作数都是对象,则返回第二个操作数。
- 第一个操作数是null,则返回null。
- 第一个操作数是undefined,则返回undefined。
- 第一个操作数是NaN,则返回NaN。
- 可以看出,这是类似于一个短路操作。即第一个操作数是false,那么无论第二个操作数是什么值,结果都只为false。就是说,只要第一个操作数能决定结果,就不会再对第二个操作数进行求值。
-
逻辑或(||):可应用于任何类型的操作数。
- 如果两个值都是布尔值,那么会返回布尔值。真值表如下:
第一个操作数 第二个操作数 结果 true true true false false false true false true false true true - 如果有一个操作数不是布尔值,那么就不一定会返回布尔值。规则如下:
- 第一个操作数是对象,则返回第一个操作数。
- 第一个操作数的求值结果为false,则返回第二个操作数。
- 两个操作数都是对象,则返回第一个操作数。
- 两个操作数都是null,则返回null。
- 两个操作数都是undefined,则返回undefined。
- 两个操作数都是NaN,则返回NaN。
- 可以看出,这是类似于一个短路操作。即第一个操作数是true,那么无论第二个操作数是什么值,结果都只为true。就是说,只要第一个操作数能决定结果,就不会再对第二个操作数进行求值。
-
-
乘性操作符
- 乘法(*):计算两个数的乘积。在处理特殊值的情况下,会遵循以下规则:
- 操作数都是数值,则按照常规的乘法计算。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity。
- 有一个操作数是NaN,则返回NaN。
- Infinity与0相乘,结果是NaN。
- Infinity与非0数值相乘,结果是Infinity或-Infinity,取决于操作数的符号。
- Infinity与Infinity相乘,结果还是Infinity。
- 有一个操作数不是数值,则会自动调用Number()方法转换为数值,再应用上面的方法进行计算。
- 除法(/):计算两个数值的除法。在处理特殊值的情况下,会遵循以下规则:
- 操作数都是数值,则按照常规的除法计算。如果乘积超过了ECMAScript数值的表示范围,则返回Infinity或-Infinity。
- 有一个操作数是NaN,则返回NaN.
- Infinity被Infinity除,则结果是NaN。
- 0被0除,结果还是NaN。
- 非零的有限数被零除,则结果是Infinity或-Infinity。取决于操作数的符号。
- Infinity被任何非零数值除,则结果是Infinity或-Infinity。取决于操作数的符号。
- 有一个操作数不是数值,则会自动调用Number()方法转换为数值,再应用上面的方法进行计算。
- 求模(%):计算余数。在处理特殊值的情况下,会遵循以下规则:
- 被除数是无穷大值而除数是有限大的数值,则结果是NaN。
- 被除数是有限大的数值而除数是0,则结果是NaN。
- Infinity被Infinity除,结果是NaN。
- 被除数是有限大的数值而除数是无限大值,则结果是被除数。
- 被除数是0,则结果是0。
- 有一个操作数不是数值,则会自动调用Number()方法转换为数值,再应用上面的方法进行计算。
- 乘法(*):计算两个数的乘积。在处理特殊值的情况下,会遵循以下规则:
-
加性操作符
- 加法(+):
- 两个操作数都是数值,则常规计算。然后根据以下规则返回结果:
- 有一个操作数是NaN,则结果是NaN。
- Infinity加Infinity,结果是Infinity。
- Infinity加-Infinity,结果是NaN。
- -Infinity加-Infinity,结果是-Infinity。
- +0加+0,结果是+0。
- +0加-0,结果是+0。
- -0加-0,结果是-0。
- 有一个操作数是字符串,则有以下规则:
- 两个操作数都是字符串,则将第二个操作数与第一个操作数拼接起来。
- 如果只有一个操作数是字符串,则将另一个操作数也转换为字符串,再进行拼接。
- 有一个操作数是对象,数值或布尔值,则调用他们的toString()方法取得相应的字符串值,然后再应用前面关于字符串的规则。
- 对于undefined和null,则调用String()函数并取得字符串"undefined"和"null",再应用前面关于字符串的规则。
- 两个操作数都是数值,则常规计算。然后根据以下规则返回结果:
- 减法(-):
- 有一个操作数是NaN,则结果是NaN。
- Infinity减Infinity,结果是NaN。
- -Infinity减-Infinity,结果是NaN。
- Infinity减-Infinity,结果是Infinity。
- -Infinity减Infinity。结果是-Infinity。
- +0减+0,结果是+0。
- -0减+0,结果是-0。
- -0减-0,结果是-0。
- 有一个操作数是字符串,布尔值,null或undefined,则自动调用Number()将其转换为数值,再根据前面的规则执行减法计算。如果转换结果是NaN,则结果就是NaN。
- 有一个操作符是对象,则调用对象地valueOf()方法取得该对象地数值。如果得到的值是NaN,则结果就是NaN。如果没有valueOf()方法,则调用其toString()方法将得到的字符串转换为数值进行计算。
- 加法(+):
-
关系操作符
- 两个操作数都是字符串,则比较两个字符串对应地字符编码值。
- 一个操作数是数值,则将另一个操作数也转换为数值进行比较。
- 一个操作数是对象,则先调用valueOf将得到的结果按照前面地规则进行比较。如果没有valueOf再调用toString,将得到的结果按照前面地规则进行比较。
- 一个操作数是布尔值,先将其转换为数值再进行比较。
- 任何操作数与NaN进行比较是结果都是false。
-
相等操作符
- 相等和不相等(== 和 !=):进行比较时都会先转换操作数。
- 转换规则如下:
- 有一个操作数是布尔值,则先将false转换为0,true转换为1,再进行比较。
- 一个操作数是字符串,另一个是数值,则先将字符串转换为数值再进行比较。
- 一个操作数是对象,则先调用valueOf(),没有再调用toString()方法,将得到的基本类型值按照前面的规则进行比较。
- 比较规则如下:
- null和undefined相等。
- 要比较相等性之前,不能将null和undefined转换成其他任何值
- 有一个操作数是NaN,则相等操作符返回true,不相等操作符返回false。
- 两个操作数都是对象,则比较他们是不是同一个对象。
- 转换规则如下:
- 全等和不全等(=== 和 !==):进行比较时不会转换操作数。
- 只在不转换操作数就相等的情况下才返回true。
- null===undefined返回false。
- 相等和不相等(== 和 !=):进行比较时都会先转换操作数。
条件操作符(Boolean_expression?value1:value2):问号前面的Boolean_expression为真,则取value1;为假则取第二个值。
赋值操作符:+=,-=,*=,/=,%=,<<=,>>=,>>>=
逗号操作符(,):可以在一条语句中执行多个操作。比如声明语句,可同时声明多个。
-
- 语句
- if语句
//condition为真,执行statement1;为假,执行statement2 if(condition){ statement1 }else { statement2 }
- do-while语句:在对条件表达式求值之前,循环体内的代码至少会执行一次。
do{ statement }while(expression)
- while语句:在循环体内的代码被执行之前,就会对出口条件求值。为真才会执行循环内的代码。
while (expression){ statement }
- for语句:当expression为真的时候就会执行statement
for (initialization; expression ; post-loop-expression) { statement }
- for-in语句:用来枚举对象的属性。但输出的属性名顺序是不确定的。
for(property in expression){ statement }
- label语句:在代码中添加标签,以便break和continue语句引用。
- break语句:直接跳出本层循环,不再执行。
- continue语句:直接跳出本次循环,回到顶部循环继续执行。
- switch语句:
/* 每一种情形的含义:如果expression等于value这个值,那么就会执行后面的 语句(statement)。而break关键字会导致代码执行跳出switch语句。如果省略了 break,就会继续执行下一个case语句。最后的default关键字则是用在表达式都不 匹配当前任何value值,再执行该代码。 */ switch (expression){ case value:statement break; default: break; }
- switch语句中可以使用任何数据类型,无论是字符串还是对象都行。
- 每一个case的值不一定是常量,还可以是变量,甚至是表达式。
- switch语句在比较值时使用的是全等操作符。即不会发生类型转换。
- case中的值为表达式时会进行类型转换操作。
- 函数
function functionName(arg01,arg02,...argN){ statements }
- 函数中return可以返回一个值,也可以不带返回值。
- 函数中return后的代码都不会被执行。
- 函数中return可以有多个。
- 执行函数要用函数名后面加上()和参数(如果有)。
- 函数没有重载,即相同函数名的调用下,只有后定义的函数可以使用。
- 参数
- ECMAScript中的参数在内部是用一个数组来表示的。
- 没有传递值的命名参数将自动被赋值为undefined。
- 函数中的参数可以通过argument来获取。
- 通过访问argument.length来获知有多少参数传入。
- argument对象的长度是由传入的参数个数决定的,而不是由定义函数时的命名参数的个数决定的。
- argument对象的值永远与对应命名参数的值保持同步。