美文网首页
JS 连续赋值

JS 连续赋值

作者: Cherry丶小丸子 | 来源:发表于2023-08-22 16:06 被阅读0次

    先来看下 js 中基本类型的连续赋值是下面这样

    var a = 1;
    var b = a = 3;
    

    js 中赋值是从右到左的,所以上面的连续赋值可以分解为下面这样

    var a = 1;
    a = 3;
    var b = a;
    

    所以最终,a = 3, b = 3

    再来看一道经典面试题

    var a =  {n: 1 };
    var b = a;
    a.x = a.x.y = { n: 2 };
    
    此题会报错,因为 a.x 是 undefined, 所以就找不到 y 
    
    var a = { n: 1 };
    var b = a;
    a.x = a = { n: 2 };
     
    a.x // undefined
    b // { n: 1, x: { n: 2 }}
    

    但是面试题中的情况跟上面的不太一样
    js 开始去从左到右寻找有没有未声明的变量 或者 报错信息,如果没有,先检查存在运算的优先级,当 '.' 跟 '=' 同时出现时,先进行 '.' 操作再做赋值操作也就是 '='
    所以面试题的连续赋值可以分解为以下步骤:

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

    最后给大家出了三道题给大家理解

    var a = { n: 1, x: { y: 2 },z: 3 }
    var b = a
    c = a.x = a.x.y = a.c = b = { n: 10 };
    
    a.c // { n: 10 }
    a.x.y // undefined
    a.x // { n: 10 }
    a // { n:1, x: { n:10 }, c: { n: 10} , z: 3 }
    
    var a = { x: { xx: 1 }, y: 2, z: 3 };
    var b = a.x;
    var c = a;
    b.xx = 2
     
    a // { x: { xx: 2 }, y: 2, z: 3 }
    c // { x: { xx: 2 }, y: 2, z: 3 }
    
    var a = { x: { xx: 1 }, y: 2, z: 3 };
    var b = a.x;
    var c = a;
    a.w = a.x.xx = a.y = a = { x: 10, y: 20 };
     
    c // { x: { xx: { x: 10, y: 10 } }, y: { x: 10, y: 20 }, z: 3, w: { x: 10, y: 20 } }
    

    相关文章

      网友评论

          本文标题:JS 连续赋值

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