2015-08-14 37 views
3

我有以下代碼,從現實世界的示例中簡化。ES6/Babel傳播錯誤與集合

let arr = [0,1,2], 
    s = new Set(arr); 

let arr2 = [...s]; 
alert('3 == ' + arr2.length); 

的問題是,這種失敗,併產生對谷歌瀏覽器的空ARR2具有天然集的實現,但是一個polyfilled Array.from。有趣的是,它在IE11上正常工作,IE11有一個填充Array.from AND Set。

巴貝爾轉換蔓延,設定到這個

var arr2 = [].concat(_toConsumableArray(s)); 

_toConsumableArray回報Array.from。我在_toConsumableArray內設置了一個斷點,我可以看到它通過調用Array.from生成一個空數組。

我的問題是,這是在Array.from填充工具的錯誤,因爲它不能正確處理本地(不polyfilled)設置,或與巴貝爾代碼的問題,在Array.from(x)不是...x(當x不是數組時)完美等價。

+1

嘗試在[「試試看」中的代碼](http://babeljs.io/repl/#?experimental=true&evaluate=true&loose=false&spec=false&playground=false&code=let%20arr%20%3D%20% 5B0 2C1%2C2%%5D%2C%0A%20%20%20%20歲%20%3D%20new%20Set(ARR)%3B%0A%0Alet%20arr2%20%3D%20%5B內容S在巴貝爾在Chrome 44的網站上生成'3 == 3'%5D%3B%0Aalert('3%20%3D%3D%20'%20%2B%20arr2.length)%3B)你確定你已經正確設置了你的polyfills嗎? – loganfsmyth

+0

@loganfsmyth - funny - 如果缺少Set,Symbol和其他一些我缺少的東西,我有條件地加載了babel polyfill。我手動添加了MDN Array.from polyfill,因此Chrome不需要它。禁用並強制ES6墊片使其工作。 Bug必須是w/MDN填充。 –

+1

你介意告訴使用哪個*'Array.from'的polyfill你正在使用? (儘管我無法看到它在這裏使用的地方)。另外,你的Chrome版本是什麼?我根本不支持'[... s]'語法。 – Bergi

回答

6

我可以看到它通過調用Array.from產生一個空數組。這是MDN的Array.from polyfill中的錯誤嗎?

不是一個真正的錯誤,但實際上properly documented

此外,由於真正的iterables不能polyfilled,如在ECMA-262的第6版定義的這個實現不支持通用iterables 。

我認爲這指的是ES5中缺少Symbol.iterator

+0

否則請求[作者爲polyfill]的Jordan Harband(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from$compare?to=648147&from=642269) :-) – Bergi

+0

這對我來說簡直是莫名其妙,因爲某些東西不能完全填充,所以它們傳遞了一個很好的東西(可以和core-js/Babel一起工作)。 –