微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

上面的代码是如何工作的,因为两个变量(a和a2)都指向同一个对象但是当我用{}初始化时它给出了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 举报,一经查实,本站将立刻删除。

相关推荐