2015-11-23 45 views
12

下面的ES6代码片段无效。它曾经是有效的。我仍然可以在老版本的Traceur中运行它,但最新的Babel和Traceur似乎不再喜欢阵列中的for循环。谁能告诉我为什么它不再有效。ES6阵列解析不再有效吗?

let people = [ 
    { 
     "firstName": "Belinda", 
     "phone": "1-607-194-5530", 
     "email": "[email protected]" 
    }, 
    { 
     "firstName": "Elizabeth", 
     "phone": "1-155-446-1624", 
     "email": "[email protected]" 
    } 
] 

let phones = [for({phone} of people) phone]; 
console.log(phones) 

以下代码段是有效的ES6所以我知道自毁内部的for循环是OK

for(let {phone} of people) { 
    console.log(phone) 
} 
+3

这是一个[阵列理解](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Array_comprehensions),它是从未在ES6降落的实验建议/ ES2015 –

回答

18

阵列内涵是removed in BabelJS version 6ES2015 Specification没有提及理解,所以他们可能被丢弃。通过ES Discuss邮件列表档案快速搜索任何明确的内容都是空白的。

作为稍微更详细的替代方案,有Object.entries(ES7中的stage-3功能)和Array.prototype.map

let emails = people.map(({ email }) => email); 
+4

或者:'Array.from(people,({email})=> email);'这将适用于任何迭代。 – loganfsmyth

+3

为什么'Object.entries'? 'people'是一个数组,你想要一个简单的'people.map(_ => _.email)' – Bergi

+1

Thanks @bergi。我真的不能说。由于某种原因,我疲惫的眼睛让人产生了一种反应我更新了片段。 –

7

谁能告诉我,为什么它不再有效。

阵列理解没有使它成为ES6的最终版本,它似乎并没有被认为是下一个版本之一:https://github.com/tc39/ecma262

9

http://exploringjs.com/es6/ch_faq.html#_does-es6-have-array-comprehensions是有帮助的:

最初,ES6是有阵列和发电机内涵 (类似于Haskell和Python)的。但他们推迟到以后 ES6,因为TC39想探索两款途径:

  • 它可能会创建一个任意 数据类型(认为微软的LINQ)工作的内涵。
  • 迭代器的方法 也可能是一个更好的方法来实现什么理解 做。
+3

Comprehensions as数学意义上的集合构建器是Python的一个惊人特性 - 数学语法与python的语法非常接近,因此使用与python相同的语法对于那些语言来说会有多糟糕......它已经发展并经过无数次测试项目。为什么重新发明这个强大的工具已经可以工作了...... –