2015-10-20 62 views
0

我寫的代碼這個代碼中遺漏了`[]`是什麼意思?

let content = new Immutable.Map({ 
    metadata: new Immutable.Map({ 
     cities: 2 
    }), 
    data: new Immutable.List(
     new Immutable.Map({ 
     code: 'a', 
     label: 'Sydney', 
     percentage: 35/40, 
     }), 
     new Immutable.Map({ 
     code: 'b', 
     label: 'Melbourne', 
     percentage: 22/40, 
     }), 
    ), 
    }) 

此位當我做content.getIn(['data'])我得到一個['code', 'a']。但我實際上期待這樣的地圖對象列表[{'code':'a', 'label':'Sydney', 'percentage':0.875}, [...]}

我意識到這是因爲我沒有把一對[]妥善包圍Map對象。它將按預期工作,一旦我把它們放在:

let content = new Immutable.Map({ 
    metadata: new Immutable.Map({ 
     cities: 2 
    }), 
    data: new Immutable.List([ // <-- missed [ 
     new Immutable.Map({ 
     code: 'a', 
     label: 'Sydney', 
     percentage: 35/40, 
     }), 
     new Immutable.Map({ 
     code: 'b', 
     label: 'Melbourne', 
     percentage: 22/40, 
     }), 
    ]), // <- missed ']' 
    }) 

但是沒有錯誤時,我原來的代碼版本被編譯爲JavaScript。 es6解析器如何真正理解它?爲什麼兩個map對象變平坦,爲什麼ImmutableList接受不兼容的參數?

回答

0

這段代碼錯過[]是什麼意思?

這意味着要傳遞參數Immutable.List,而不是一個。簡單的例子:

// two arguments 
foo(a, b) 
// vs 
// array as single argument 
foo([a, b]) 

如果look at the source你會看到Immutable.List只能做一些事情的第一個參數,而忽略第二。

所以,你的第一個例子相當於

data: new Immutable.List(
     new Immutable.Map({ 
     code: 'a', 
     label: 'Sydney', 
     percentage: 35/40, 
     }), 
    ), 

它究竟是如何得出['code', 'a']從它特定於不可改變的js。它似乎將參數轉換爲可迭代的一種或另一種方式。您可以通過遵循源代碼來弄清楚它。

爲什麼兩個地圖對象將會被夷爲平地

他們不知道。

爲什麼ImmutableList接受不符合參數?

JavaScript是動態類型的,您可以根據需要傳遞儘可能多的(或少數)參數,而不考慮其形式參數。

Immutable.List似乎以這種方式實現接受任何類型的「可迭代」,並試圖使您傳遞給它的值最好。