【问题标题】:ecmascript 6 features found in Chrome 38Chrome 38 中的 ecmascript 6 功能
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 看起来 ES6 计划在 2015 年夏天发布。为什么用户现在看到了变化?
  • 因为 ES 实现正在试验这些提案,以便人们可以试用它们并提供反馈(很多特性都被大量讨论,并且针对很多问题提出了多种解决方案)。一旦某个功能足够成熟,它就会从实验版本中向公众发布。
  • 所以随着规范的最终确定,这些变化会慢慢滴下来吗?在我们准备好之前,我能做些什么来避免它们?
  • 规范的发布日期是特性的行为确定的时间,而不是它们实现的时间。它将代表各相关人员已达成的共识。例如。 FF2 早在 2006 年就有 let 语句 - 现在 ES6 将稍微改变它们的语义,并且其他实现将跟进以变得兼容(这可能会再次持续更长的时间)。网络一直 - 并且将永远 - 非常多样化:-)
  • 我认为您无法避免它们。当然 ES6 关心的是向后兼容性,以及不“破坏网络”,但它不会关心旧的错误代码。
【解决方案2】:

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

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

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

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

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

编辑: .values 必须再次从 V8 中删除,因为 Microsoft 的 OWA 2013 中存在错误。但请考虑这是一种临时措施。 Microsoft 已意识到此问题,.values 将尽快返回。

【讨论】:

    【解决方案3】:

    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
    

    这适用于实现 Array.prototype.values 的浏览器,例如 Opera 25.0.1614.63

    【讨论】:

      猜你喜欢
      • 2016-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2017-10-18
      • 2015-08-16
      • 2013-06-24
      相关资源
      最近更新 更多