JavaScript中的直接量与起头器的区分

成百上千代码优化及合作社规范都会提到

写对象不应有

var obj = new Object()

而应该

var obj = {}

 

写数组不应该

var arr = new Array()

而应该

var arr = []

 

重重图书《JavaScript高级程序设计》《JavaScript权威指南》也提出利用对象、数组直接量而别使用new情势。这里就引出了直接量(Literals)的定义。 

 

ES1(1997.6)规定的直接量有四种:Null、Boolean、Numeric、String

图片 1

 

ES2(1998.8)规定的直接量和ES1一样

图片 2

 

到了ES3(1999.12),则进入了正则表达式直接量(Regular Expression
Literals),有5种直接量

图片 3

 

最近的ES5.1(2011.6),也是5种

图片 4

 

如上专业可以看看,ES1到ES5中都从没将对象,数组纳入直接量的定义中。那怎么许多书籍都接纳“对象直接量”、“数组直接量”呢?

 

事实上在ES3,ES5中,对象和数组被归结到第十一章(表明式)里,有一个新名词叫做
起始器(Initialiser)。

ES3 

图片 5

 

ES5

图片 6

 

为什么ES3中校正则对象纳入了直接量,数组和目的怎么没有吗?

var reg = /abc/g
var arr = [1, 2, 3]
var obj = {name: 'John McCarthy'}

上述代码让大家很当然的认为,数组/对象应当和正则一样纳入直接量的定义里。再看下边的代码

var arr = [obj.a, 0, obj.a+1]
var obj = {name: 'John' + 'McCarthy'}

可以见到“obj.a”、“obj.a+1”
等都是表明式运算,故而从ES3上马把数组、对象纳入在11章表明式(Exrpessions)里,称为开端器(Initialiser)。

正则表达式里则不会现出表明式运算,因而放在第7章直接量(Literals)里。

 

鉴于初阶器(Initialiser)的称呼晚于一些书籍的出版,《JavaScript权威指南》后续版本如第六版还是采用“对象直接量”,“数组直接量” 这样的名词。

图片 7

  

最后提一下Undefined,不知ES规范为啥没把Undefined纳入到直接量(Literals)的定义里。

 

相关:

ECMAScript各版本

JavaScript权威指南(第六版)