1 语法
1.1 辨别大小写
ECMAScript中的统统(变量、函数名和操纵符)都辨别大小写。
1.2 严厉情势
ECMAScript 5 引入了严厉情势(strict mode)的观点。严厉情势是为JavaScript定义了一种差别的剖析与实行模子。
在严厉情势下,ECMAScript 3 中的一些不肯定的行动将获得处置惩罚,而且对某些不安全的操纵也会抛出毛病。
要在悉数剧本中启用严厉情势,可以再顶部增添以下代码:
"use strict"
指定函数在严厉情势下实行:
function doSomething(){
"use strict";
//函数体
}
2 关键字和保留字
关键字
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
保留字
ECMA-262 第五版非严厉情势:class、enum、extends、super、const、export、import
ECMA-262 第五版严厉情势增添以下限定:implements、package、public、interface、private、static、let、protected、yield
3 变量
ECMAScript的变量是松懈范例的,所谓松懈范例就是可以用来保留任何范例的数据。换句话说,每一个变量仅仅是一个用于保留值得占位符罢了。
var message;
像如许未经由初始化的变量,会保留一个特别的值——undefined
给未经声明的变量赋值在严厉情势下会致使抛出PeferenceError毛病
4 数据范例
ES 5
5种简朴数据范例(也称为基本数据范例):Undefined、Null、Boolean、Number、String
1种庞杂数据范例——Object,Object本质上是由一组无序的名值对构成的。
ES 6 新增一种数据范例——标记对象(Symbol)
4.1 typeof 操纵符
typeof 用来检测给定变量的数据范例
“undefined”——假如这个值未定义
“boolean”——假如这个值是布尔值
“string”——假如这个值是字符串
“number”——假如这个值是数值
“object”——假如这个值是对象或null
“function”——假如这个值是函数
挪用typeof null会返回”object“,因为特别值null被认为是一个空的对象援用。
4.2 Undefined 范例
Undefined范例只需一个值,即特别的undefined。在运用var声明变量但未对其加以初始化时,这个变量的值就是undefined
var message;
console.log(message == undefined); //true
字面量undefined的主要目标是用于比较,为了正式辨别空对象指针与未经初始化的变量
4.3 Null 范例
Null范例是第二个只需一个值的数据范例,这个特别的值是null。从逻辑角度来看,null值示意一个空对象指针,而这也正式运用typeof操纵符检测null值时会返回”object”的缘由
var car = null;
console.log(typeof null); //object
假如定义的变量预备在未来用于保留对象,那末最好将该变量初始化为null而不是其他值。如许一来,只需直接搜检null值就可以晓得响应的变量是不是已保留了一个对象的援用。
实际上,undefined值是派生自null值得,因而ECMA-262划定对他们的相称性测试要返回true
console.log(null == undefined); //true
4.4 Boolean 范例
Boolean范例只需两个字面值:true和false
Boolean范例的字面值true和false是辨别大小写的
可以对任何数据范例的值挪用Boolean()函数,而且总会返回一个Boolean值
数据范例 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “” (空字符串) |
Number | 任何非零数字值 | 0和NaN |
Object | 任何对象 | null |
Undefined | N/A | undefined |
n/a (N/A),是not applicable的缩写,意义是”不实用”。
4.5 Number范例
Number范例运用IEEE754花样来示意整数和浮点数值(双精度值)。为支撑种种数值范例ECMA-262定义了差别的数值字面量花样。
十进制
var intNum == 55;
八进制
八进制字面值的第一位必需是零(0),然后是数字序列(0~7)。假如字面值中的数值超越了局限,那末_前导零_ 将被疏忽,背面的数值将被当作十进制十进制数值剖析
var octalNum1 = 070; //八进制的56
var octalNum2 = 079; //无效的八进制数值——剖析为79
var octalNum3 = 08; //无效的八进制数值——剖析为8
八进制字面量在严厉情势下是无效的,会致使支撑该情势的JavaScript引擎抛出毛病。
十六进制
十六进制字面值的前两位必需是0x,后跟任何十六进制数字(0~9 及 A~F)。字母A~F可以大写,也可以小写
var hexNum1 = 0xA; //十六进制的10
var hexNum2 = 0x1f; //十六进制的31
在举行算数盘算时,一切以八进制和十六进制示意的数值终究都将被转换成十进制数值
4.5.1 浮点数值
保留浮点数值须要的内存空间是保留整数值得两倍,假如小数点背面没有跟任何数字,或许浮点数值自身示意的就是一个整数(如1.0),那末该值将会被转换成整数
var floatNum1 = 1; //小数点背面没有数字——剖析为1
var floatNum2 = 10.0; //整数——剖析为10
关于那些极大或极小的数值,可以用e示意法(即科学计数法)示意浮点数值。用e示意法示意的数值即是e前面的数值乘以10的指数次幂。
var floatNum1 = 3.125e7; //即是31250000
var floatNum2 = 3e-7; //即是0.0000003
浮点数值得最高精度是17位小数,但在举行算术盘算时其精度远远不如整数。比方,0.1加0.2的效果是0.30000000000000004
4.5.2 数值局限
因为内存的限定,ECMAScript并不能保留世界上一切的数值。
最小数值 Number.MIN_VALUE //5e-324
最大数值 Number.MAX_VALUE //1.7976931348623157e+308
假如某次盘算的效果获得了一个超越JavaScript数值局限的值,那末这个值将被自动转换成特别的Infinity值
正无穷大 Infinity
负无穷大 -Infunity
isFinite()函数可以推断一个数值是不是又穷的
4.5.3 NaN
NaN,即非数值(Not a Number),是一个特别的数值,这个数值用于原本要返回数值的操纵数未返回数值的状况(如许就不会抛出毛病了)
任何触及NaN的操纵(比方NaN/10)都邑返回NaN
NaN与任何值都不相称,包括NaN自身
console.log(NaN == NaN); //false
ECMAScript定义了isNaN()函数,这个函数接收一个参数,该参数可以是任何范例,而函数会帮我们肯定这个函数是不是”不是数值”
isNaN()也实用于对象,基于对象挪用isNaN()函数时,会先挪用对象的valueOf()要领,再肯定该要领返回的值是不是可以转换为数值。假如不能,则基于这个返回值再挪用toString()要领,在测试返回值
4.5.4 数值转换
Number()
、parseInt()
、parseFloat()
4.6 String范例
4.6.1 字符字面量
String数据范例包括一些特别的字符字面量,也叫转义序列,用于示意非打印字符,或许具有其他用处的字符。
n:换行
t:制表
b:退格
r:回车
f:进纸
x_nn_:以十六进制代码_nn_示意的一个字符(个中_n_为0~F)。比方,x41示意”A”
u_nnnn_:以十六进制代码_nnnn_示意的一个Unicode字符(个中_n_为0~F)。比方,u03a3示意希腊字符Σ
任何字符串的长度都可以经由过程接见其length属性获得:
var text = "This is the letter sigma: \u03a3.";
console.log(text.length); //输出28
这个属性返回的字符数包括16位字符的数量。假如字符串中包括双字节字符,那末length属性可以不会精确地返回字符串中的字符数量。
4.6.2 字符串的特性
ECMAScript中的字符串是不可变的。字符串一旦建立,它们的值就不能转变。要转变某个变量保留的字符串,首先要销本来的字符串,然后再用另一个包括新值的字符串添补该变量
4.6.3 转换为字符串
要把一个值转换为一个字符串有两种要领:
险些每一个值都有的
toString()
要领
null和undefined值没有这个要领
toString()
要领接收一个参数:输出数值的基数,toString()
可以输出以二进制、八进制、十六进制,以致其他恣意有用进制花样示意的字符串值(默许基数为10)
String()
函数可以将任何范例的值转换为字符串
假如值有
toString()
要领,则挪用该要领(没有参数)并返回响应的效果;
假如值是null
,则返回”null”;
假如值是undefined
,则返回”undefined”。
4.7 Object 范例
ECMAScript中的对象实在就是一组数据和功用的鸠合。对象可以经由过程实行new操纵符后跟要建立的对象范例的称号来建立。
var o = new Object(); //无传参时可以省略括号,但不引荐这么做
Object的每一个实例都具有以下属性和要领:
constructor
:保留着用于建立当前对象的函数。关于前面的例子而言,组织函数(constructor)就是Object()hasOwnProperty(propertyName)
:用于搜检给定的属性在当前对象实例中(而不是在实例的原型中)是不是存在。个中,作为参数的属性名(_propertyName_)必需以字符串情势指定(比方:o.hasOwnProperty("name")
)isPrototypeOf(Object)
:用于搜检传入的对象是不是是当前对象的原型propertyIsEnumerable(propertyName)
:用于搜检给定的属性是不是可以运用for-in
语句来罗列。与hasOwnProperty()
要领一样,作为参数的属性名必需以字符串情势指定toLocaleString()
:返回对象的字符串示意,该字符串与实行环境的区域对应toString()
:返回对象的字符串示意valueOf()
:返回对象的字符串、数值或布尔值示意。平常与toString()
要领的返回值雷同
因为在ECMAScript中Object
是一切对象的基本,因而一切对象都具有这些基本的属性和要领。
5 操纵符
5.1 一元操纵符
只能操纵一个值的操纵符叫做一元操纵符
5.1.1 递增和递减操纵符
实行前置递增和递减操纵符时,变量的值都是在语句被求值之前转变的
(在盘算机范畴,这类状况平常被称作副效应)
var age = 29;
var antherAge = --age + 2;
console.log(age); //输出28
console.log(anotherAge); //输出30
实行后置递增和递减操纵符时,变量的值都是在语句被求值以后转变的
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; //即是22
var num4 = num1 + num2; //即是21
递增递减操纵符对任何值都实用
5.1.2 一元加和减操纵符
在对非数值运用一元加(减)操纵符时,该操纵符会像Number()
函数一样对这个值实行转换。
5.2 位操纵符
……
5.3 布尔操纵符
5.3.1 逻辑非
逻辑非操纵符由一个叹号(!
)示意,可以运用于ECMAScript中的任何值。不管这个值是什么数据范例,这个操纵符都邑返回一个布尔值。
同时运用两个逻辑非操纵符,实际上就会模仿Boolean()
转型函数的行动
5.3.2 逻辑与
逻辑与操纵符由两个和号(&&
)示意,有两个操纵数
逻辑与操纵可以运用于任何范例的操纵数,而不仅仅是布尔值。在有一个操纵数不是布尔值的状况下,逻辑与操纵就不肯定返回布尔值:
假如第一个操纵数是对象,则返回第二个操纵数
假如第二个操纵数是对象,则只需在第一个操纵数的求值效果为
true
的状况下才会返回该对象假如两个操纵数都是对象,则返回第二个操纵数
假如第一个操纵数是
null
,则返回null
假如第一个操纵数是
NaN
,则返回NaN
假如第一个操纵数是
undefined
,则返回undefined
逻辑与操纵属于短路操纵,假如第一个操纵数可以处理效果,那末久不会再对第二个操纵数求值
var found = true;
var result = (found && someUndefinedVariable); //这里会发作毛病
console.log(result); //这一行不会实行
上面代码中,当实行逻辑与操纵符时会发作毛病,因为变量someUndefinedVariable没有声明
var found = false;
var result = (found && someUndefinedVariable); //不会发作毛病
console.log(result); //会实行("false")
5.3.3 逻辑或
逻辑或操纵符由两个竖线标记(||
)示意,有两个操纵数
与逻辑与类似,假如有一个操纵数不是布尔值,逻辑或也不肯定返回布尔值:
假如第一个操纵数是对象,则返回第一个操纵数
假如第一个操纵数的求值效果为
false
,则返回第二个操纵数假如两个操纵数都是对象,则返回第一个操纵数
假如两个操纵数都是对象,则返回第一个操纵数
假如两个操纵数都是
null
,则返回null
假如两个操纵数都是
undefined
,则返回undefined
逻辑或操纵符也是短路操纵符。也就是说,假如第一个操纵数的求值效果为true,就不会对第二个操纵数求值了
5.6 关联操纵符
小于(<)、大于(>)、小于即是(<=)、大于即是(>=)
当关联操纵符的操纵数运用了非数值时,会举行数据转换或完成某些新鲜的操纵:
假如两个操纵数都是数值,则实行数值比较
假如两个操纵数都是字符串,则比较两个字符串对应的字符编码值
假如一个操纵数是数值,则将另一个操纵数转换为一个数值,然后实行数值比较
假如一个操纵数是对象,则挪用这个对象的
valueOf()
要领,用获得的效果依据前面的划定规矩实行比较。假如对象没有valueOf()
要领,则挪用toString()
要领,并用获得的效果依据前面的划定规矩实行比较假如一个操纵数是布尔值,则先将其转换为数值,然后再实行比较
任何操纵数与
NaN
比较,都邑返回false
5.7 相称操纵符
5.7.1相称和不相称
假如两个操纵数数据范例差别,则会先转换数据范例(平常称为强迫转型)再比较
null
和undefined
是相称的要比较相称性之前,不能将
null
和undefined
转换成其他任何值有一个操纵符为
NaN
时,相称操纵符返回false
,NaN
不即是NaN
假如两个操纵数都是对象,则比较它们是不是是同一个对象
5.7.2 全等和不全等
除了在比较之前不转换操纵数以外,全等和不全等操纵符没有什么区别
5.8 前提操纵符
variable = boolean_expression ? true_value : false_value;
var max = (num1 > num2) ? num1 : num2;
5.9 赋值操纵符
即是号(=)
5.10 逗号操纵符
逗号(,)
6语句
6.1 if语句
if(1 > 25){
console.log();
}else{
console.log();
}
6.2 do-while语句
var i = 0;
do{
i += 2;
}while(i < 10);
console.log(i);
6.3 while语句
var i = 0;
while(1 < 10){
i += 2;
}
6.4 for语句
var count = 10;
for(var i = 0; i < count; i++){
console.log(i);
}
因为ECMAScript中不存在块级作用域,因而在轮回内部定义的变量也可以在外部接见到
for语句中的初始化表达式、掌握表达式和轮回后表达式都是可选的。将这三个表达式悉数省略,就会建立一个无穷轮回
6.5 for-in语句
for-in语句是一种精准的迭代语句,可以用来罗列对象的属性
for(var propName in window){
document.write(propName);
}
ECMAScript对象的属性没有递次。因而,经由过程
for-in
轮回输出的属性名的递次是不可展望的
6.6 label语句
运用label语句可以在代码中增添标签,以便未来运用
start: for(var i = 0; i < count; i++){
console.log(i);
}
这个例子中定义的start标签可以在未来有
break
或continue
语句援用。加标签的语句平常都要与for语句等轮回语句合营运用
6.7 break和continue语句
break
和continue
语句用于在轮回中精确地掌握代码的实行
var num = 0;
outermost:
for(var i = 0; i < 10; i++){
for(var j = 0; j < 10; j++){
if(i == 5 && j == 5){
break outermost;
}
num++;
}
}
console.log(num); //55
var num = 0;
outermost:
for(var i = 0; i < 10; i++){
for(var j = 0; j < 10; j++){
if(i == 5 && j == 5){
continue outermost;
}
num++;
}
}
console.log(num); //95
//假如两个轮回都天然完毕,num的值应该是100
6.8 with语句(舍弃!)
严厉情势下不许可运用with语句,不然将视为语法毛病。
因为大批运用with语句会致使机能下落,同时也会给调试代码形成难题,因而不发起运用with语句
6.9 switch语句
var num = 25;
switch (true){
case num < 0:
console.log("0");
break;
case num >= 0 && num <= 10:
console.log("0");
break;
default:
console.log("0");
}
switch
语句在比较值时运用的是全等操纵符,因而不会发作范例转换
7 函数
函数中的return
语句可以不带有任何返回值。在这类状况下,函数在住手实行后将返回undefined
值。
引荐的做法是要么让函数一直都返回一个值,要么永久都不要返回值。不然,假如函数有时候返回值,有时候不返回值,会给调试代码带来不方便
7.1 明白参数
ECMAScript中的参数在内部是用一个数组来示意的。函数接收到的一直都是这个数组,而不关心数组中包括哪些参数(假如有参数的话)。
在函数体内可以经由过程
arguments
对象来接见这个参数数组
ECMAScript函数有一个主要的特性:定名的参数只提供方便,但不是必需的。
定名参数可以与arguments
对象一同运用,arguments
的值永久与对应定名参数的值坚持同步。
没有通报值的定名参数将自动被给予undefined
值。
严厉情势下不许可重写定名参数或许
arguments
的值,虽然可以实行,然则定名参数与arguments
对应的值将不再同步
7.2 没有重载
ECMAScript函数不能像传统意义上那样完成重载。ECMAScript函数没有署名,因为其参数是由包括零或多个值的数组来示意的。而没有函数署名,真正的重载是不可以做到的。
假如定义了两个名字雷同的函数,则该名字只属于后定义的函数,先定义的函数将被掩盖