Javascript 为什么array.map不返回新数组?

Javascript 为什么array.map不返回新数组?,javascript,arrays,ecmascript-6,Javascript,Arrays,Ecmascript 6,我想使用map函数创建数组的副本,但得到的是相同的引用。我不明白为什么。 我希望有另一种方法来创建数组的副本 我使用map函数创建原始数组的副本,然后在副本上使用filter函数对单个元素进行变异。我希望原始数组不会发生变异,但它实际上是变异的 有人能告诉我为什么会发生这种情况的背景信息,以及真正复制数组、创建对不同对象的引用的正确方法吗 const arr = [{name: 'hello'}, {name: 'world'}] const arr2 = arr.map(i => i)

我想使用map函数创建数组的副本,但得到的是相同的引用。我不明白为什么。 我希望有另一种方法来创建数组的副本

我使用map函数创建原始数组的副本,然后在副本上使用filter函数对单个元素进行变异。我希望原始数组不会发生变异,但它实际上是变异的

有人能告诉我为什么会发生这种情况的背景信息,以及真正复制数组、创建对不同对象的引用的正确方法吗

const arr = [{name: 'hello'}, {name: 'world'}] 
const arr2 = arr.map(i => i)
const [partial] = arr2.filter(i => i.name === 'hello')
partial.name = 'HELLO'
arr2[0].name === 'HELLO' // true
arr[0].name === 'HELLO' // true

对象和数组在JavaScript中是引用类型,这意味着,当您复制它们时,您正在复制它们的引用,而引用仍然指向原始对象

因此,当您映射到:

const arr2 = arr.map(i => i);
您正在将项目从
arr
逐个复制到
arr2
。由于这些项是对象,因此只复制它们的引用。您确实有两个不同的数组,但它们包含对相同对象的引用

您可以在映射时使用“扩展”操作符对内部对象进行浅复制:

const arr=[{name:'hello'},{name:'world'}]
const arr2=arr.map(o=>({…o}))//扩展运算符+隐式返回表示法
arr[0]。名称='bye';

console.log(arr[0].name,arr2[0].name)
map
创建一个浅拷贝,这意味着数组本身和所有主值都被复制。对象不是主值,这意味着这将生成包含引用副本的数组副本。当从数组中推送或弹出项目时,您可以看到它确实是一个副本。在本例中,您不修改数组,而是修改数组中的对象@jo_va使用OP提供的代码示例创建一个浅拷贝
.map(i=>i)
@3limin4t0r,在OP的代码中你是完全正确的@Jou_va您的评论放得很好,因为通常
map
用于将数组中的项映射到新值。在此场景中,OP可能会使用
arr.slice()
。或者,您也可以使用,因为排列对象操作符相对较新。对象/属性排列操作符当前处于建议阶段4@乔瓦:是的。。我完全忘了。非常感谢你。我试着用原语做同样的事情,然后我得到了不同的值。我理解您编写的代码,并将在处理数组中的对象时进一步使用它。