在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。
答案 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 === a2
是false
:变量引用了不同的对象。
答案 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 不变不变。