2016-03-18 68 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

相關問題