首页 > js比较运算符比较两个对象的问题?

js比较运算符比较两个对象的问题?

mdn:当两个操作数都是对象时,JavaScript会比较其内部引用,当且仅当他们的引用指向内存中的相同对象(区域)时才相等,即他们在栈内存中的引用地址相同。

a().c() 和 a() 都指向的是b,为什么会不相等呢?难道他们的内存地址不一样?


var idx = 0;
var a = function(){
  console.log(idx++);
  var b = {
    c: function(){
      return this;
    }
  }
  return b;
}

改成这样你能明白了
下面的才是你期望的

var b = {
  c: function(){
    return this;
  }
};
var a = function(){
  return b;
}

这个也是你想要的答案:

var test = a();

test.c() === test; // true

问题在于你的方法 a 执行了两遍,每一遍都 var 了一个 b ,两个 b 本来就不同,处于不同的作用域,自然不可能相等。


javascript 中对象的比较不是值得比较,是引用的比较和对象拥有的属性以及值并没有半毛线关系, 两个对象的引用是一样的才是相等的并且 == 与 === 对于对象的比较来说并没有区别都是引用的比较;

a().c() 返回的是一个新定义的b 对象
a() 返回的也是一个新的定义的b对象

都是新的对象并没有指向同一个引用,所以false;


两个不同的 b 了吧,就像你 new 两次,是不一样的对象了吧

甚至不需要这样,console.log(a() === a()) 这就是 false 了啊

闭包的特性


每次执行a()函数,都会重新创建一个b对象,因为var b = {...}是在函数体内的,所以肯定不相等

【热门文章】
【热门文章】