学习笔记--JS中变量的赋值(连续赋值)

基本类型变量和引用类型变量
基本数据类型:
Number、String、Boolean、Null、Undefind
保存的是变量的实际值;
引用数据类型:

var person1 ={
    name ="cc"
    }
var person2 = person1;
console.log(person2.name);  //cc
person1.name="vv";
console.log(person2.name); //vv

如果两个对象同时指向一个对象,那么对这个对象的修改时同步的。
如下代码:

var a={n:1};
var b=a;
a.n=2;
console.log(b);//Object {n: 2}

a和b同时指向{n:1},当执行a.n=2操作时,b.n的值也会改变

连续赋值

代码如下:

var a={n:1}
var b=a;
a.x=a={n:2}
console.log(a.x); 
console.log(b.x);
//undefined
//Object{n:2}

连等赋值的运算规则是 B = C; A = B; 即连续赋值是 从右至左永远只取等号右边的表达式结果赋值到等号左侧
经典例题:

var a = {n:1};
a.x = a = {n:2};
console.log(a.x); // 输出?

答案是:

console.log(a.x); // undefined

执行逻辑:
1、在执行前,会先将a和a.x中的a的引用地址都取出来,此值他们都指向{n:1}

2、在内存中创建一个新对象{n:2}

3、执行a={n:2},将a的引用从指向{n:1} 改为 指向新的{n:2}

4、执行a.x=a,此时a已经指向了新对象,而a.x因为在执行前保留了原引用,所以a.x的a依然指向原先的{n:1}对象,所以给原对象新增一个属性x,内容为{n:2}也就是现在a

5、语句执行结束,原对象由{n:1}变成{n:1,x:{n:2}},而原对象因为无人再引用他,所以被GC回收,当前a指向新对象{n:2}

6、所以就有了文章开头的运行结果,再执行a.x,自然就是undefined了

你可能感兴趣的:(javascript)