JavaScript数组更新元素后原变量值未变的原因咨询
为什么更新数组元素后原变量值没变化?
这是因为JavaScript里的原始类型(比如数字、字符串、布尔值)是按值传递的,当你把number1、number2、number3存入数组时,数组里保存的其实是这些变量值的副本,而不是指向原变量的引用。
咱们来拆解你的代码具体分析:
var number1 = 0; var number2 = 0; var number3 = 0; var numbers = [number1, number2, number3]; // 这里数组存的是三个0的副本,和原变量彻底解绑了 function updateNumbers() { var i; for (i = 0; i < numbers.length; i++) { numbers[i] = 777; // 这里修改的是数组里的副本,原变量根本没被触及 console.log(numbers); // 输出[777,777,777]符合预期 console.log(number1); // 原变量还是初始的0,所以输出0 console.log(number2); console.log(number3); } } updateNumbers();
如果想让原变量和数组元素同步变化,你可以用**引用类型(比如对象)**来包装原始值——因为引用类型存的是指向内存地址的引用,修改引用指向的内容会同步影响所有引用它的地方:
var number1 = { value: 0 }; var number2 = { value: 0 }; var number3 = { value: 0 }; var numbers = [number1, number2, number3]; function updateNumbers() { var i; for (i = 0; i < numbers.length; i++) { numbers[i].value = 777; // 修改对象的value属性,原变量的value也会跟着变 console.log(numbers.map(item => item.value)); // [777,777,777] console.log(number1.value); // 777 console.log(number2.value); // 777 console.log(number3.value); // 777 } } updateNumbers();
最后简单总结下核心逻辑:
- 原始类型:赋值/存入数组时传递的是值的副本,修改副本完全不影响原变量
- 引用类型:赋值/存入数组时传递的是内存地址的引用,修改引用指向的内容会同步影响所有引用方
内容的提问来源于stack exchange,提问作者joTre
相关产品推荐
相关产品推荐

