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

修改变量值的方法有哪些?数组引用类型赋值疑问

为什么修改嵌套数组会影响concat后的结果?

咱们先把你提到的代码贴出来,方便对照分析:

var num1 = [[1]]; 
var num2 = [2, [3]]; 
var nums = num1.concat(num2); 
console.log(nums); // 输出: [[1], 2, [3]]
num1[0].push(4); 
console.log(nums); // 输出: [[1,4], 2, [3]]

而当你改成直接给num2 push 4时:

var num1 = [[1]]; 
var num2 = [2, [3]]; 
var nums = num1.concat(num2); 
console.log(nums); // 输出: [[1], 2, [3]]
num2.push(4); 
console.log(nums); // 输出还是: [[1], 2, [3]]

核心原因在于JavaScript的浅拷贝机制和原始值与引用类型的区别:

  • 首先,concat方法对数组做的是浅拷贝:
    • 如果数组元素是原始值(比如数字、字符串、布尔值这些),concat会把值复制一份放到新数组里,新数组里的元素和原数组的元素是完全独立的,修改原数组的原始值不会影响新数组。
    • 如果数组元素是引用类型(比如数组、对象),concat只会复制这个元素的引用(也就是内存地址),新数组里的元素和原数组里的元素指向的是同一个内存对象。这时候修改这个对象的内容,所有指向它的引用都会看到变化。

咱们对应你的两种场景拆解:

  1. 修改嵌套数组的情况:
    num1是[[1]],里面的[1]是一个数组(引用类型)。concat之后,nums的第一个元素和num1[0]指向的是同一个数组。所以当你执行num1[0].push(4)时,其实是在修改这个共享的数组内容,nums里对应的元素自然也会跟着变化。

  2. 直接给num2 push的情况:
    nums是concat创建的新数组,它和num2是两个独立的数组。你给num2.push(4)只是在原num2数组的末尾添加元素,并不会影响已经创建好的nums数组的结构和内容——因为nums已经是一个新数组,和num2本身没有引用关联了。

简单总结就是:修改引用类型的内部内容会影响所有指向它的变量;而修改数组本身的结构(比如push新元素),只会影响原数组,不会影响浅拷贝出来的新数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:45:21