在javascript中,以下代码如何工作

时间:2018-06-30 16:52:48

标签: javascript pass-by-reference pass-by-value

在Javascript中,以下代码如何工作。

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";
a = {};
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

上面的代码显示为false。

但是,如果我注释掉a = {}行,则在控制台上打印的值是true。

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";
//a={};
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

上面的代码是如何工作的,因为两个变量(a和a2)都指向同一个对象,但是当我使用{}初始化a时,它给出了false。

4 个答案:

答案 0 :(得分:6)

  

...因为两个变量(a和a2)都指向同一个对象...

从此行开始,它们不再存在:

a={};

在这一点上,a2指的是旧对象,a指的是新的不同对象。

a2 = a不会在变量 a2变量 a之间创建任何形式的持续链接。

让我们扔一些Unicode艺术:

此代码运行后:

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";

这时,您的内存中已经有了类似的东西(省略了许多细节):

a:Ref44512−−−+
             |
             |
             |    +−−−−−−−−−−−−−+                 
             +−−−>|  (object)   |                 
             |    +−−−−−−−−−−−−−+                 
             |    | prop1: "a"  |                 
             |    | prop2: "b"  |   +−−−−−−−−−−−−+
a2:Ref44512−−+    | fun:Ref7846 |−−>| (function) |
                  | vn: "v"     |   +−−−−−−−−−−−−+
                  +−−−−−−−−−−−−−+                 

这些“引用”值是对象引用。 (我们从未真正看到过它们的值,这些值只是胡说八道。)请注意,a中的值和a2中的值是相同的。

如果此时执行a === a2,它将是true:两个变量都引用同一个对象。

但是,当您这样做时:

a={};
                  +−−−−−−−−−−−−−+
a:Ref84521−−−−−−−>|  (object)   |
                  +−−−−−−−−−−−−−+

                  +−−−−−−−−−−−−−+                 
a2:Ref44512−−−−−−>|  (object)   |                 
                  +−−−−−−−−−−−−−+                 
                  | prop1: "a"  |                 
                  | prop2: "b"  |   +−−−−−−−−−−−−+
                  | fun:Ref7846 |−−>| (function) |
                  | vn: "v"     |   +−−−−−−−−−−−−+
                  +−−−−−−−−−−−−−+                 

此时,a === a2false:变量引用了不同的对象。

答案 1 :(得分:2)

在第一种情况下:

var a2 = a; // now a2 and a have reference (or point to) the same object"
a= {}; // a now points to new reference

由于a和a2点都具有不同的引用,即为什么它首先返回false。

注释a= {}时,a和a2都指向相同的位置或存储相同的引用,这就是它返回true的原因。

答案 2 :(得分:2)

在第一种情况下,此行var a2 = a; a再次被初始化为空对象,所以现在a和a2是两个不同的引用

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a = {};
console.log(a, a2)
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

在第二种情况下,它们指向相同的位置,因此添加新属性也会在另一个属性中反映出来。

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";
console.log(a, a2)
//a={};
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

答案 3 :(得分:1)

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v"; 
a = {}; 
console.log(a);
console.log(a2);
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

仔细查看您的代码。 a未初始化为{}。它在第一行显示var a =的地方进行了初始化。我已经为您打印了这两个值。 var a2获取变量a的,而不是引用,因此,当变量a 更改时,变量a2 不变不变。