【发布时间】:2014-10-09 21:55:33
【问题描述】:
我们在每个页面上都有一个包含许多属性的数组。有时它具有“值”属性。我们使用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 草案、错误还是其他什么?这会回滚吗?我还应该注意哪些其他即将发生的变化?
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 兼容模式?
【问题讨论】:
-
JavaScript 中的数组用于数字索引的集合。如果您使用非数字属性名称,您只需要一个普通对象 (
{})。 -
@Pointy 该对象是一个数组,此外,它还获得了一些属性。然而,这不是重点。我将重新表述我的问题,以便更清楚。
-
我的意思是没有理由在 JavaScript 中使用 Array 实例来存储名称为字符串的属性;也就是说,如果你想要一个“地图”,你应该使用一个对象。通常,以这种方式使用数组有效,因为数组是 对象,但这是一个值得商榷的做法。例如,如果您将具有非数字属性的 Array 传递给
JSON.stringify(),您将不会在生成的 JSON 中获得任何这些属性。
标签: javascript google-chrome v8 ecmascript-6