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