美文网首页文艺的PHP
js连续赋值和引用指针的工作方式

js连续赋值和引用指针的工作方式

作者: 君满楼001 | 来源:发表于2017-12-05 22:10 被阅读6次

1var  a = {n:1};

2var    b =a;

3a.x = a = {n:2};

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

5console.log(b.x);// [object,objcct]

上面这个例子看似简单,但运行后的结果却很绕人,a.x的结果让人甚为疑惑。

现在我们可以来分析下这段代码具体是如何运行的。为了方便理解,我这里会以图文的形式来说明

var  a = {n:1};

var   b = a;

接着是这句比较复杂的连续赋值操作的代码

#a.x = a = {n:2};

很多人可能以为这个连续赋值操作等价于

a = {n:2};

a.x= a;

其实不然。 js代码从左到右的执行顺序没有问题。只是赋值表达式是 “=”右边赋值给左边

首先执行针对a.x的赋值操作,而a.x的右边也是一个赋值表达式 a = {n :2}。 而赋值表达式是有返回值的(表达式左边对应的值)

所以我们可以这样理解  a.x =  [expression]   ,而这个[expression] 为 a = {n:2}

因为对象a上不存在‘x’属性,所以对a.x赋值的时候会这个对象扩展一个‘x’属性  (属性扩展或取值操作在编译器内部有着相对复杂的操作,这里暂时不做深入)

然后执行a= {n:2},这里相当于新创建了一个对象,然后把a重新指向这个对象,在内存中的操作如下图所示

执行完a.x右边的表达式后,结果也出现了, x属性指向的是{n:2}这个对象

所以这里我们就明白为何b.x为对象,a.x为undefined。

以上为个人理解,如有不正确的地方欢迎指正。

我们也可以把最后一句连续赋值代码改为

a = a.x = {n:2};

第一次接触这么深得接触js ,这次就到这里:

转自:http://www.cnblogs.com/saxibuni/articles/6397473.html

相关文章

  • js连续赋值和引用指针的工作方式

    1var a = {n:1}; 2var b =a; 3a.x = a = {n:2}; 4console.lo...

  • c++基础

    1、引用和指针的区别:引用是变量的别名,内部实现是只读指针。引用在初始化的时候就地赋值,并且赋值之后不能改变,指针...

  • C语言数据结构-链表大解剖

    链表抽象结构解析 引用、解引用、指针、链表赋值取值 链表抽象结构解析 引用、解引用、指针、链表赋值取值

  • C++派生类的赋值重载

    赋值兼容——子类对象的引用和指针可以赋值给父类对象的引用和指针 构造器(包括拷贝构造器)和析构器是不能被继承的 t...

  • 如何轻松写出正确的链表代码?

    理解指针或引用的含义 含义:将某个变量(对象)赋值给指针(引用),实际上就是就是将这个变量(对象)的地址赋值给指针...

  • 链表(下):如何轻松写出正确的链表代码

    技巧一:理解指针或者引用的意义 指针或者引用都是存储对象的内存地址。将某个变量赋值给指针,就是将这个变量的地址赋值...

  • 无标题文章

    1.指针和引用 引用必须赋初始值,没有空的,而指针可以为空指针可以重新赋值,但引用总是指向最初的那个对象当知道需要...

  • 《Java编程思想》读后总结(二)

    Java里的数据类型 Java里的对象是引用,就像C的指针。对引用的赋值实际就是对指针的赋值,对象本身并没有被赋值...

  • 一道题

    解析 JS引用类型指针的工作方式   首先是a指向了一个对象{n:1},b指向了a所指向的对象  然后 a.x =...

  • C++-01、特性、常量、引用、重载、布尔

    真常量 引用(引用的赋值或者传递相当于指针取了个别名,不管如何操作这个别名,操作的还是这个指针) 常量引用 指针常...

网友评论

    本文标题:js连续赋值和引用指针的工作方式

    本文链接:https://www.haomeiwen.com/subject/uejhixtx.html