这段代码中遗漏了 `[]` 是什么意思?

What does it mean when the `[]` are missed out from this code?

我写了这段代码

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 接受了不兼容的参数?

What does it mean when the [] are missed out from this code?

这意味着您将两个 个参数传递给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'] 特定于 immutable-js。它似乎以一种或另一种方式将参数转换为可迭代的。跟着源码大概就能搞定了。

Why the two map objects get flattened

他们没有。

why ImmutableList accepts the parameters without compliant?

JavaScript 是动态类型的,您可以向函数传递任意多(或少)的参数,而不管其形式参数。

Immutable.List 似乎是以接受任何类型的 "iterable" 的方式实现的,它试图充分利用您传递给它的价值。