ECMAScript借鉴了C系语言的语法。一切(变量、函数名和操作符)都区分大小写。
标识符就是指变量、函数、属性的名字,或者函数的参数。标识符的格式规则如下:
标识符中的字母也包含扩展的ASCII或Unicode字母字符(但是不推荐这么做)。按照惯例,ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每一个有意义的单词首字母大写。
ECMAScript中的语句以一个分号结尾;如果省略分号,则由解析器确定语句的结尾。
var sum = a + b; // 推荐
var diff = a - b // 不推荐
if (test)
alert(test); //有效 容易出错不推荐使用
if (test){ //推荐
alert(test);
}
ECMAScript使用C风格的注释,包括单行注释和块级注释。
// 单行注释以两个斜杠开头
/* 块级注释以一个斜杠和一个星号开头,以一个星号和斜杠结尾
* 这个星号
* 和这个星号不是必需。
*/
ECMAScript5引入了严格模式(strict mode),定义了一种不同的解析与执行模型。使ECMAScript3中的一些不确定的行为得到处理,而且对某些不安全的操作抛出错误。
// 在整个脚本中启用严格模式,需要在顶部添加“use strict”编译指示(pragma)
"use strict"
// 在函数内部的第一行添加“use strict”编译指示(pragma),指定该函数在严格模式下执行
function doSomething(){
"use strict"
// 函数体
}
IE10+,Firefox4+,Safari5.1+,Opera12+和Chrome支持严格模式。
关键字用于表示控制语句的开始或结束、或者用于执行特定操作等。保留字未来有可能被用作关键字。
带*号的是第5版中新增的关键字 | ||||
break | case | catch | continue | debugger* |
default | delete | do | else | finally |
for | function | if | in | instanceof |
new | return | switch | this | throw |
try | typeof | var | void | while |
with |
abstract | boolean | type | char | class |
const | debugger | double | enum | export |
extends | final | float | goto | implements |
import | int | interface | long | native |
package | private | protected | public | short |
static | super | synchronized | throws | transient |
volatile |
class | const | enum | export | extends |
import | super |
带*号的是第5版中新增的保留字 | ||||
implements | interface | let* | package | private |
protected | public | static | yield* |
数据类型 | 转化为true值 | 转化为false值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零数字 | 0和NaN |
Object | 任何对象 | null |
Undefined | **不适用** | undefined |
Number类型使用IEEE754格式来表示整数和浮点数值。整数可以使用十进制、八进制(字面量第一位必须是0,严格模式下无效)和十六进制(字面量前两位必须是0x)。浮点数可以使用普通的表示法和科学计数法。
特殊值 | 说明 |
---|---|
Number.MIN_VALUE | 最小数值,5e-324 |
------------------ | ------------------ |
Number.MAX_VALUE | 最大数值,1.7976931348623157e+308 |
------------------ | ------------------ |
-Infinity 或 Number. NEGATIVE_INFINITY |
负无穷。isFinite()函数判断参数值是不是有穷值 |
------------------ | ------------------ |
Infinity 或Number. POSITIVE_INFINITY |
正无穷。isFinite()函数判断参数值是不是有穷值 |
------------------ | ------------------ |
NaN | 特殊数值,0除以0都会返回NaN |
用isNaN() 验证是否是 NaN
一元加操作符和Number()函数相同;也可以使用parseInt()和parseFloat()函数对字符串进行转换。
用于解析一个字符串,并返回一个整数。parseInt()函数侧重字符串是否符合数值模式,会忽略字符串前面的空格,直到找到第一个非空格字符。
用于解析一个字符串,并返回一个浮点数。
String类型用于表示由0或多个16位Unicode字符组成的字符序列,即字符串,由双引号或单引号表示(两种方法等价)。字符串的值是不可变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再创建一个新值的字符串填充该变量。
字面量 | 说明 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 换页 |
\\ | 反斜杠 |
\' | 单引号,在用单引号表示的字符串中必须使用 |
\" | 双引号,在用双引号表示的字符串中必须使用 |
\xnn | 以16进制代码nn表示的一个字符。例如,\x41表示“A” |
\unnnn | 以16进制代码nnnn表示的一个Unicode字符 |
转义序列用于表示非打印字符或具有其他用途的字符 字符串的length属性表示字符串中16位字符的数目。如果字符串中包含双字节字符,那么可能不会返回精确值。
对象其实就是一组数据和功能的集合。Object类型是所有它的实例的基础。每个对象都有下列方法和属性:
只能操作一个值的操作符叫做一元操作符
var s1 = “01”,s2 = “1.1”, s3 = “z”,b = false ,f = 1.1;
var o = {
valueOf: function() {
return -1;
}
};
s1 = -s1; //value becomes numeric -1
s2 = -s2; //value becomes numeric -1.1
s3 = -s3; //value becomes NaN
b = -b; //value becomes numeric 0
f = -f; //change to -1.1
o = -o; //value becomes numeric 1
布尔操作符用来测试两个值的关系。布尔操作符一共有3个:非(NOT)!、与(AND)&&和或(OR)||。
逻辑与由(&&)表示,真值表如下:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | false |
false | true | false |
false | false | false |
逻辑或由(||)表示,真值表如下:
第一个操作数 | 第二个操作数 | 结果 |
---|---|---|
true | true | true |
true | false | true |
false | true | true |
false | false | false |
逻辑与与逻辑或操作均属于短路操作,即如果第一个操作数能够决定结果,那么就不会对第二个操作数求值。在有一个操作数不是布尔值的情况下,逻辑与和逻辑或操作不一定返回布尔值。
ECMAScript定义了3个乘性操作符:乘法*,除法/和求模%。在操作数为非数值的情况下会使用Number()将其转换为数值。
小于(<)、大于(>)、小于等于(<=)和大于等于(>=)用于对两个值进行比较,并返回一个布尔值。
ECMAScript提供两组相等操作符:相等==和不相等!=——先转换再比较;全等===和不全等!==(仅比较而不转换)。
三元操作符(三目运算):boolean_expression ? true_value : false_value;
把右侧的值赋值给左侧的变量,包括等于号=,和复合赋值操作符:*=、/=、%=、+=、-=、<<=、>>=、>>>=
逗号操作符可以在一条语句中执行多个操作,逗号表达式的值是最后一项的值。
if(condition){
statement1;
}
else{
statement2;
}
condition可以是任意表达式,ECMAScript会自动调用Boolean()将结果转换为一个布尔值。
do{
statement;
}while(condition);
do-while是一种后测试循环语句,只有在循环体内的代码执行后,才会测试出口条件。
while(condition){
statement;
}
while是一种前测试循环语句,在循环体内的代码执行前,测试出口条件求值。
for(initialization; condition; post-loop-expression){
statement;
}
for(property in expression){
statement;
}
ECMAScript对象的属性没有顺序。如果迭代的对象为undefined或null,则for-in语句会报错,ECMAScript5更正了这种行为,对这种情况不再抛出错误,而只是不执行循环体。
Safari 3 以前的版本 for-in语句中存在一个bug,该bug回到只某些属性被返回两次
label: statement
使用label语句可以在代码中添加标签,一般配合for等循环语句中break和continue使用。
break和continue语句用于在循环中精确的控制代码的执行。其中,break语句会立即退出循环,强制继续执行循环后面的语句;而continue语句虽然也是立即退出循环,但退出循环后会从循环的顶部继续执行。break和continue配合label使用,会退出label标识处的循环。
with语句的作用是将代码的作用域设定到一个特定的对象中。严格模式下不允许使用with语句,否则将视为语法错误。
switch(expression){
case value1:statement;
break;
case value2:statement;
break;
case value3:statement;
break;
default:statement;
}
switch语句在比较值时使用的是全等操作符,不会发生类型转换。
通过函数可以封装多条语句,而且可以在任何地方、任何时候调用指定。ECMAScript使用function关键字来声明函数,后跟一组参数以及函数体。
function name(arg0, arg1, ..., argN){
statement;
return value;
}
严格模式对函数有一些限制:
ECMASript函数不介意传递进来多少个参数,也不在乎参数类型。在函数体内可以通过arguments对象来访问这个参数数组,aguments的值永远与对应的命名参数保持同步,但这种影响是单向的,即修改arguments中的值,相应的命名参数值会发生改变,反之却不成立。但严格模式下,不存在这种关系,改变arguments的值会导致语法错误。
ECMAScript函数没有签名,其参数是由包含0个或多个值的数组来表示,所以也不能实现传统意义上那样的重载。