从这段代码中错过`[]`是什么意思?

时间:2015-10-20 00:22:27

标签: 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 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接受参数而不遵守?

1 个答案:

答案 0 :(得分: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']特定于immutable-js。它似乎将参数转换为可迭代的方式。您可以通过遵循源代码来解决这个问题。

  

为什么两个地图对象变平了

他们没有。

  

为什么ImmutableList接受不合规的参数?

JavaScript是动态类型的,您可以根据需要向函数传递任意数量(或很少)的参数,而不管其形式参数如何。

Immutable.List似乎是以接受任何类型的“可迭代”的方式实现的,并且它试图从传递给它的值中发挥最大效果。