JS变量连续赋值

JS变量连续赋值

下面就是这个经典案例:

var a = {n: 1};
var b = a;
a.x = a = {n: 2};

console.log(a);
console.log(b);
console.log(a.x);
console.log(b.x);

我们先来看一下普通连续赋值,即:变量赋值的类型是数据类型值

    var a=3;
    var b=a=5;
    console.log(a);
    console.log(b);

一般来说,等号赋值的方向是从右至左,那么上面的代码等同于下面这段代码,那么我们就用下面这段代码来解释上面的代码:

    var a=3;  //全局变量a被赋值为3
    var a=5;  //此时a被重新赋值为5
    var b=a;  //将a的值赋给全局变量b
  console.log(a);//a最终的值就是第二次被赋的值:5
  console.log(b);//按照代码执行顺序b的值也是:5

现在我们来分析这个经典案例:

var a = {n: 1}//a第一次被赋值,是一个引用类型值,
//请记得变量赋值为引用类型值的时候,通过变量改变这个对象的时候,对象本身也发生了变化

var b = a;//b被赋值为a,因此b就是对象{n:1}

a.x = a = {n: 2}//这个赋值与之前的简单案例有所不同,
//a.x指的是给a添加一个x属性,在js的运算中“.”和"="运算符同时出现,会先执行"."运算
//因此,赋值顺序被改变了,是先给a.x赋值,再给a赋值
//就是先执行:a.x={n:2},注意这里a并未改变,是给a的x属性赋值为{n:2},a还是{n:1}
//再回到我代码中的第一句话,这个赋值行为,改变了{n:1}这个对象,即给它增加了名为x的属性
//再执行a={n:2},这是变量a不再是对象{n:1},而被重新赋值为一个新的对象{n:2};

console.log(a);//自然此时a是对象{n:2}
console.log(b);
//a的二次赋值,并没有影响b,b还是对象{n:1},
//但是由于a在重新赋值之前,给{n:1}这个对象,增加了一个x属性,因此,这时的b已经有了x属性
console.log(a.x);//{n:2}对象没有x属性,所以结果是undefined
console.log(b.x)//综上所述,这个结果是{n:2}

分析:
var a 是 指针 指向对象 {n: 1} ,
var b = a 是把 b 的指针也指向{n:1},
a.x = a = {n: 2}; a.x ={n:2} 因为js运行顺序先执行,给对象{n:1}添加了x属性,这时候b指向的{n:1}也就有了x属性,之后再执行a={n:2} 这就是将a的指针指向了新的对象{n:2},这时候输出a就是{n:2}

注意:
1、在js的运算中“.”和"=“运算符同时出现,会先执行”."运算
2、变量赋值为引用类型值的时候,通过变量改变这个对象的时候,对象本身也发生了变化,所以指向这个对象的变量,也就有了新的变化

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值