在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为假:变量引用不同的对象.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...