3.1语法
3.1.1区分大小写
ECMAScript中的一切(变量、函数名和操作符)都区分大小写。
3.1.2标识符
指变量、函数、属性的名字,或者函数的参数。
格式规则:
第一个字符必须是字母、下划线(_)、美元符号($);
其他字符可以是字母、下划线、美元符号或数字。
ECMAScript标识符采用驼峰大小写格式,第一个字母小写,剩下的每个有意义的单词的首字母大写。
不能把关键字、保留字、true、false和null用作标识符。
3.1.3注释
//单行注释
/*
*多行(块级)注释
*/
3.1.4严格模式
在脚本顶部添加如下代码:"use strict"。
3.1.5语句
ECMAScript中的语句以一个分号结尾;
用花括号将多条语句组合到一个代码块中;
始终在控制语句中使用代码块。
3.2关键字和保留字
ECMA-262描述了一组具有特定用途的关键字,可用于表示控制语句的开始或结束,或者用于执行特定操作等:
break do instanceof typeof case else new var catch finally return void continue for switch while debugger function this with default if throw delete in try
保留字,可能在将来被用作关键字:
abstract enum int short boolean export interface static byte extends long super char final native synchronized class float package throws const goto private transient debugger implements protected volatile double import public let yield
关键字和保留字不能用作标识符。
3.3变量
ECMAScrit的变量是松散类型的,可以用来保存任何类型的数据,每个变量仅仅是一个用于保存值得占位符而已。
定义变量:var(关键字) 变量名(标识符);
使用var操作定义的变量将成为定义该变量的作用域中的局部变量;
可以使用一条语句定义多个变量,用逗号分隔。
3.4数据类型
3.4.1typeof操作符
检测给定变量的数据类型。
3.4.2Undefined类型
使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。
对未初始化和未声明的变量执行typeof操作符都返回undefined值。
3.4.3Null类型
空对象指针。只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。
3.4.4Boolean类型
只有两个字面量:true和false;
调用转型函数Boolean(),将一个值转换为其对应的Boolean值。
3.4.5Number类型
1.浮点数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。
2.数值范围:5e-324~1.7976931348623157e+308;
用isFinite()函数确定一个数值是否有穷。
3.NaN:非数值,isNaN()函数确定参数是否“不是数值”。
4.数值转换:
Number()转型函数可用于任何数据类型;
parseInt()和parseFloat()专门用于把字符串转换成数值。
3.4.6String类型
由0个或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号("")或单引号(‘‘)表示。
1.字符字面量
2.字符串的特点
ECMAScript中的字符串是不可变的;
3.转换为字符串
toString()方法;null和undefined没有这个方法
转型函数String();能够将任意类型的值转换为字符串
要把某个值转换为字符串,可以使用加号操作符把它和一个字符串("")加在一起。
3.4.7Object类型
是一组数据和功能的集合;
var o = new Object ();
Object 具有下列属性和方法:
Constructor:保存着用于创建当前对象的函数;
hasOwnProperty(propertyName以字符串形式指定):检测给定的属性在当前对象实例中是否存在;
isPrototypeOf:检查传入的对象是否是另一对象的原型;
propertyIsEnumerable(propertyName):检查给定的属性是否能够使用for-in 语句来枚举;
toLocaleString():返回对象的字符串表示,与执行环境的地区对应;
toString():返回对象的字符串表示;
valueOf():返回对象的字符串、数值或布尔值表示;
3.5操作符:用于操作数据值
3.5.1一元操作符
只能操作一个值的操作符叫做一元操作符。
1.递增和递减操作符:
前置型:变量的值都是在语句被求值以前改变的;
后置型:递增递减操作是在包含它们的语句被求值之后才执行的;
遵循下列规则:
1、包含有效数字的字符串:先转化为数字值,再加减1;
2、不包含有效数字字符的字符串:值为NaN;
3、false:先转化为0再加减1;
4、true:先转化为1再加减1;
5、浮点数值,加减1;
6、对象:先调用valueOf()取得一个可供操作的值再对该值应用前述规则;如果结果是NaN,则在调用toString()后应用前述规则。对象变量变成数值变量。
2.一元加和减操作符
应用于非数值时会对这个值执行转换。
3.5.2位操作符
按内存中表示数值的位来操作数值。先将64位的值转化为32 位的整数,然后执行操作,最后再将结果转化回64位。
对有符号的整数,前31位表示整数的值,第32位表示数值符号(符号位):0表示正数,1表示负数。正数以纯二进制格式存储;负数采用二进制补码(先求数值绝对值的二进制,再求二进制反码,反码加1);
1、(~)按位非,返回数值的反码,本质是操作数的负值减1;
2、(&)按位与,将两个数值的每一位对齐,全1为1,有0为0;
3、按位或(|),有1为1,全0为0;
4、按位异或(^),相同为0,不同为1;
5、左移(<<),不影响符号位;
6、有符号的右移(>>),保留符号位,以符号位的值来填充;
7、无符号右移(>>>),以0填充;
3.5.3布尔操作符
1、逻辑非(!),可应用于ECMAScript中的任何值,首先将操作数转换为一个布尔值,然后求反。
2、逻辑与(&&),全true为true,有false为false,短路操作符,第一个为false则不会求第二个数的值;
在有一个操作数不是布尔值的情况下:
1、第一个操作数是对象,返回第二个操作数;
2、第二个数为对象,只有当第一个数为true才返回该对象;
3、两个数都是对象,返回第二个;
4、有null,则返回null;
5、有NaN,则返回NaN;
6、有undefined,则返回undefined;
3.逻辑或(||),有ture为true,全false为false,第一个数为true,则不会求第二个数的值;
有一个操作数不是布尔值:
1、第一个操作数是对象,返回第一个操作数;
2、第一个数为false,返回第二个数;
3、两个数都是对象,返回第一个;
4、有null,则返回null;
5、有NaN,则返回NaN;
6、有undefined,则返回undefined;
3.5.4乘性操作符
在操作数为非数值的情况下会执行自动的类型转换。
1、乘法(*)
特殊规则:
1、操作数都是数值,执行常规的乘法计算;
2、有NaN,则为NaN;
3、Infinity乘0,为NaN;
4、Infinity乘非0,为Infinity或-Infinity,取决于符号操作数的符号;
5、Infinity乘Infinity,为Infinity;
6、如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,再应用上面的规则。
2.除法(/)
特殊规则:
1、操作数都是数值,执行常规的除法计算;
2、有NaN,则为NaN;
3、Infinity被Infinity除,为NaN;
4、非零有限数被零除,为Infinity或-Infinity,取决于符号操作数的符号;
5、0除0,为NaN;
6、Infinity被任何非零数除,为Infinity或-Infinity,取决于符号操作数的符号;
7、如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,再应用上面的规则。
3.求模(%)
特殊规则:
1、操作数都是数值,执行常规的除法计算;
2、Infinity被Infinity除,为NaN;
3、Infinity被有限大的数值除,为NaN;
4、非零有限大数被零除,为NaN;
5、被除为0,为0;
6、有限大的数值被Infinity除,结果是被余数;
7、如果有一个操作数不是数值,则在后台调用Number()将其转换为数值,再应用上面的规则。
3.5.5加性操作符
1、加法
1、数值加数值,常规计算;
2、有NaN,为NaN;
3、Infinity加Infinity,为Infinity;
4、-Infinity加-Infinity,为-Infinity;
5、Infinity加-Infinity,为NaN;
6、+0加+0,为+0;
7、-0加-0,为-0;
8、+0加-0,为+0;
9、字符串加字符串,拼接;
10、字符串加非字符串,先将非字符串转换成为字符串再拼接;
2、减法
1、数值加数值,常规计算;
2、有NaN,为NaN;
3、Infinity减Infinity,为NaN;
4、-Infinity减-Infinity,为NaN;
5、Infinity减-Infinity,为Infinity;
6、+0减+0,为+0;
7、-0减-0,为+0;
8、+0减-0,为-0;
9、-Infinity减Infinity,为-Infinity;
10、如果有一个操作数是字符串、布尔值、null、undefined,先调用Number()函数将其转换为数值,再按前面规则计算;
11、如果有一个操作数是对象,先调用valueOf()函数取得表示该对象的数值,如果没有valueOf(),则调用toString()并将结果转化为数值,再按前面规则计算;
3.5.6关系操作符
< 、>、<=、>=
1、如果两个操作数都是数值,则执行数值比较;
2、两个字符串,则比较字符编码值,大写字母编码小于小写字母编码;
3、如果一个操作数时数值,则转化另一个数为数值再比较;
4、如果有一个操作数是对象,先调用valueOf()函数取得表示该对象的数值,如果没有valueOf(),则调用toString()并将结果转化为数值,再按前面规则计算;
5、如果一个数是布尔值,则先转换为数值在比较;
6、任何操作数与NaN比较结果都是false;
3.5.7相等操作符
1、相等(==)和不相等(!=)
先转换操作数(强制转型),然后比较它们的相等性;
转换规则:
1、布尔值转换为数值;
2、字符串和数值比较,字符串转换为数值;
3、有一个对象,先调用valueOf()再比较;
4、null和undefined相等;
5、NaN等于NaN;
6、两个对象比较是不是同一个对象;
2、全等(===)和不全等(!==)
比较之前不转换操作数;
全等表示两个操作数未经转换就相等的情况;
不全等表示两个操作数未经转换就不相等的情况;
3.5.8条件操作符
variable = boolean_expression ? true_value : false_value;
3.5.9赋值操作符(=)
把右边的值赋给左侧的变量;
复合赋值操作符:*=、/=、%=、+=、—=、<<=、>>=、>>>=。
3.5.10逗号操作符
可以在一个语句中执行多个操作,多用于声明多个变量,还可以用于赋值,返回表达式中最后一项;
3.6语句
ECMA-262规定了一组语句,也称为流控制语句。语句定义了ECMAScript的主要语法,通常使用一个或多个关键字来完成给定任务。
3.6.1if语句
始终使用代码快(以一对花括号括起来的多行代码)
if (contidion1){
statement1
}else if (condition2){
statement2
}else {
statement3
}
3.6.2do-while语句
对条件表达式求值前,循环体内的代码至少会被执行一次。
do {
statement
} while (expression)
3.6.3while语句
在循环体内代码被执行之前,就会对出口条件求值。
while (expression) {
statement
}
3.6.4for语句
前置测试循环语句。
for (initialization; expression; post-loop-expression可选) {
statement
}
3.6.5for-in语句
是精准的迭代语句,可以用来枚举对象的属性。
for (property in expression) {
statement
}
3.6.6label语句
在代码中添加标签以便将来使用,一般与for语句等循环语句配合使用。
label : statement
3.6.7break和continue语句
用于在循环中精确的控制代码的执行;break 语句会立即退出循环,强制继续执行循环后面的语句;continue语句立即退出循环,然后从循环的顶部继续执行。
3.6.8with语句
作用是将代码的作用域设置到一个特定的对象中。
with (expression) {
statement
}
3.6.9switch语句
switch (expression) {
case value :statement
break ;
…
default:statement
}
3.7函数
function functionName (arg1,arg 2,…Arg n) {
statements
}
3.7.1理解参数
命名的参数只提供便利,但不是必须的。
无需制定函数的返回值,因为任何ECMAScript函数都可以在任何时候返回任何值;未指定返回值的函数返回的是一个特殊的undefined 值。
ECMAScript 中没有函数签名的概念,因为其函数参数是以一个包含零或多个值的数组形式传递。
可以向ECMAScript函数传递任意数量的参数,并通过argument对象来访问这些参数。
3.7.2没有重载
由于不存在函数签名特性,函数不能重载。