Javascript 当代码中缺少“[]”时意味着什么?

Javascript 当代码中缺少“[]”时意味着什么?,javascript,immutable.js,Javascript,Immutable.js,我已经写了这段代码 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

我已经写了这段代码

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},[…]}

我意识到这是因为我没有放入一对[]来正确地封装地图对象。一旦我放入它们,它将按预期工作:

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接受参数而不兼容

当[]从该代码中漏掉时,这意味着什么

这意味着您将向Immutable.List传递两个参数,而不是一个。简化示例:

// two arguments
foo(a, b)
// vs
// array as single argument
foo([a, b])
如果您将看到不可变的,则.List只对第一个参数执行某些操作,而忽略第二个参数

因此,您的第一个示例相当于

   data: new Immutable.List(
      new Immutable.Map({
        code: 'a',
        label: 'Sydney',
        percentage: 35 / 40,
      }),
    ),
它是如何从中派生出['code',a']的,这是不可变js特有的。它似乎以某种方式将参数转换为iterable。您可能可以通过遵循源代码来了解它

为什么这两个贴图对象会变平

他们没有

为什么ImmutableList在不兼容的情况下接受参数

JavaScript是动态类型化的,您可以向函数传递任意多或少的参数,而不考虑函数的形式参数

列表的实现方式似乎可以接受任何类型的iterable,它试图充分利用您传递给它的值