在Chrome中推送和弹出冻结的数组,而不会引发异常
Push and pop on a frozen array in Chrome not throwing an exception
以下代码在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版,但我找不到这样的部分。
ECMA 262 5.1 说Array.prototype.push
以下内容:
15.4.4.7
Array.prototype.push ( [ item1 [ , item2 [ , … ] ] ] )
....
- 让
O
是调用ToObject
传递 this 值作为参数的结果。- 让我们
lenVal
调用[[Get]]
内部方法的结果,O
参数"length
"。- 让
n
ToUint32(lenVal)
.- 让我们
items
是一个内部列表,其元素按从左到右的顺序是传递给此函数调用的参数。- 重复,当项目不为空时
- 从项目中删除第一个元素,
E
元素的值。- 调用
[[Put]]
内部方法O
参数ToString(n)
、E
和true
。- 将
n
增加 1。- 调用 O 的
[[Put]]
内部方法,参数为"length"、n 和 true。- 返回 n。
请注意参数 3 到 [[Put]]
是如何true
的。现在,[[Put]]
定义为
8.12.5
[[Put]] ( P, V, Throw )
当使用属性
P
调用O
的[[Put]]
内部方法时, 值V
和布尔标志Throw
,将采取以下步骤:
- 如果调用
[[CanPut]]
O
P
参数的内部方法的结果是false
,则
- 如果
Throw
true
,则引发TypeError
异常。- 否则返回。
。
然后,[[CanPut]]
返回 false
等,如果是数组,则O
[[Extensible]]
false
。
因此,您的 Chrome 违反了 ECMA 262 5.1 规范。
更新:
Chrome开发人员正在谈论使push
,pop
严格模式下运行;然而,区别不仅仅是"严格"与"非严格",因为push
的行为和pop
在ECMA 262 5.1规范中非常具体地指定。
- 如何在映射数组中添加换行符
- javascript结合了数组和字典
- 需要帮助设置json数组
- 在Javascript中对具有特定异常的对象数组进行排序
- 捕获异常,而不是比较性能的数组值
- 在javascript数组中检查null时出现异常行为
- 在 Javascript 中使用二维数组引发的异常
- jquery多类型交错数组行为异常
- 是什么导致这个JavaScript关联数组出现异常
- 在Chrome中推送和弹出冻结的数组,而不会引发异常
- 复制带切片的数组时出现异常行为
- 为什么,如果“$q.all”没有返回一个promise数组,则是一个未抛出的异常
- 在Chrome下,Base-64字符数组异常的无效长度
- 我如何直接赋值给数组,但在OOB异常上使用push方法
- jQuery数组/对象异常迭代
- 将对象推入javascript数组的性能异常
- Javascript数组拼接导致内存不足异常
- 在$.getJSON异常之后对JSON数组进行排序
- HTTP响应中数组的异常表示(array: 0x7f7298c057f0)
- 当数组定义为3时,一个Javascript - forth值的神秘工作没有返回异常