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

JavaScript中一行与两行调用array splice()结果为何不同?

问题:Array.from链式调用splice与分步调用结果差异原因

代码示例

代码1:

let targetArr = ["hello", "world", "my", "name"];
let errnewArr = Array.from(targetArr).splice(2, 1);
console.log("errnewArr array : " + errnewArr.length);

代码2:

targetArr = ["hello", "world", "my", "name"];
let newArr = Array.from(targetArr);
newArr.splice(2, 1);
console.log("new array : " + newArr.length);

两段代码逻辑相似,仅splice方法的调用形式不同:一段采用Array.from()链式调用splice,另一段先将Array.from()结果赋值给变量再调用splice。但结果差异显著:errnewArr长度为1,newArr长度为3。请问为何会出现该差异?


原因解析

核心差异在于**splice方法的返回值特性**:

  • splice是直接修改原数组的方法,它的返回值是被删除元素组成的数组,而非修改后的原数组本身。

代码1的执行逻辑

Array.from(targetArr).splice(2, 1) 中,Array.from先创建原数组的副本,紧接着调用splice(2,1)——该操作删除副本中索引2的1个元素(即"my"),然后将被删除元素组成的数组(["my"])赋值给errnewArr,因此errnewArr.length为1。而被修改后的副本数组因未被变量保存,直接被垃圾回收。

代码2的执行逻辑

先将Array.from创建的副本赋值给newArr,再调用newArr.splice(2,1)——此时splice直接修改了newArr本身(数组长度从4变为3),而splice返回的被删除元素数组未被接收。最后打印的是修改后newArr的长度,自然为3。

总结:

  • 代码1:变量存储的是splice的返回值(被删元素数组)
  • 代码2:变量存储的是原数组副本,splice修改了该副本,打印的是修改后数组的长度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:05:06