Chrome 38中的ecmascript 6功能
ecmascript 6 features found in Chrome 38
我们有一个数组,每个页面上都有许多属性。有时它具有"值"属性。我们用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
的浏览器
- 添加文字和评论功能更新Div
- JavaScript打印功能使日历停止工作
- 每当您在选择器内移动鼠标时,悬停功能就会重复
- 如何防止网页加载后自动启动功能
- 除修剪外的其他功能
- 悬停功能触发器
- 使用angularjs向浏览器发送servlet响应(下载功能)
- 删除CKEditor工具栏按钮,但不删除功能
- 异步facebook功能
- 如何将chrome扩展功能移植到移动设备(特别是jquery和trello)
- jQuery滚动功能只工作一次
- Graphiti中是否有任何工具提示功能
- React redux初始化功能,无论状态变化如何
- 在哪里可以学习ECMAScript标准中尚未包含的JavaScript功能
- 正在获取select上的功能id
- Rhino打印功能
- 使用(navigator.geolocation)检测浏览器功能错误
- Node.js 0.12中提供了ECMAScript 6功能
- Chrome 38中的ecmascript 6功能
- 如何使用'让'(以及支持的ECMAScript 6功能)