实现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
相关产品推荐
相关产品推荐

