zoukankan      html  css  js  c++  java
  • JS 对象引用问题

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


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


    这两个问题主要理解两点就很简单了。

    对象是引用类型,改变赋值只是改变指针的引用。运算符=相当于改变指针的指向。
    运算符的优先级。. > =。 即:在a.x = a = {n:2};中,先给对象a添加x属性,再进行a={n:2}与a.x={n:2}两个赋值操作。
    问题1:
    // 变量a 指针指向对象 {n:1}
    var a = {n:1};
    // 变量b 指针指向对象 {n:1}
    var b = a;
    // 变量b指针不变,仍指向{n:1}; 变量a指针改为指向对象 {n:2}
    a = {n:2};
    // 注意运算符的优先级。先给对象a增加x属性,再给x属性赋值。此时x属性的值指向a对象自身。即:a = {n:2,x:a}
    a.x = a ;
    console.log(a.x); // {n:2,x:a}
    // 由于b指针没变,还是指向{n:1} ,故b.x: undefined
    console.log(b.x);

    问题2:
    var a = {n:1};
    // b与a的指针均指向 {n:1}
    var b = a;
    // 注意运算符优先级`.` > `=`
    // 先给a添加x属性。故添加x属性后,a指向的对象{n:1}变为{n:1, x:undefined/待赋值}, 由于b是和a指向的同一个对象,所以此时b={n:1, x:undefined/待赋值}
    // 赋值操作(从右往左进行)。 a = {n:2}, a的指针由指向{n:1,x:{n:2} 变为指向对象 {n:2}
    // 然后再进行赋值操作。a.x = {n:2} ,故x属性的值为{n:2},由于b是和a指向的同一个对象,此时a=b={n:1,x:{n:2}
    a.x = a = {n:2};
    // 此时a={n:2}, 故a.x为undefined
    console.log(a.x);
    // b指针始终没变,b={n:1,x:{n:2}}, 故b.x为{n:2}
    console.log(b.x);

  • 相关阅读:
    解决使用git出现 The file will have its original line endings in your working directory
    SpringBoot集成flowable碰见DMN不能初始化
    CF268D Wall Bars
    CF1327F AND Segments
    P2900 [USACO08MAR]Land Acquisition G
    CF279B Books
    CF859E Desk Disorder
    CF1147B Chladni Figure
    CF1147E Rainbow Coins
    P3565 [POI2014]HOT-Hotels
  • 原文地址:https://www.cnblogs.com/yzhihao/p/6409098.html
Copyright © 2011-2022 走看看