JavaScript中array.splice()调用差异及=赋值适用场景咨询
一、形参(Parameters)和实参(Arguments)的区分
- 形参(Parameters):函数定义时括号里声明的变量,是函数内部的局部“占位符”,用来接收调用时传入的内容。比如
function foo(array, index)里的array和index就是形参。 - 实参(Arguments):调用函数时实际传入的具体值或引用,是给形参“填充”的实际内容。比如执行
foo([1,2,3], 1)时,[1,2,3]和1就是实参。
二、数组splice调用的两种写法差异
先明确Array.splice()的核心特性:
- 它是原地修改原数组的方法,会直接改变调用它的数组本身;
- 它的返回值是被删除元素组成的新数组(未删除元素则返回空数组)。
第一种写法有效的逻辑
function foo(array, index) { array.splice(index, 1) return array }
数组属于引用类型,函数形参array保存的是原数组的内存地址。调用array.splice()时,会顺着这个地址找到原数组并完成修改。最后返回的array依然指向原数组的引用,所以拿到的是修改后的目标数组,符合需求。
第二种写法“无效”的逻辑
function foo(array, index) { array = array.splice(index, 1) return array }
这里执行array = array.splice(...)时发生了两个关键动作:
- 调用
splice已经原地修改了原数组; - 把
splice返回的被删除元素数组赋值给形参array,此时形参array的指向被改变——从原数组的内存地址,切换为splice返回的新数组地址。
最后返回的是被删除的元素数组,而非修改后的原数组,所以看起来“无效”。
赋值符号=的适用场景
- 基本类型赋值:比如
let a = 1; b = a,是值的拷贝,两个变量后续修改互不影响; - 引用类型赋值:比如
let arr1 = [1,2]; arr2 = arr1,是内存地址的拷贝,两个变量指向同一个数组,修改其中一个会影响另一个; - 改变变量指向:当需要让变量切换指向新的值或引用时使用,比如保存函数返回值、替换变量的引用目标;
- 注意:如果要保留原数组同时得到修改后的新数组,不要用
splice(它会修改原数组),可以用slice结合扩展运算符实现,比如const newArr = [...array.slice(0, index), ...array.slice(index+1)]。
内容的提问来源于stack exchange,提问作者Gennadiy Mostovskiy
相关产品推荐
相关产品推荐

