Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

v8中pop操作不可删除元素的BUG

  在ES5.1的描述中,当pop方法是调用[[Delete]]内部属性来删除元素的,并且启用异常抛出。但是在目前v8的实现中只是简单的使用delete运算符来处理。这造成了pop遇上[[Configurable]]为false的元素时将无视错误。这种行为可能引起某些代码的死循环。
  假如我们的代码这么写
<script>
var a=[1,2,3,4,5,6,7,8,9];
while(a.length)console.log(a.pop());
</script>
  这是可以正常工作的,每次删除数组的元素长度也缩短,直到数组为空时跳出循环。这个代码很符合逻辑,而且性能还挺高,但是在v8中由于pop屏蔽错误的问题,导致这个a数组如果存在[[Configurable]]为false的元素将产生死循环。
var a=[1,2,3,4,5,6,7,8,9];
Object.defineProperty(a,9,{});
while(a.length)console.log(a.pop()); //死循环(v8)
  在ES5.1的描述中,此处应该抛出TypeError,Firefox上的结果是正确的。
  

  参考:
    http://ecma-international.org/ecma-262/5.1/#sec-15.4.4.6
    http://ecma-international.org/ecma-262/5.1/#sec-8.12.7
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^