ES 5 新增特性彙總

方應杭在飢人谷發表於2016-12-13

請期待下一篇《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

相關文章