2016-03-18 63 views
1

MDN defines传播运算符的用法仅作用于数组。ES6扩展运算符是否在标准ECMAScript规范的对象上应用?

例如,对于传播运营商正确使用看起来像

var parts = ['shoulders', 'knees']; 
var lyrics = ['head', ...parts, 'and', 'toes']; // ["head", "shoulders", "knees", "and", "toes"] 

,我们已申请蔓延运营商阵列parts上。

in the React docs,他们所使用的价差操作上对象像这样

var props = {}; 
props.foo = x; 
props.bar = y; 
var component = <Component {...props} />; 

如果我真的尝试做这个控制台,我收到一个TypeError

var a = {b:1,c:2} 
console.log(...a); // TypeError 

我的问题是:

  • 正在使用扩散算子ove r对象在规范中实现了一个标准(并且这个用例从MDN文档中省略了,并且我试图展示的控制台示例没有正确完成,从而导致TypeError)?
  • 如果不是一个标准的实现,那么React组件就可以精确的扩展运算符来处理它所做的非标准方法(即作用于对象),并抑制TypeError这样做时不可避免地会出现?
+0

这不是标准尚未:https://github.com/sebmarkbage/ecmascript-rest-spread + https://github.com/tc39/ ecma262 – zerkms

回答

4

如果我真的尝试做这个控制台,我收到一个TypeError

您在这里混淆了一些东西(也不能怪你,如果他们都看起来相似)。

在你的榜样,

console.log(...a); 

...a对象传播的应用。它有时被称为spread syntax(即使这个名称没有真正的名称),这在ES2015中是标准化的。它在函数调用中用作最后一个“参数”,仅适用于迭代器。对象不是可迭代的,因此你得到错误。

对象传播,目前是一个proposal,仅在对象文本使用:

var foo = {x: 42}; 
var bar = {y: 21, ...foo}; // equivalent to Object.assign({y: 21}, foo); 

什么是引擎盖

JSX的使用情况下,怎么回事(<Component {...props} />)又是略有不同的东西,它的一个JSXSpreadAttribute,但它确实反对传播。如果您try it out in Babel你可以看到它转换为:

var _extends = Object.assign || /* polyfill */; 

React.createElement(Component, _extends({ foo: true }, props)); 
3

扩展运算符目前正在标准化,所以它不能与ES2015一起使用。目前它是该流程第二阶段的建议,大概是ES2017规范。

https://github.com/sebmarkbage/ecmascript-rest-spread

它已经可以通过使用一些额外的插件通天向transpiling ES5时利用。这就是你提到的样品中使用的。

http://babeljs.io/docs/plugins/transform-object-rest-spread/

http://babeljs.io/docs/plugins/preset-stage-2/

+0

“还没有在ES6中”---没有ES6这样的东西,从来没有,也永远不会。 – zerkms

+0

你是什么意思?我使用术语ES6?反应文档使用babel从大多数人认为ES6或ES2015转换到以前的版本。在我看来,初学者很难理解这些示例有时需要使用更多插件来实现“尚未标准化”的特性才能获得代码转换(尽管我希望能够使用这种语法)。 –

+0

是的,“还没有在ES6中”意味着它会有一段时间出现在那里,而ES6作为一个标准名称从来没有存在过,现在根本不推荐使用它(因为它指的是假想的标准很奇怪)。已经接受的标准是ES2015,ES2016正在进行中,目前的阶段是ES2017的建议。 – zerkms

相关问题