JavaScript 中传播语法的意外行为
Unexpected behavior from the spread syntax in JavaScript
我正在对 spread syntax 进行试验,但在特定情况下很难从理性上理解它的行为。
在一个实例中,当我使用:
const art = ["hello"]
console.log( [{...art}] )
the return value is
=> [ { '0': 'hello' } ]
但是,当我遍历单个数组值时,它会产生完全不同的效果:
const art2 = art.map((item) => ({ ...item }))
console.log(art2)
=> [ { '0': 'h', '1': 'e', '2': 'l', '3': 'l', '4': 'o' } ]
为什么在第一个例子中使用展开语法只将它与一个索引组合在一起,而在第二个例子中使用.map 将它分解成不同的索引元素?由于 art 数组中只有一个项目,我会假设结果是相同的。
在第一个代码中,您传播了一个 array,其中包含一个项目,第 0 个索引处的字符串:
console.log({ ...["hello"] });
一切如期而至。但是在第二个代码中,您首先在数组上调用 .map
,然后 然后 传播第一个 argument 提供给 .map
函数 - 传播的项目不是数组,而是数组 包含的项目 ,在本例中,它是一个字符串。传播字符串时,您将获得与每个字符索引处的值匹配的属性:
console.log(['hello'].map((item) => ({ ...item })))
// same as:
console.log({ ...'hello' });
它们是完全不同的情况。
两个结果都符合预期。
在第一种情况下,您将整个数组传递给传播运算符
const art = ["hello"]
console.log( [{...art}] )
所以 spread operator
一次应用于整个数组。
在第二种情况下,首先您使用 .map()
迭代 数组,即您选择每个 item
并将 item
传递给spread operator
。
const art2 = art.map((item) => ({ ...item }))
console.log(art2)
因此 spread operator
应用于每个项目。
const art = ["hello"]
在上述情况下,您尝试展开数组。所以它会给你以下输出:
[ { '0': 'hello' } ]
现在您尝试执行以下一个
const art2 = art.map((item) => ({ ...item }))
所以你在这里使用了地图。 Map 是一种获取数组的一个元素并将映射器应用于它的东西。
在您的情况下,您的映射器将传播给定的元素。所以现在它会传播你已经通过的元素。所以你得到的输出是:
[ { '0': 'h', '1': 'e', '2': 'l', '3': 'l', '4': 'o' } ]
我正在对 spread syntax 进行试验,但在特定情况下很难从理性上理解它的行为。
在一个实例中,当我使用:
const art = ["hello"]
console.log( [{...art}] )
the return value is
=> [ { '0': 'hello' } ]
但是,当我遍历单个数组值时,它会产生完全不同的效果:
const art2 = art.map((item) => ({ ...item }))
console.log(art2)
=> [ { '0': 'h', '1': 'e', '2': 'l', '3': 'l', '4': 'o' } ]
为什么在第一个例子中使用展开语法只将它与一个索引组合在一起,而在第二个例子中使用.map 将它分解成不同的索引元素?由于 art 数组中只有一个项目,我会假设结果是相同的。
在第一个代码中,您传播了一个 array,其中包含一个项目,第 0 个索引处的字符串:
console.log({ ...["hello"] });
一切如期而至。但是在第二个代码中,您首先在数组上调用 .map
,然后 然后 传播第一个 argument 提供给 .map
函数 - 传播的项目不是数组,而是数组 包含的项目 ,在本例中,它是一个字符串。传播字符串时,您将获得与每个字符索引处的值匹配的属性:
console.log(['hello'].map((item) => ({ ...item })))
// same as:
console.log({ ...'hello' });
它们是完全不同的情况。
两个结果都符合预期。
在第一种情况下,您将整个数组传递给传播运算符
const art = ["hello"]
console.log( [{...art}] )
所以 spread operator
一次应用于整个数组。
在第二种情况下,首先您使用 .map()
迭代 数组,即您选择每个 item
并将 item
传递给spread operator
。
const art2 = art.map((item) => ({ ...item }))
console.log(art2)
因此 spread operator
应用于每个项目。
const art = ["hello"]
在上述情况下,您尝试展开数组。所以它会给你以下输出:
[ { '0': 'hello' } ]
现在您尝试执行以下一个
const art2 = art.map((item) => ({ ...item }))
所以你在这里使用了地图。 Map 是一种获取数组的一个元素并将映射器应用于它的东西。 在您的情况下,您的映射器将传播给定的元素。所以现在它会传播你已经通过的元素。所以你得到的输出是:
[ { '0': 'h', '1': 'e', '2': 'l', '3': 'l', '4': 'o' } ]