JavaScript中的直接量與初始器的區別


很多代碼優化及公司規范都會提到

寫對象不應該

var obj = new Object()

而應該

var obj = {}

 

寫數組不應該

var arr = new Array()

而應該

var arr = []

 

很多書籍《JavaScript高級程序設計》《JavaScript權威指南》也建議使用對象、數組直接量而別使用new方式。這里就引出了直接量(Literals)的概念。 

 

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

 

ES2(1998.8)規定的直接量和ES1相同

 

到了ES3(1999.12),則加入了正則表達式直接量(Regular Expression Literals),有5種直接量

 

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

 

以上規范可以看到,ES1到ES5中都沒有將對象,數組納入直接量的概念中。那為什么很多書籍都使用“對象直接量”、“數組直接量”呢?

 

實際在ES3,ES5中,對象和數組被歸納到第十一章(表達式)里,有一個新名詞稱為 初始器(Initialiser)。

ES3 

 

ES5

 

為何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權威指南》后續版本如第六版仍然采用 “對象直接量”,“數組直接量” 這樣的名詞。

  

最后提一下Undefined,不知ES規范為什么沒把Undefined納入到直接量(Literals)的概念里。

 

相關:

ECMAScript各版本

JavaScript權威指南(第六版)

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM