为何部分数组操作会影响原数组,而部分操作不会?
问题解析:数组操作对原数组的影响差异
你遇到的核心矛盾本质是JavaScript中引用类型的参数传递与变量赋值规则导致的,下面拆解具体原因:
1. 为什么arr.splice(0, arr.length)会修改外部的origionalArray
在JavaScript中,数组属于引用类型。当你把origionalArray作为参数传入函数时,函数内的arr变量拿到的是一个指向原数组堆内存数据的引用地址——简单说,arr和origionalArray其实共享同一个数组对象,只是各自的变量存了指向这个对象的“地址”。
而splice是数组的原地修改方法:它直接对当前引用指向的数组对象本身进行操作(清空、删除、添加元素都是直接修改堆内存里的原数据)。所以不管是用arr.splice还是origionalArray.splice,操作的都是同一个数组对象,外部原数组自然会同步变化。
2. 为什么arr = [...tmpArr]不会影响外部的origionalArray
执行arr = [...tmpArr]时,你并没有修改原来的数组对象,而是给函数内的arr变量重新赋值了一个全新的数组引用:[...tmpArr]会创建一个新的数组对象,存在堆内存的另一个地址,然后把这个新地址赋值给函数内的arr。
此时,函数内的arr和外部的origionalArray的引用地址已经完全不同——它们指向两个独立的数组对象,后续对arr的操作自然和原数组无关。
3. 单独用arr.splice(ind, 1)能修改原数组的原因
和第一点逻辑完全一致:splice是原地修改方法,操作的是arr引用指向的原数组对象本身,所以外部的origionalArray会同步看到修改结果。
可以用一个简单类比理解:
- 你和朋友各持一把钥匙(引用地址),能打开同一个箱子(堆内存里的数组对象)。你用钥匙打开箱子清空物品(
splice),朋友再开箱子也会看到空的。 - 但如果你把自己的钥匙扔掉,换了一把新箱子的钥匙(
arr = [...tmpArr]),你对新箱子的操作,和原来的箱子再也没有关系。
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

