以下代码在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.1版,但我找不到这样的部分。)