今天終於抽出時間瞟了一眼JavaScript的新標準ECMA262v5,讓我欣喜的是,不像是因為過於激進而被廢除的v4,這個新標準對JavaScript保留了ECMA262v3時代大部分的語言特性,把重點放在了修補舊標準中被人詬病的問題上,而且加入了許多令人期待的新特性和新功能。因為我還沒有很深入研究,這裡僅僅是分享我快速探索時看到的一些主要的亮點和變化,請不要把本文當作一個全面的新舊標準對比,也歡迎大家補充。
1.文檔得到改進,官方版本PDF檔案帶了索引,目錄也有了連結。
(雖然跟語言無關……)這份文檔使用了pdf的更多特性,閱讀起來較之v3方便了不少。
2.v3中描述曖昧的scope chain的概念被去掉,引入了全新的執行內容概念來解釋動態變數範圍。
scope chain在ECMAv3中一直是塊難啃的骨頭,本身標準的描述就不夠清晰,再加上動態範圍的實現又有些難以理解,很多人都一直因為scope chain問題而苦惱。在v5中,變數範圍的概念被完全更新,採用上下文和outer內容相關的概念來解釋這個問題。比起原來向scope chain中加入Activation Object的解釋方法,這種描述令實現更自由(內容物件不一定是JavaScript對象,而Activation Object一定是JavaScript對象)
3.引入了strict模式,strict模式提供了禁用一些語言特性以提升效能的潛在可能。
根據我目前的推斷,在strict模式模式下JavaScript的變數應該是可以實現為靜態定址的。眾所周知,JavaScript運行效率低的原因之一就是動態變數聲明和變數名尋找導致的效率問題,而新的標準引入了strict模式使得這一問題得以根本解決,在一些多次調用的核心代碼中使用strict模式將大大提高JavaScript的運行效率。當然這些特性還要求語言實現者提供相應支援才行。
4.eval和arguments做為標識符受到了限制。
我想是為了彌補v3將eval和arguments做為普通標識符帶來的問題,v5在各個地方都對eval和arguments作出了限制,對它們進行賦值等操作會導致拋出運行時異常。我個人認為現在基本可以將它們等同於關鍵字看待。
5.JSON被引入標準中
JSON的概念被正式引入了v5,並且有了標準的詞法和文法定義。同時,新標準也提供了不同層面內建類型方法來支援JSON,包括Date的toJSON和新引入的JSON對象。
6.引入了屬性類型,物件模型描述更加清晰
新標準引入了兩種Property類型,一種是普通的儲存Value的property,另一種是有Getter和Setter的屬性。而v3中略顯含糊的對象是“屬性無序集合”的概念,隨著這樣的定義也變得很清晰。
7.引入了Error的子類型
所有Error不再屬於同一個Error類型,EvalError, RangeError, ReferenceError, SyntaxError, TypeError 以及 URIError 被引入語言中。
8.更多內建類型的方法
下面是一份新標準中給出的新添加內建類型以及屬性列表:
Object.getPrototypeOf, Object.getOwnPropertyDescriptor, Object.getOwnPropertyNames, Object.create, Object.defineProperty, Object.defineProperties, Object.seal, Object.freeze, Object.preventExtensions, Object.isSealed, Object.isFrozen, Object.isExtensible, Object.keys, Function.prototype.bind, Array.prototype.indexOf, Array.prototype.lastIndexOf, Array.prototype.every, Array.prototype.some, Array.prototype.forEach, Array.prototype.map, Array.prototype.filter, Array.prototype.reduce, Array.prototype.reduceRight, String.prototype.trim, Date.now, Date.prototype.toISOString, Date.prototype.toJSON.
我們看到,這份列表中包括了我們期待以久的很多方法。Object擴充實際上開放了更多v3中不可訪問的對象特性,包括getter setter enumerable等等都可以。而Array擴充則引入了期待以久的集合操作(比如著名的forEach)。Date.now則是一個小小的修補,比起new Date看起來舒服一些。Function.prototype.bind也在列表當中,這個新的內建函數提供了比目前一些流行的bind更完善和高效的綁定thisValue功能,而且還順便提供了綁定參數,這是變相的currying實現。
好了,因為是快速探索,暫時就寫這麼多了,有時間的話我會再做一些研究,提供一些深入點的解讀文章,敬請期待哦:P
官方文檔連結http://www.ecma-international.org/publications/standards/Ecma-262.htm