有关V8数组的一个BUG,不知道大家有没有关注过 - CNode技术社区

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

看如下两段代码,目前在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版本。

回到顶部

AltStyle によって変換されたページ (->オリジナル) /