我们在每个页面上都有一个包含许多属性的数组。有时它有一个"值"属性。我们用myArrayObject['values']
检查这个并期望字符串或未定义。
更新到Chrome 38 myArrayObject['values']
后,返回function values() { [native code] }
经过一番挖掘后,这似乎与V8 ticket实施@@unscopables for the 6th Edition of ecmascript有关。 两个月前这些变化是committed。一个开发人员尝试roll them back with the note that they were "web-breaking"之后不久。
所以问题是,Array.values()是一个没有文档的功能,早期采用ecmascript-6草案,bug还是其他什么?这会被回滚吗?我应该注意哪些其他即将发生的变化?
Chrome 38.0.2125.101(在Win7 64上)中的小示例:
var test=new Array();
// items pushed and popped
...
// test['values'] may have been set at some point
test['values']; //returns a function pointer: function values() { [native code] }.
// yesterday this returned undefined
编辑:从Bergi的回答中,这看起来像是ES6的一个功能。
在规范发布前几个月,是否会有更多ES6 功能在后台补丁中推出?我能做些什么来保护我们的平台?有什么方法可以请求ES5兼容模式吗?
答案 0 :(得分:6)
是的,Array.prototype.values
来自ES6草案。这是一个返回数组值的迭代器的方法。
如果要在数组中存储未经数字索引的值,则不应使用Array
而应使用普通对象(或者,在ES6中使用Map
)。
答案 1 :(得分:2)
更正,@@ unscopables从未从V8回滚 - 你链接到的第二个变化只是准备用于紧急情况,但幸运的是,我们不需要它,它是从未犯过。所以@@ unscopables在Chrome 38中提供,因此Array.prototype.values也是如此。
无法关闭ES6功能,因为这样做不会具有前瞻性,依赖它的代码注定会在几个月或其他浏览器中崩溃。
ES委员会通常非常小心,不要“打破网络”。实际上,这意味着没有实际用例应该中断,即Web上已经发生的事情。严格地说,任何改变都会破坏一些假设的代码,因为即使是全新的特征也会显着地改变'eval'的行为。如果我们甚至避免使用严格的标准,那么这种语言就永远不会发展出来。
据我所知,您的具体示例并未出现在野外。正如其他人所回答的那样,在这种情况下没有理由使用数组,[] -syntax与普通对象一样好用。当索引是特定的整数时,你只需要数组。
以前使用新的Array.prototype.values方法浮出水面的唯一网络破坏问题与'with'结构(你不应该使用它)有关。然后介绍了@@ unscopables来解决这个问题。
由于Microsoft OWA 2013中存在错误, 编辑: .values
必须再次从V8中删除。但请将此视为临时措施。 Microsoft已意识到此问题,.values
将尽快返回。
答案 2 :(得分:1)
Google Chrome 38.0.2125.111不再实施Array.prototype.values。
这个小测试
var myArray = new Array();
alert(myArray['values']);
alert(myArray['anotherparameter']);
为两个警报返回undefined
。
但是,方法hasOwnProperty
可用于确定数组是否具有名为values
的属性:
var myArray = new Array();
alert(myArray.hasOwnProperty('values')); // alert false
myArray['values'] = "Hello";
alert(myArray.hasOwnProperty('values')); // alert true
这适用于像Opera 25.0.1614.63
那样实现Array.prototype.values
的浏览器