Array.splice() 在数组文字上以一种方式运行,在保存为 const 的数组上以另一种方式运行

Wil*_*llD 0 javascript arrays

所以这会很短。

我有以下代码:

const foo = [1,2,3,4].splice(2, 1);
console.log("foo", foo);
// [3]

const bar = [1,2,3,4]
bar.splice(2, 1);
console.log("bar", bar);
// [1, 2, 4]
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,如果你运行它(至少在 Chrome 中) foo 控制台到一个具有单个值的数组, 3其中 bar 控制台到一个包含所有项目的三项数组, 3

造成这种差异的原因是什么?

Cer*_*nce 5

splice会做两件事:

  • 给定参数,它将从数组中删除(或添加)项目(第一个参数是索引,第二个参数是要删除的项目数)
  • 它将以数组形式返回删除的项目

它不返回更改后的(或原始的)数组。所以

const foo = [1,2,3,4].splice(2, 1);
console.log("foo", foo);
Run Code Online (Sandbox Code Playgroud)

表现符合预期;它删除索引 2 处的项目(即3)并将其作为数组返回,因此foo计算结果为[3](包含单个删除项目的数组)。

const bar = [1,2,3,4]
bar.splice(2, 1);
console.log("bar", bar);
Run Code Online (Sandbox Code Playgroud)

索引 2 处的项目将从bar数组中删除,但随后您继续记录更改后的bar数组,并3删除该项目,因此结果是[1, 2, 4]

如果您将调用结果分配splice给某个对象然后记录其他变量,可能会更清楚:

const foo = [1,2,3,4].splice(2, 1);
console.log("foo", foo);
Run Code Online (Sandbox Code Playgroud)