我写了这段代码
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 :(得分: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
似乎是以接受任何类型的“可迭代”的方式实现的,并且它试图从传递给它的值中发挥最大效果。