# 一行JavaScript代码:用push()往数组里「塞」元素,到底发生了什么?
最近在帮朋友调试前端代码时,发现他对数组的`push()`方法理解得不太透彻。他写了一段代码,但对执行结果一知半解,于是我决定用这篇博客帮他(也帮你)彻底搞明白——当我们调用`push()`时,JavaScript到底在背后做了什么。
---
## 先看一段简单的代码
我们从一个具体的例子入手。假设你有一个数组,里面存着几个名字:
```javascript
let rows = ["Naomi", "Quincy", "CamperChan"];
```
现在需要往这个数组里新增一个元素`"freeCodeCamp"`,你会怎么做?最常见的写法就是用`push()`:
```javascript
let pushed = rows.push("freeCodeCamp");
```
这两行代码看起来很简单,但背后藏着不少细节。我们一步一步拆解。
---
## 第一步:声明一个数组
首先看第一行代码:
`let rows = ["Naomi", "Quincy", "CamperChan"];`
这里做了两件事:
1. 用`let`声明了一个变量`rows`(`let`是ES6引入的变量声明方式,允许后续修改变量值);
2. 把一个**数组**赋值给它。数组是用方括号`[]`包裹的有序数据集合,这里的元素是三个字符串:`"Naomi"`、`"Quincy"`、`"CamperChan"`。
此时,`rows`数组的状态是这样的:
`["Naomi", "Quincy", "CamperChan"]`,长度是3(可以通过`rows.length`查看到)。
---
## 第二步:用push()往数组里「塞」新元素
接下来是关键的一行:
`let pushed = rows.push("freeCodeCamp");`
这行代码的作用很明确:往`rows`数组的末尾添加一个新元素`"freeCodeCamp"`。但`push()`方法的特性值得仔细说一说。
### 1. push()会直接修改原数组
和其他一些数组方法(比如`map()`、`filter()`)不同,`push()`**不会创建新数组**,而是直接在原数组的末尾「追加」元素。
举个例子:执行完`rows.push("freeCodeCamp")`后,原来的`rows`数组就被「改」了——它不再只有3个元素,而是变成了:
`["Naomi", "Quincy", "CamperChan", "freeCodeCamp"]`。
这种「直接修改原数组」的特性,我们称为「副作用」(在函数式编程中,副作用通常指对数据的直接修改)。不过对于`push()`来说,这是它的设计目的,所以不必担心「破坏数据」,反而是它的优势——高效。
### 2. push()的返回值是新数组的长度
再回到这行代码:`let pushed = rows.push("freeCodeCamp");`
这里的`pushed`变量存储的是`push()`方法的**返回值**。那`push()`返回什么呢?答案是:**添加元素后,数组的新长度**。
比如原来的`rows`长度是3,添加1个元素后,长度变成4,所以`pushed`的值就是`4`。
我们可以验证一下:
执行完这两行代码后,打印`rows`会得到`["Naomi", "Quincy", "CamperChan", "freeCodeCamp"]`,而`console.log(pushed)`会输出`4`。
---
## 总结:push()的「使用说明书」
通过这个例子,我们可以总结出`push()`的核心特点:
- **作用**:向数组末尾添加一个或多个元素(比如`rows.push("A", "B")`会一次加两个);
- **修改原数组**:直接改变原数组的内容,而不是生成新数组;
- **返回值**:新数组的长度(不是被添加的元素,也不是原数组长度)。
下次你在代码里用`push()`时,记得这三个点,就能避免很多小错误。比如:
如果你想保留原数组,同时生成一个包含新元素的新数组,应该用`concat()`(比如`const newArr = oldArr.concat("newItem")`);而如果只是想简单地在原数组里「塞」元素,`push()`就是最直接的选择。
---
最后,再强调一个小细节:`push()`可以接收多个参数,它们会被依次添加到数组末尾。比如:
`rows.push("Diana", "Evan");`
执行后,`rows`会变成`["Naomi", "Quincy", "CamperChan", "freeCodeCamp", "Diana", "Evan"]`,长度是6。
是不是很灵活?这就是JavaScript数组方法的魅力~
>学编程哪有什么「天赋异禀」?不过是多了点「死磕」的耐心——敲错的语法、卡壳的逻辑、反复调试的报错,这些看似恼人的「坎儿」,其实都是成长的刻度。
>当你第一次写出能运行的代码时,当你终于搞懂那个绕了三天的逻辑时,当你用自己写的程序解决了一个实际问题时……这些瞬间会告诉你:**所有敲键盘的夜晚、揉着头发叹气的瞬间、咬着牙再试一次的坚持,都在悄悄攒着未来的底气**。
>编程不难,难的是「开始」和「坚持」。但相信我——你现在敲下的每一行代码,都会在某一天,变成你指尖的光。
一行JavaScript代码:用push往数组里「塞」元素,到底发生了什么? – 副本
1 分钟阅读
116 字
如果文章对您有帮助,欢迎支持作者继续创作