zoukankan      html  css  js  c++  java
  • javascript 连等赋值问题

    var a = {n:1};  
    var b = a; // 持有a,以回查  
    a.x = a = {n:2};  
    alert(a.x);// --> undefined  
    alert(b.x);// --> {n:2}
    var a = {n:1}; 
    /*定义a,a赋值为`{n:1}`;
    为a在内存堆中分配一块内存用于存储`{n:1}`,假设其地址为add_1;
    此时add_1引用计数为1,即a,内容为`{n:1}`。*/ 
    var b = a; 
    /*定义b,b赋值a,add_1被b引用。
    此时add_1引用计数为2,即a和b,内容为`{n:1}`。*/  
    a.x = a = {n:2};
    /*(`=`赋值运算符:关联性为从右向左,优先级为3。`.`成员访问运算符:关联性为从左向右,优先级为19。19>3,所以先计算成员访问运算符)
    (1):a.x是成员访问运算表达式,a.x中的x赋值为`a = {n:2}`的返回值`{n:2}`,add_1被改写`{n:1,x:{n:2}}`。
    此时add_1引用计数为2,即a、b,内容为`{n:1,x:{n:2}}`。
    (2):a赋值为`{n:2}`;
    为a在内存堆中分配一块内存用于存储`{n:2}`,假设其地址为add_2;
    此时add_1引用计数为1,即b,内容为`{n:1,x:{n:2}}`。
    此时add_2引用计数为1,即a,内容为`{n:2}`。*/ 
    alert(a.x);
    /*现在a的存储地址add_2,内容为{n:2},上面并不存在a.x属性,所以为undefined*/ 
    alert(b.x);
    /*现在b的存储地址add_1,内容为{n:1,x:{n:2}},所以b.x为{n:2}*/ 

    求值过程是先于赋值过程的 .点运算符高于其他运算符,所以先点运算符再赋值运算 

    原文位置:https://segmentfault.com/q/1010000002637728

  • 相关阅读:
    tyvj1034 尼克的任务
    一维数状数组区间修改,查询
    ACM-T3分块
    测试2T3
    IOS下自定义click事件使用alert的bug
    小知识点
    CSS3动画基本知识
    CSS3秘笈:第十二章&第十三章
    CSS3秘笈:第十一章
    CSS3秘笈:第十章
  • 原文地址:https://www.cnblogs.com/jokes/p/9449228.html
Copyright © 2011-2022 走看看