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

实现freeCodeCamp数组插入函数时:为何直接赋值数组会修改原数组,而使用slice()则不会?

为什么直接赋值数组会修改原数组,而slice()不会?

这是JavaScript里引用类型的核心特性导致的,我给你一步步拆解明白:

1. JavaScript数组是引用类型

在JS里,数组(还有对象、函数这类)属于引用类型,和数字、字符串这类基本类型有着本质区别:

  • 基本类型赋值时,是把具体的值完整复制给新变量,两个变量完全独立,修改其中一个绝不会影响另一个。
  • 引用类型赋值时,复制的只是指向堆内存中实际数组对象的内存地址(引用),新变量和原变量其实共享同一个数组对象。

2. 两种赋值方式的具体差异

  • 当你写dummy_arr2 = arr2时:
    dummy_arr2和arr2其实是同一个数组对象的“别名”,后续你对dummy_arr2调用splice()(这是会直接修改数组本身的方法),本质上是在修改那个共享的数组对象,所以原数组arr2自然会被同步修改,完全违反了题目“输入数组保持不变”的要求。

  • 当你用arr2.slice()时:
    slice()方法默认会创建一个原数组的浅拷贝(不传参数时会复制从索引0到末尾的所有元素),这个新数组是一个完全独立的对象,拥有自己的内存空间。后续对dummy_arr2的任何修改,都只会作用在这个拷贝上,原数组arr2不会受到任何影响,完美符合题目的要求。

补充:浅拷贝的边界说明

如果你的数组里包含对象、嵌套数组这类引用类型元素,slice()的浅拷贝不会复制这些元素本身,只会复制它们的引用。但题目要求的是“输入数组保持不变”,这里的不变指的是数组的结构(元素的插入、删除顺序),所以浅拷贝已经足够满足需求了。

内容的提问来源于stack exchange,提问作者untitiledunmastered

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 05:47:31