js百度面试题

作者: 向布谷鸟说早安 | 来源:发表于2017-02-12 01:36 被阅读419次

    说出以下代码运行结果

    var a = {n: 1}

    var b = a;

    a.x = a = {n: 2}

    console.log(a.x);

    console.log(b.x)

    输出:

    undefined

    n:2

    解析:

    var a = {n: 1}    // 定义变量 a 为一个新对象,且这个新对象有一个值为 1 的 n 成员

    var b = a;    // 定义变量 b ,并且让 b 也引用变量 a 的对象

    // 经过上面这两句之后,变量 a 和 b 都引用了对象 {n:1}

    // 下面这句是问题的关键

    a.x = a = {n: 2}

    // a.x = 表示要给 a 引用的那个对象 {n:1} 的 x 成员赋值

    // 实际上,此时变量 b 也引用了这个对象 {n:1}

    // 此时,JavaScript引擎首先给 {n:1} 添加一个空的 x 成员,即:{n:1,x:undefined}

    // 接下来要给{n:1,x:undefined}.x 赋的是什么值呢?

    // 要赋的值是 a = {n: 2}

    // 也就是先让变量 a 引用一个新的对象 {n:2}

    // 然后再把 a 的新值赋给 {n:1,x:undefined}.x

    // 所以原来的那个对象变成了 {n:1,x:{n:2}}

    // 由于变量 b 始终引用那个原来的对象,所以 b 的值是 {n:1,x:{n:2}}

    // 由于变量 a 被赋予了一个新的对象,所以 a 的值是 {n:2}

    // 这面这两句是控制台输出

    console.log(a.x);    // 变量 a 引用的对象是 {n:2},没有 x 成员,所以输出 undefined

    console.log(b.x);    // 变量 b 引用的对象是 {n:1,x:{n:2}},所以输出 {n:2}  

    相关文章

      网友评论

      • 8bf590593297:啊,多谢啊。我还以为是从右边往左边赋值呢。在chrome里面运行了一下,发现答案是对的
      • cbd16aeb86b3:不太懂 能不能画个图表示。
        写代码的海怪: @小菜鸟2017 可以拆成
        a.x=a
        a={n:2这样理解吧}

      本文标题:js百度面试题

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