js 数组赋值问题 :值传递还是引用?

题目描述

var a = [1,2,3];
var b = a;
a = [4,5,6];
alert(b);  //[1,2,3]


var a = [1,2,3];
var b = a;
a.pop();
alert(b);  //[1,2]
//第一个我懂 第二个我不懂

题目来源

知乎


这是一个人回答的
a = [4,5,6];//改变的是a引用本身,没有改变数组对象
a.pop();//改变的是数组对象,a引用没有改变。
b = a;//该操作后,b直接指向数组对象,不是b指向a,a再指向数组。
//所以改变a引用并不会对b引用造成影响,改变数组对象可以

但是我觉得说不通啊 我觉得应该是 这个执行顺序啊 但是从结果看 我是错的~~

a = [4,5,6];//改变的是a引用本身,没有改变数组对象
b = a; // 这边还是指向引用
a.pop();

早上在知乎翻到的 看了他们的答案还是有点蒙蔽 有点蒙蔽 大佬能不能简明扼要的解答下
我有点菜 望不吝赐教

阅读 3.5k
4 个回答

[1,2,3]是一幢楼,
[4,5,6]也是一幢楼,
a和b是两块门牌号铁皮。

var a = [1,2,3];  //把a牌号挂到 123楼门口
var b = a;        //把b牌号挂到 a牌号所在的楼门口,即123楼
a = [4,5,6];      //把a牌号摘下来,挂到了456楼的门口
alert(b);  //[1,2,3]  //此时b牌号依旧挂在123楼门口,b即代表着123楼


var a = [1,2,3];    //把a牌号挂到 123楼门口
var b = a;          //把b牌号挂到 a牌号所在的楼门口,即123楼
a.pop();            //把a牌号所在的楼拆掉顶层,此时a牌号仍旧挂在123楼门口,那就拆3层
alert(b);  //[1,2]  //b牌号仍旧挂在 原123楼门口,但此时只剩12两层
a.pop();//改变的是数组对象,a引用没有改变。
b = a;//该操作后,b直接指向数组对象,不是b指向a,a再指向数组。
//所以改变a引用并不会对b引用造成影响,改变数组对象可以

已经说得很清楚了

题里面的a和b好比一个钩子,勾住了他们对应的数组。
第一段里面a先勾住了[1,2,3],b通过a也勾住了[1,2,3],这时候a松开钩子又伸出来勾住了[4,5,6],所以b还是[1,2,3]。
第二段里面a和b都勾住了[1,2,3],所以当a通过钩子处理[1,2,3]的时候,b还在钩着[1,2,3],肯定也会受到影响。

就好比一个铁棍,a和b两个人用手握着两端,a握着握着感觉无聊,轻轻敲了两下,b当然能感觉到。

要是没看明白的话建议再去看看js的堆栈概念。

同样,面试时遇到的。值引用的问题。
ab都引用同一个值,当你改变a的引用,并不影响。但改变引用值,对吧,这里大家都明白!
简单说=是一个赋值过程!所以a=[2,3,4]又创建了一个引用值。

clipboard.png

var a = {id: 1};
var b = a;
a = {id: 2};
console.log(b); // _> {id: 1};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题