有关V8数组的一个BUG,不知道大家有没有关注过
发布于 10 年前 作者 PerterPon 4008 次浏览 最后一次编辑是 8 年前

看如下两段代码,目前在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 回复

老的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操作符的代码,貌似牵涉的比较多,一时间还找不到。

@PerterPon 看源码下 node-v0.10.28\deps\v8\ChangeLog 这个,里面有v8版本。

回到顶部