CNode

有关V8数组的一个BUG,不知道大家有没有关注过

PPerterPon发布于12 年前最后回复12 年前3 回复4822 浏览0 收藏

看如下两段代码,目前在chrome上执行都会报错,记得年前的时候还是不会报错的,firefox比较标准一直都会报错,现在node官网0.10.28版本依旧不会报错,对第一段代码执行如下逻辑就死循环了 while( a.length ) { a.pop(); ..... },请问下各位这是什么原因造成的。

var a = [ 0, 1, 2, 3 ];
Object.defineProperty( a, 3, {
  writable     : false,
  enumerable   : false,
  configurable : false,
} );
a.pop();
console.log( a );
// [ 0, 1, 2, 3 ]
var a = [ 0, 1, 2, 3 ];
Object.defineProperty( a, 0, {
  writable     : false,
  enumerable   : false,
  configurable : false,
} );
a.shift();
console.log( a );
// [ 1, 2, 3 ]
查看回复

回复 (3)

P
pathletboy#1·12 年前

老的v8没遵守ECMA 262 5.1,node 0.10.28的v8引擎版本是Version 3.14.5,2012-10-22更新的,可以自己更新下V8。

P
PerterPon#2·12 年前
引用 pathletboy老的v8没遵守ECMA 262 5.1,node 0.10.28的v8引擎版本是Version 3.14.5,2012 10 22更新的,可以自己更新下V8。

2013-10-22吧? 在2013-10-25的一次commit中发现的如下代码解决了这个问题

@@ -430,7 +430,7 @@ function ArrayPop() {
  
    n--;
    var value = this[n];
 -  delete this[n];
 +  Delete(this, ToName(n), true);
    this.length = n;
    return value;
  }

原先pop方法是用JS的delete操作符删除的,后来使用了内建函数Delete函数,看了下这个函数,会判断元素是否configurable,否则会抛出一个错误,想找找看js的delete操作符的代码,貌似牵涉的比较多,一时间还找不到。

P
pathletboy#3·12 年前
参与回复
登录后即可参与回复。登录