为何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
相关产品推荐
相关产品推荐

