连等运算赋值以及对象之间的赋值

var a = {n:1};  
var b = a; 
a.x = a = {n:2};  
alert(a.x);// --> undefined  
alert(b.x);// --> {n:2}

说到这个结果,我真是不甚理解啊。非常 !!

各种大神解释 大家结合评论看

还有这篇文章 大家结合评论看

以及别人这样说道:赋值统统等于最右边,自左向右算,对象引用传递,变量a指向对象而已

我的理解(不重要)

结合segmentfault上面第一个评论的说法,我有了自己的理解,值得呵呵的是,我觉得我说不清楚

  • 在这之前,我了解了一下 对象与对象之间的赋值js对象间的赋值 所指向的都是同一个内存块,所指向的都是同一个变量的地址。这有点像类似指针的用法。(但是这里他没有说清楚,只是给了结论。)所以这里的b=a,即b引用a,如果a的值发生变化b也会随之改变。

补充:我有搜索了一下对象与对象之间的赋值,但是可能是关键词不对,找到的不多,这里有一个问题我觉得还不错点这里,我把代码贴出来分析

function Person(){}
var p1 = new Person(),
P2;
p1.age = 25;
p2 = p1;
p2.age = 51;
console.log(p1.age); //51,证明是地址传值
p2 = null;
console.log(p1.age); //51

首先证明了确实object之间的传值确实是地址传值。
而我最开始的问题就是,为什么p2 = null,p1还能取值,这算是一个陷阱吧,看了解答,我比较赞同这个回答就是 p2 = null 只是断开了指向p1的指针,除非如果改成 p2.age = null;这样console.log(p1.age); 就会输出null了

再贴一个另外一位作者的分析

var p1 = new Person();这个表达式做了什么?

首先  new xxx()  就是在内存中创建了一个 object
var p1 = xxx  p1 这个变量保存了这个object的地址

到这里开始访问 p1就是访问这个object

p1.age = 25;  这个就是object.age = 25

var p2 = p1;   这个把p1的值赋予p2(因为p1 是指向一个对象的变量所以p2现在也指向这个变量)

p2.age = 51;  这个就是object.age = 51

//关键来了
现在内存有一个对象object 2个变量p1 p2都指向这个object

p2 = null;  这里p2指向了null  但是p1还是指向那个object
  • 关键点在于‘.‘符号的运算优先于=,所以Lemures这位大神说的解析器在接受到 a.x = a = {n:2} 这样的语句后:找到 a 和 a.x 的指针。如果已有指针,那么不改变它。如果没有指针,即那个变量还没被申明,那么就创建它,指向 null。所以会优先创建a.x,然后把他们的指针都指向{n:2}.
  • 现在的关系就变成了b虽然是指向a,但是本质的说b应该是指向原本a的内存块-first,然后由于’.’的优先性,在a被赋值给另外一个内存块-second{n:2}之前,已经优先创建了a.x,所以a.x是存在于原本的内存块-first中的,b的值所以是b => {n: 1, x: {n: 2 } } ;然后现在a已经被重新指向内存块-second,所以a不再拥有a.x这个属性a => {n: 2}

总结

写了写的发现自己好像搞清楚了,而且好像说的比他们都要清楚,如果我是对的话。哈哈,果然做笔记很有用哦。哈哈哈,比较喜欢这种越学越明白的感觉,我觉得我有作为科学家的探索精神,但是我却缺少科学家的勇往直前精神,越挫越勇精神还有就是智商。哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值