为何仅排序array1,用new Array创建的array2也被排序?(JavaScript)
为什么对array1执行sort()后,array2也被排序了?
复现代码
let array1 = [88,66,33,44,11,67,32,56]; let array2 = new Array(array1); array1.sort(); console.log(array2);
问题说明
创建包含随机数值的array1,用new Array(array1)创建array2,仅对array1调用sort()方法,打印array2时却发现它也被排序了,预期array2应该保持未排序状态,想知道原因。
原因分析
new Array(array1)不是创建数组副本:当你把数组(引用类型)传给new Array()时,不会复制原数组的内容,而是生成一个只有1个元素的新数组,这个元素就是原数组array1的引用——简单说,array2[0]和array1指向内存里同一个数组对象。sort()是原地修改方法:Array.prototype.sort()会直接修改调用它的原数组本身,不会返回新数组。
所以你调用array1.sort()时,其实是修改了array1指向的那个数组对象,而array2[0]和它指向同一个对象,自然打印array2时会看到排序后的结果。
正确创建独立数组副本的方法
如果要让array2不受array1修改的影响,需要创建原数组的独立副本,常用方法有三种:
- 扩展运算符:
let array2 = [...array1]; slice()方法:let array2 = array1.slice();Array.from()方法:let array2 = Array.from(array1);
用这些方式创建的array2是全新的数组,和array1互不影响,修改array1不会改变array2的内容。
内容的提问来源于stack exchange,提问作者Corner Stone Developer
相关产品推荐
相关产品推荐

