ECMAScript 5.1 (或僅 ES5) 是ECMAScript(基於JavaScript的規範)標準最新修正。 與HTML5規範進程本質相似,ES5經過對現有JavaScript方法添加語句和原生ECMAScript對象作合併實現標準化。ES5還引入了一個語法的嚴格變種,被稱爲」嚴格模式(strict mode)」。javascript
本文咱們將介紹一些有用的改變和添加。關於完整列表,請參考官方ECMAScript語言規範附錄D和E (PDF下載, 3MB),或者查看http://www.ecmascript.org/; 您還能夠以HTML形式查看 – Michael[tm] Smith非官方的HTML版本說明。php
隨着Opera 11.60的發佈, 全部5大瀏覽器都支持ES5, 除了一些實現的bugs. 除非另有說明,本文中提到的的一切能夠用在如下瀏覽器版本(或更高):html
* IE9不支持嚴格模式 — IE10 添加java
** Safari 5.1 仍不支持 Function.prototype.bind
, 儘管 Function.prototype.bind
如今已經被Webkit所支持。git
對於舊版瀏覽器的支持信息,您能夠查看Juriy Zaytsev很讚的 ECMAScript 5 兼容性表。github
嚴格模式給做者提供了選擇一個限制性更強語言變種的方式——給做者提供額外的可靠性給用戶提供額外的安全性。在JS文件或是函數的頂部添加"use strict"
便可啓用嚴格模式。由於"use strict"
就是個字符串,所以其會被舊版瀏覽器安全地忽視。web
"use strict";
function strict(){ "use strict"; //... } function sloppy(){ eval("window.foo = 'bar'"); }
在嚴格模式下運行腳本,很多致使提醒或buggy行爲的事情會拋出錯誤,例如:chrome
ReferenceError
, 而不是建立一個全局變量。SyntaxError
.with
語句拋出SyntaxError
.MDSN的嚴格模式文章有個關於全部這些差別頗有用的總結表格。json
ES5提供一個全局的JSON
對象,用來序列化(JSON.stringify
)和反序列化(JSON.parse)對象爲JSON格式。數組
對於老的瀏覽器,能夠考慮使用Douglas Crockford的json2.js, 可讓舊的瀏覽器實現一樣的功能(原始支持功能測試後)。
JSON.parse(text [, reviver])
JSON.parse
接受文本(JSON格式)並轉換成一個ECMAScript值。該可選的reviver參數是有帶有key
和value
兩個參數的函數,其做用於結果——讓過濾和轉換返回值成爲可能。
>> var result = JSON.parse('{"a": 1, "b": "2"}'); Object >> result.b "2"
若是咱們想確保解析的值是個整數,咱們可使用reviver方法。
var result = JSON.parse('{"a": 1, "b": "2"}', function(key, value){ if (typeof value == 'string'){ return parseInt(value); } else { return value; } }) >> result.b 2
JSON.stringify(value [, replacer [, space]])
JSON.stringify
容許做者接受一個ECMAScript值而後轉換成JSON格式的字符串。 在其最簡單的形式中,JSON.stringify
接受一個值返回一個字符串,
>>> var mike = JSON.stringify({mike: "taylor"}) undefined >> mike '{"mike": "taylor"}' >> typeof mike "string"
若是咱們須要改變值字符串化的方式,或是對咱們選擇的提供過濾,咱們能夠將其傳給replacer函數。例如,咱們想過濾出即將被字符串化的對象中值爲13的屬性:
var nums = { "first": 7, "second": 14, "third": 13 } var luckyNums = JSON.stringify(nums, function(key, value){ if (value == 13) { return undefined; } else { return value; } }); >> luckyNums '{"first": 7, "second": 14}'
若是replacer方法返回undefined
, 則鍵值對就不會包含在最終的JSON中。咱們一樣能夠傳遞一個space參數以便得到返回結果的可讀性幫助。space參數能夠是個數字,代表了做縮進的JSON字符串或字符串每一個水平上縮進的空格數。若是參數是個超過10的數值,或是超過10個字符的字符串,將致使取數值10或是截取前10個字符。
var luckyNums = JSON.stringify(nums, function(key, value) { if (value == 13) { return undefined; } else { return value; } }, 2); >> luckyNums '{ "first":7, "second":14 }'
下面的方法是添加到Object
上的構造器:
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
這些新增的好處之一是對象的屬性有了更多控制,例如哪些是容許被修改的,哪些是能夠枚舉的,哪些是能夠刪除的等。這個的實現經過程序訪問對象的屬性描述符(property descriptors). 例如:
var cat = {}; Object.defineProperty(cat, "name", { value: "Maru", writable: false, enumerable: true, configurable: false }); Object.defineProperty(cat, "skill", { value: "exploring boxes", writable: true, enumerable: true, configurable: true });
對於咱們的cat
對象, 其名字name
不能被改變,可是會出如今for-in
循環中。在其餘方面,Maru擅長探索盒子(exploring boxes), 可是能夠在未來改變,由於skill
屬性是writable
和configurable
的。
在以後的文章咱們將詳細探討全部附加的對象。
如下方法添加到了Arrayprototype
對象上:
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
關於ES5數組」extras」 Dmitry Soshnikov寫過一篇有深度的參考文章。
Dmitry的文章中有一個沒有提到,就是Array.isArray
, 正如你看到的,這廝直接寫在了Array
構造器上,而不是prototype
對象上。Array.isArray
會按照你所期待的那樣去作 — 這是一個根據參數的[[Class]]內部屬性是不是」Array」返回true
或false
.
Array.isArray("NO U") >> false Array.isArray(["NO", "U"]) >> true
在ES3中,惟一可靠的肯定一個值是數組的方式就是使用「the Miller Device」, 即比對一個數組其內在的[[Class]]
屬性。
Object.prototype.toString.apply(value) === '[object Array]'
Function.prototype.bind(thisArg [, arg1 [, arg2, …]])
Function.prototype.bind
返回一個新的函數對象,該函數對象的this綁定到了thisArg
參數上。從本質上講,這容許你在其餘對象鏈中執行一個函數。
function locate(){ console.log(this.location); } function Maru(location){ this.location = location; } var kitty = new Maru("cardboard box"); var locateMaru = locate.bind(kitty); locateMaru();
在這個例子中,咱們將Maru對象的上下文應用在location
函數中。由於location
是個全局對象的屬性,其this
值就是全局對象(window
)。在這種狀況下,咱們向上尋找cat, 並非Location
對象,由於咱們能夠經過綁定的老是kitty
的this
值建立一個新方法locateMaru
.
本文許可自Creative Commons Attribution 3.0 Unported許可。
原創文章,轉載請註明來自張鑫旭-鑫空間-鑫生活[http://www.zhangxinxu.com]
本文地址:http://www.zhangxinxu.com/wordpress/?p=2148