ECMAScript中的一切(变量、函数名和操做符)都区分大小写。javascript
ECMAScript 5 引入了严格模式(strict mode)的概念。严格模式是为JavaScript定义了一种不一样的解析与执行模型。
在严格模式下,ECMAScript 3 中的一些不肯定的行为将获得处理,并且对某些不安全的操做也会抛出错误。
要在整个脚本中启用严格模式,能够再顶部添加以下代码:java
"use strict"
指定函数在严格模式下执行:express
function doSomething(){ "use strict"; //函数体 }
关键字
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、yieldapp
ECMAScript的变量是松散类型的,所谓松散类型就是能够用来保存任何类型的数据。换句话说,每一个变量仅仅是一个用于保存值得占位符而已。函数
var message;
像这样未通过初始化的变量,会保存一个特殊的值——undefined
性能
给未经声明的变量赋值在严格模式下会致使抛出PeferenceError错误测试
ES 5
5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number、String
1种复杂数据类型——Object,Object本质上是由一组无序的名值对组成的。this
ES 6 新增一种数据类型——符号对象(Symbol)
typeof 用来检测给定变量的数据类型
"undefined"——若是这个值未定义
"boolean"——若是这个值是布尔值
"string"——若是这个值是字符串
"number"——若是这个值是数值
"object"——若是这个值是对象或null
"function"——若是这个值是函数
调用typeof null会返回"object",由于特殊值null被认为是一个空的对象引用。
Undefined类型只有一个值,即特殊的undefined。在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined
var message; console.log(message == undefined); //true
字面量undefined的主要目的是用于比较,为了正式区分空对象指针与未经初始化的变量
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
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的缩写,意思是"不适用"。
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
在进行算数计算时,全部以八进制和十六进制表示的数值最终都将被转换成十进制数值
保存浮点数值须要的内存空间是保存整数值得两倍,若是小数点后面没有跟任何数字,或者浮点数值自己表示的就是一个整数(如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
因为内存的限制,ECMAScript并不能保存世界上全部的数值。
最小数值 Number.MIN_VALUE //5e-324
最大数值 Number.MAX_VALUE //1.7976931348623157e+308
若是某次计算的结果获得了一个超出JavaScript数值范围的值,那么这个值将被自动转换成特殊的Infinity值
正无穷大 Infinity
负无穷大 -Infunity
isFinite()函数能够判断一个数值是否又穷的
NaN,即非数值(Not a Number),是一个特殊的数值,这个数值用于原本要返回数值的操做数未返回数值的状况(这样就不会抛出错误了)
任何涉及NaN的操做(例如NaN/10)都会返回NaN
NaN与任何值都不相等,包括NaN自己
console.log(NaN == NaN); //false
ECMAScript定义了isNaN()函数,这个函数接受一个参数,该参数能够是任何类型,而函数会帮咱们肯定这个函数是否"不是数值"
isNaN()也适用于对象,基于对象调用isNaN()函数时,会先调用对象的valueOf()方法,再肯定该方法返回的值是否能够转换为数值。若是不能,则基于这个返回值再调用toString()方法,在测试返回值
Number()
、parseInt()
、parseFloat()
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属性可能不会精确地返回字符串中的字符数目。
ECMAScript中的字符串是不可变的。字符串一旦建立,它们的值就不能改变。要改变某个变量保存的字符串,首先要销原来的字符串,而后再用另外一个包含新值的字符串填充该变量
要把一个值转换为一个字符串有两种方法:
几乎每一个值都有的toString()
方法
null和undefined值没有这个方法
toString()
方法接受一个参数:输出数值的基数,toString()
能够输出以二进制、八进制、十六进制,乃至其余任意有效进制格式表示的字符串值(默认基数为10)
String()
函数可以将任何类型的值转换为字符串
若是值有
toString()
方法,则调用该方法(没有参数)并返回相应的结果;
若是值是null
,则返回"null";
若是值是undefined
,则返回"undefined"。
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
是全部对象的基础,所以全部对象都具备这些基本的属性和方法。
只能操做一个值的操做符叫作一元操做符
执行前置递增和递减操做符时,变量的值都是在语句被求值之前改变的(在计算机领域,这种状况一般被称做副效应)
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
递增递减操做符对任何值都适用
在对非数值应用一元加(减)操做符时,该操做符会像Number()
函数同样对这个值执行转换。
......
逻辑非操做符由一个叹号(!
)表示,能够应用于ECMAScript中的任何值。不管这个值是什么数据类型,这个操做符都会返回一个布尔值。
同时使用两个逻辑非操做符,实际上就会模拟Boolean()
转型函数的行为
逻辑与操做符由两个和号(&&
)表示,有两个操做数
逻辑与操做能够应用于任何类型的操做数,而不只仅是布尔值。在有一个操做数不是布尔值的状况下,逻辑与操做就不必定返回布尔值:
若是第一个操做数是对象,则返回第二个操做数
若是第二个操做数是对象,则只有在第一个操做数的求值结果为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")
逻辑或操做符由两个竖线符号(||
)表示,有两个操做数
与逻辑与类似,若是有一个操做数不是布尔值,逻辑或也不必定返回布尔值:
若是第一个操做数是对象,则返回第一个操做数
若是第一个操做数的求值结果为false
,则返回第二个操做数
若是两个操做数都是对象,则返回第一个操做数
若是两个操做数都是对象,则返回第一个操做数
若是两个操做数都是null
,则返回null
若是两个操做数都是undefined
,则返回undefined
逻辑或操做符也是短路操做符。也就是说,若是第一个操做数的求值结果为true,就不会对第二个操做数求值了
小于(<)、大于(>)、小于等于(<=)、大于等于(>=)
当关系操做符的操做数使用了非数值时,会进行数据转换或完成某些奇怪的操做:
若是两个操做数都是数值,则执行数值比较
若是两个操做数都是字符串,则比较两个字符串对应的字符编码值
若是一个操做数是数值,则将另外一个操做数转换为一个数值,而后执行数值比较
若是一个操做数是对象,则调用这个对象的valueOf()
方法,用获得的结果按照前面的规则执行比较。若是对象没有valueOf()
方法,则调用toString()
方法,并用获得的结果根据前面的规则执行比较
若是一个操做数是布尔值,则先将其转换为数值,而后再执行比较
任何操做数与
NaN
比较,都会返回false
若是两个操做数数据类型不一样,则会先转换数据类型(一般称为强制转型)再比较
null
和undefined
是相等的
要比较相等性以前,不能将null
和undefined
转换成其余任何值
有一个操做符为NaN
时,相等操做符返回false
,NaN
不等于NaN
若是两个操做数都是对象,则比较它们是否是同一个对象
除了在比较以前不转换操做数以外,全等和不全等操做符没有什么区别
variable = boolean_expression ? true_value : false_value;
var max = (num1 > num2) ? num1 : num2;
等于号(=)
逗号(,)
if(1 > 25){ console.log(); }else{ console.log(); }
var i = 0; do{ i += 2; }while(i < 10); console.log(i);
var i = 0; while(1 < 10){ i += 2; }
var count = 10; for(var i = 0; i < count; i++){ console.log(i); }
因为ECMAScript中不存在块级做用域,所以在循环内部定义的变量也能够在外部访问到
for语句中的初始化表达式、控制表达式和循环后表达式都是可选的。将这三个表达式所有省略,就会建立一个无限循环
for-in语句是一种精准的迭代语句,能够用来枚举对象的属性
for(var propName in window){ document.write(propName); }
ECMAScript对象的属性没有顺序。所以,经过
for-in
循环输出的属性名的顺序是不可预测的
使用label语句能够在代码中添加标签,以便未来使用
start: for(var i = 0; i < count; i++){ console.log(i); }
这个例子中定义的start标签能够在未来有
break
或continue
语句引用。加标签的语句通常都要与for语句等循环语句配合使用
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
严格模式下不容许使用with语句,不然将视为语法错误。
因为大量使用with语句会致使性能降低,同时也会给调试代码形成困难,所以不建议使用with语句
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
语句在比较值时使用的是全等操做符,所以不会发生类型转换
函数中的return
语句能够不带有任何返回值。在这种状况下,函数在中止执行后将返回undefined
值。
推荐的作法是要么让函数始终都返回一个值,要么永远都不要返回值。不然,若是函数有时候返回值,有时候不返回值,会给调试代码带来不便
ECMAScript中的参数在内部是用一个数组来表示的。函数接收到的始终都是这个数组,而不关心数组中包含哪些参数(若是有参数的话)。
在函数体内能够经过
arguments
对象来访问这个参数数组
ECMAScript函数有一个重要的特色:命名的参数只提供便利,但不是必须的。
命名参数能够与arguments
对象一块儿使用,arguments
的值永远与对应命名参数的值保持同步。
没有传递值的命名参数将自动被赋予undefined
值。
严格模式下不容许重写命名参数或者
arguments
的值,虽然能够执行,可是命名参数与arguments
对应的值将再也不同步
ECMAScript函数不能像传统意义上那样实现重载。ECMAScript函数没有签名,由于其参数是由包含零或多个值的数组来表示的。而没有函数签名,真正的重载是不可能作到的。
若是定义了两个名字相同的函数,则该名字只属于后定义的函数,先定义的函数将被覆盖