請期待下一篇《ES 6 新增特性彙總》和下下一篇《ES 2016 新增特性彙總》。
最近有同學問我 ES 5 到底新增了哪些語法,我一時還真想不全。於是就想去找找看有沒有這樣的文件,然而卻發現並沒有。因為 Ecma International 直接公佈了一份完整的 ES 5.1 的規格文件,並沒有特別列出 ES 5 和 ES 3 的區別。
最後找到一份看起來挺全的列表,於是就想翻譯一下備忘。
Trailing commas are ok
多餘的逗號不報錯,比如 {a:1,b:2,}No reserved words for property names
屬性名可以使用關鍵字和保留字了,比如 { if:1, else:2 }NaN, Infinity, undefined : are all constants
NaN、Infinity、undefined 都是常量了,不可更改。parseInt() defaults to radix 10
parseInt 第二個引數預設為 10(真好)/regexp/ produces new reg ex object every time
正則字面量每次都會產生一個新的物件JSON.parse(), JSON.stringify()
新增 JSON 序列化和反序列化Function.prototype.bind
函式新增 bind 方法(賀老說 bind 寫在後面有點不好用)String.prototype.trim
字串終於自帶頭尾去空格方法了,如 ' abc '.trim() === 'abc'Array.prototype.every, filter, forEach, indexOf, lastIndexOf, map, reduce, reduceRight, some
陣列新增了一系列方法,終於能脫離 Underscore.js 了Date.now()
Date.now 現在才加進來的?可怕。Date.prototype.toISOString
日期新增 toISOString 方法new Date(string) and Date.parse(string) will try ISO format 1st
新增對 ISO 日期格式的支援Array.isArray()
判斷一個物件是不是陣列……以前苦了大家了Object.keys(), Object.create(), Object.defineProperty, Object.defineProperties,
Object.getOwnPropertyDescriptor(), Object.getOwnPropertyNames(obj), Object.getPrototypeOf(obj)Object.seal(), Object.freeze(), Object.preventExtensions(), Object.isSealed(), Object.isFrozen(),
Object.isExtensible()
物件新增一系列方法,使得在 JS 中模擬 Java 變得更絲滑。我最喜歡的還是 Object.create()Property attributes: writeable, value, enumerable, configurable, get, set
物件的屬性可以新增各種配置了Strict Mode:
No more implied global variables within functions.
this is not bound to the global object by function form.
apply and call do not default to the global object.
No with statement.
Setting a writeable: false property will throw.
Deleting a configurable: false property will throw.
Restrictions on eval.
eval and arguments are reserved.
arguments not linked to parameters.
No more arguments.caller or arguments.callee.
No more octal literals.
Duplicate names in an object literal or function parameters are a syntax error嚴格模式
函式裡沒有隱式的全域性變數了,你要建立全域性變數必須是顯式的。比如想用 a = 1 建立全域性變數是不行的。
this 不會預設指向全域性物件(比如 window 或者 global)了。
call 和 apply 也不會預設使用全域性物件了。
不準用 with
如果一個屬性的 writeable 是 false,那麼你給這個屬性賦值就會報錯。
如果一個屬性的 configurable 是 false,那麼你 delete 這個屬性就會報錯。
對 eval 和 arguments 做出了限制。以下程式碼每行都會報錯:eval = 17; arguments++; ++eval; var obj = { set p(arguments) { } }; var eval; try { } catch (arguments) { } function x(eval) { } function arguments() { } var y = function eval() { }; var f = new Function("arguments", "'use strict'; return 17;");複製程式碼
arguments 只儲存原始引數。對形參的賦值不會對 arguments 有影響。
不準用 arguments.caller 和 arguments.callee
不支援八進位制字面量,比如 var a = 015 會報錯。
物件字面量或者函式形參中,如果有重複的名字,就會報錯。
Strict Mode 更詳細的參考,見 MDN。