次のコードは、Chrome では期待どおりに動作しないようで、Firefox では動作が異なります。
(function () {
'use strict';
var
arr = Object.freeze([1, 2, 3]);
try {
arr.push(4);
} catch (e) {
console.log(e);
}
try {
console.log(arr.pop());
}catch (e) {
console.log(e);
}
console.log(arr);
})();
出力は次のようになると予想しました。
Error : (for `arr.push(4)`)
Error : (for `arr.pop()`)
[1, 2, 3]
しかし、このコードを Chrome 29.0.1547.49 (公式ビルド 216092) beta-m で実行すると、次の出力が表示されます。
3
[1, 2, 3]
なぜ例外がないのですか?このコードを Firefox Nightly 26.0a1(2013-08-12) で実行したところ、結果は
TypeError: arr.push(...) is not extensible
TypeError: property arr.pop(...) is non-configurable and can't be deleted
[1, 2, 3]
私が期待していたように。
Chrome と Firefox の違いについて考えてみたところ、厳密なモードpop
とpush
メソッドが原因である可能性があることに気付きました。要約すると、Firefox (SpiderMonkey) ではpop
メソッドpush
は厳密モードで定義されていますが、Chrome (V8) ではこれらのメソッドは厳密モードで定義されていません。
実際の仕様はわかりません。(ECMA-262 5.1th Edition をいくつか読みましたが、そのようなセクションが見つかりません。)