在
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",fun: function() { return this.prop1 + " " + this.prop2; } } var a2 = a; a.fn = "v"; //a={}; if (a === a2) { console.log(true); } else { console.log(false); }
解决方法
…as Both variables(a and a2) points to the same object …
他们不再这样了,如下所示:
a={};
此时,a2引用旧对象,a引用新的不同对象.
a2 = a不会在变量a2和变量a之间创建任何类型的持续链接.
让我们抛出一些Unicode艺术:
此代码运行后:
var a = { prop1: "a",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中的值是相同的.
如果此时执行=== a2,则为真:两个变量都引用同一个对象.
但是当你这样做时:
a={};
+−−−−−−−−−−−−−+ a:Ref84521−−−−−−−>| (object) | +−−−−−−−−−−−−−+ +−−−−−−−−−−−−−+ a2:Ref44512−−−−−−>| (object) | +−−−−−−−−−−−−−+ | prop1: "a" | | prop2: "b" | +−−−−−−−−−−−−+ | fun:Ref7846 |−−>| (function) | | vn: "v" | +−−−−−−−−−−−−+ +−−−−−−−−−−−−−+
此时,=== a2为假:变量引用不同的对象.