修改变量值的方法有哪些?数组引用类型赋值疑问
为什么修改嵌套数组会影响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只会复制这个元素的引用(也就是内存地址),新数组里的元素和原数组里的元素指向的是同一个内存对象。这时候修改这个对象的内容,所有指向它的引用都会看到变化。
- 如果数组元素是原始值(比如数字、字符串、布尔值这些),
咱们对应你的两种场景拆解:
修改嵌套数组的情况:
num1是[[1]],里面的[1]是一个数组(引用类型)。concat之后,nums的第一个元素和num1[0]指向的是同一个数组。所以当你执行num1[0].push(4)时,其实是在修改这个共享的数组内容,nums里对应的元素自然也会跟着变化。直接给num2 push的情况:
nums是concat创建的新数组,它和num2是两个独立的数组。你给num2.push(4)只是在原num2数组的末尾添加元素,并不会影响已经创建好的nums数组的结构和内容——因为nums已经是一个新数组,和num2本身没有引用关联了。
简单总结就是:修改引用类型的内部内容会影响所有指向它的变量;而修改数组本身的结构(比如push新元素),只会影响原数组,不会影响浅拷贝出来的新数组。
内容的提问来源于stack exchange,提问作者Moaaz Bhnas
相关产品推荐
相关产品推荐

