You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何复制数组后调用sort()会导致两个数组同时被排序?

为什么复制数组后调用sort()会让两个数组都被排序?

先看你提供的示例代码:

c = [2,4,9,1,10];
b = c;
b.sort();
console.log(b+" "+c)

你预期c保持原数组不变,但实际b和c都被排序了,核心原因有两个:

  1. 数组是引用类型,赋值不传值而是传引用
    JavaScript里的数组、对象这类引用类型,变量存储的不是数据本身,而是数据在内存中的地址。当你写b = c时,并没有复制出一个新数组,只是让变量b和c指向了内存里的同一个数组对象。相当于给同一个数组贴了两个标签,操作任意一个标签,本质都是在操作同一个数组。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 14:22:13