为何复制数组后调用sort()会导致两个数组同时被排序?
为什么复制数组后调用sort()会让两个数组都被排序?
先看你提供的示例代码:
c = [2,4,9,1,10]; b = c; b.sort(); console.log(b+" "+c)
你预期c保持原数组不变,但实际b和c都被排序了,核心原因有两个:
数组是引用类型,赋值不传值而是传引用
JavaScript里的数组、对象这类引用类型,变量存储的不是数据本身,而是数据在内存中的地址。当你写b = c时,并没有复制出一个新数组,只是让变量b和c指向了内存里的同一个数组对象。相当于给同一个数组贴了两个标签,操作任意一个标签,本质都是在操作同一个数组。sort()是原地排序方法
sort()方法会直接修改调用它的数组本身,而不是返回一个新的排序后的数组。所以当你调用b.sort()时,其实就是在修改b和c共同指向的那个数组,自然两个变量输出的结果会一致。
正确的数组复制方式
想要让b成为独立的新数组,需要用真正的复制方法,常用的有这几种:
扩展运算符:
const c = [2,4,9,1,10]; const b = [...c]; b.sort(); console.log(b); // [1, 10, 2, 4, 9] console.log(c); // [2,4,9,1,10]Array.from()方法:const b = Array.from(c);slice()方法(不传参数时会复制整个数组):const b = c.slice();concat()方法:const b = [].concat(c);
用这些方法复制后,b会是一个全新的数组,和c指向不同的内存地址,此时对b调用sort()就不会影响原数组c了。
内容的提问来源于stack exchange,提问作者Powl_London
相关产品推荐
相关产品推荐

