Chrome 38中的ecmascript 6功能

ecmascript 6 features found in Chrome 38

本文关键字:功能 ecmascript 中的 Chrome      更新时间:2023-09-26

我们有一个数组,每个页面上都有许多属性。有时它具有"值"属性。我们用myArrayObject['values']来检查这一点,并期望有一个字符串或未定义。更新到Chrome 38后,myArrayObject['values']返回function values() { [native code] }

经过一番挖掘,这似乎与第6版ecmascript中实现@@unscopables的V8票证有关。这些变化是两个月前做出的。不久之后,一位开发人员试图将它们回滚,并指出它们"破坏了网络"。

所以问题是,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兼容模式吗?

是的,Array.prototype.values来自ES6草案。它是一个为数组的值返回迭代器的方法。

如果要在数组中存储未进行数字索引的值,则不应使用Array,而应使用普通对象(或者在ES6中,使用Map)。

更正,@@unscopables从未从V8中回滚——您链接到的第二个更改只是为紧急情况准备的,但幸运的是,我们不需要它,它从未提交。所以@@unscopables在Chrome 38中发布,因此Array.prototype.values也是如此。

没有办法关闭ES6功能,因为这样做不会很有前瞻性,依赖它的代码注定会在几个月内或其他浏览器上崩溃。

ES委员会通常非常小心,不要"破坏网络"。在实践中,这意味着任何实际用例都不应该中断,即网络上已经发生的事情。严格地说,任何更改都会破坏一些假设的代码,因为即使是全新的功能也会显著地改变"eval"的行为。如果我们把回避作为一个严格的标准,那么语言就永远不会进化。

据我所知,你的具体例子并没有出现在野外。正如其他人所回答的那样,在这种情况下没有理由使用数组,[]-语法与普通对象一样适用。只有当索引是整数时,才需要数组。

以前在新的Array.prototype.values方法中出现的唯一破网问题与"with"构造有关(永远不应该使用)。然后,@unscopables被引入来解决这个问题。

编辑: .values不得不再次从V8中删除,因为Microsoft的OWA 2013中存在一个错误。但考虑一下这是一项临时措施。微软已经意识到了这个问题,.values将尽快返回。

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的浏览器