在
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为假:变量引用不同的对象.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。