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

为何JavaScript中使用pop()定义变量会修改原数组?

问题描述
const threeArr = [1, 4, 6];
const oneDown = threeArr.pop();
console.log(oneDown);
console.log(threeArr); 

第一个console.log输出6,这符合预期,因为变量oneDown获取了数组的最后一个元素。

但我无法理解第二个console.log为何输出[1, 4],我原以为会输出[1, 4, 6],因为我并没有主动修改threeArr。

我只是在定义oneDown时对threeArr进行了操作,但没想到这会影响threeArr本身的值?

通过简单示例尝试理解

我最初以为这是JavaScript的基础特性:如果用变量A的修改结果定义变量B,会同时改变变量A的值。

于是我用一个简单示例测试:

const threeArr = 1 + 2;
const oneDown = threeArr + 1;
console.log(threeArr);
console.log(oneDown);

但这个示例符合预期:第一个console.log输出3(threeArr的值未被修改),第二个输出4,这和pop示例的表现完全不同。

问题解答

核心原因是JavaScript中原始值和引用值的存储与操作方式不同:

  • 数组属于引用值
    pop()是数组的原地修改方法,调用它时会直接修改原数组本身——移除最后一个元素,同时返回被移除的元素。所以你调用threeArr.pop()时,threeArr已经被直接修改了,oneDown只是拿到了被移除的元素值。

  • 数字属于原始值
    像数字、字符串、布尔这类原始值,变量存储的是值本身。当你执行threeArr + 1时,只是基于原数值计算出一个新值,并不会修改原变量存储的内容,所以threeArr的值保持不变。

如果想在不修改原数组的前提下获取最后一个元素,可以用threeArr[threeArr.length - 1]直接读取,或者先复制数组再调用pop(),比如:

const threeArr = [1, 4, 6];
const arrCopy = [...threeArr]; // 复制原数组
const oneDown = arrCopy.pop();
console.log(oneDown); // 6
console.log(threeArr); // [1,4,6]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 07:35:07