在 javascript 下面的代码是如何工作的

In javascript how does the below code works

在 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);
}

以上代码打印错误。

但是,如果我注释掉 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。

第一种情况:

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

因为 a 和 a2 点都有不同的引用,即为什么它首先 returns false。

当您评论 a= {} 时,a 和 a2 都指向相同的位置或存储相同的引用,这就是为什么它 returns 为真。

...as Both variables(a and a2) points to the same object ...

他们不再这样了,从这行开始:

a={};

此时,a2 指的是旧对象,a 指的是一个新的、不同的对象。

a2 = a 不会在 变量 a2 变量之间创建任何类型的 link =49=] 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"     |   +−−−−−−−−−−−−+
                  +−−−−−−−−−−−−−+                 

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

此时如果做a === a2,就会true:两个变量都引用同一个对象。

但是当你这样做时:

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

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

此时,a === a2就是false:变量引用了不同的对象。

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 获取 var a 的 value,而不是 reference 所以当 var a 改变时, var a2 不会 改变。

第一种情况在这一行之后 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);
}