Javascript array.filter()是否创建新数组?

Javascript array.filter()是否创建新数组?,javascript,arrays,Javascript,Arrays,如文档所述,filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素 根据下面的文档,脚本应该是consoleLearningconsole.log(Arr[0].name)//Learning var Arr = [{name:'Learning'},{name:'Questing'}] var Arr2 = Arr.filter(it=> true); Arr2[0].name = 'Stack-Over-Flow'; console.log(Arr[0].nam


如文档所述,filter()方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素

根据下面的文档,脚本应该是console
Learning

console.log(Arr[0].name)//Learning

var Arr = [{name:'Learning'},{name:'Questing'}]
var Arr2 = Arr.filter(it=> true);
Arr2[0].name = 'Stack-Over-Flow';
console.log(Arr[0].name) // Stack-Over-Flow

是,
.filter
创建了一个新数组,但新数组是唯一创建的新结构。数组中的项保持不变

对于代码,在过滤之后,您有一个新数组,其中包含2个项,其中这两个项都是对原始数组中相同对象的引用。因此,变异新数组中的一个对象会导致旧数组中的对象发生变异,因为它们指向内存中的同一个对象

如果要避免这种情况,您必须首先对阵列进行深度克隆,可能需要使用

const Arr2 = Arr
  .filter(it => true)
  .map(obj => ({ ...obj }));

.filter
确实创建了一个新数组,但从旧数组中筛选出的元素的数组

而旧数组中的元素是对象,因此新数组仍保留其引用。为了避免这种情况,可以执行
.map
来克隆整个新引用的元素

var Arr=[{name:'Learning'},{name:'Questing'}]
var Arr2=Arr.filter(it=>true).map(el=>({…el}));
Arr2[0]。名称='Stack Over Flow';

console.log(Arr[0].name)
它创建一个新数组,但不制作数组内容的深度副本。对象在原始数组和新数组中都被引用。它是
Arr2中的新数组。pop()
不会影响
Arr
。对象仍然是相同的
Arr[0]===Arr2[0]
@IshwarChandraTiwari这正是这个答案在第一行中所说的它确实创建了一个新数组(就像我的答案在第一句中所说的那样)-但是新数组是唯一的新结构created@IshwarChandraTiwari您必须区分新阵列(项目的容器)和新对象(容器中的项目)。
.filter()
创建前一个数组,而不是后一个数组。它不修改旧数组中的对象,它修改旧数组和新数组中都存在的对象。@IshwarChandraTiwari它修改旧数组中的对象。它不修改旧数组本身-旧数组仍然包含相同的2项。数组容器是新的,包含在旧数组仍保留在旧数组中,但相同的项也会放入新数组中,因此更改新数组中的一个项也会导致旧数组看起来不同-尽管旧数组容器尚未更改。因此arr.filter保留引用?@IshwarChandraTiwari对象值始终是其引用rence.a={code>a={foo:1};b=a您仍然有一个对象,但它有两个不同的变量。
b.bar=2;console.log(a)
仍将打印
{foo:1,bar:2}