有关V8数组的一个BUG,不知道大家有没有关注过
看如下两段代码,目前在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版本。