JavaScript对象的比较行为

时间:2016-01-30 17:41:07

标签: javascript object types

我们假设我们有3个变量:a,b和c

var a = new Boolean(true);
var b = true;
var c = new Boolean(true);

console.log("First comparison : ", a == b);
// true
console.log("Second comparison : ", b == c);
// true
console.log("Contradiction : ", a == c);
// false 

我已经知道关键字'new'会创建一个新对象。 这个对象的类型就是对象。

数学上,我们如何解释这个矛盾?

4 个答案:

答案 0 :(得分:3)

在前两个示例中,由于比较涉及原始值bac最终被强制转换为基元。另一方面,在最后一种情况下,您要比较两个不同的对象,因此不会发生强制。

准确地说,与布尔值的双重等式比较使用规范中的这个规则(以b == c为例):

  

如果Type(x)Boolean,请返回比较结果ToNumber(x) == y

因此,这意味着将ToNumber(b)c进行比较。 ToNumber(b)是1.因此我们将1c进行比较。接下来,应用以下规则:

  

如果Type(x)StringNumberType(y)Object,   返回比较结果x == ToPrimitive(y)

这意味着我们将1ToPrimitive(c)进行比较ToPrimitive(Boolean(true))ToPrimitive调用valueOf,产生1。我们将11进行比较。 QED。

对于您的第三个示例,规范的以下部分适用:

  

如果Type(x)Type(y)相同,则...如果xy引用同一个对象,则返回true。否则,返回false。

回答你的问题:

  

数学上,我们如何解释这个矛盾?

这不是数学问题。这是JS规范中比较定义的问题。

答案 1 :(得分:0)

此问题是Javascript如何比较对象和文字值。

本文讨论"对象平等"在javascript:http://adripofjavascript.com/blog/drips/object-equality-in-javascript.html

总之,对于对象Javascript 比较引用(如果两个变量引用到同一对象)。

答案 2 :(得分:0)

  

数学上,我们如何解释这个矛盾?

如果您认为这是一个矛盾可能是因为您认为==定义了equivalence relation

但事实并非如此:

  • 不满足reflexivity,例如NaN != NaN
  • 正如您所注意到的那样,它不满足transitivity
  • 但它满足symmetry,但仅此一点还不够。

答案 3 :(得分:0)

我不认为这种行为可以从数学的角度来解释。

你在变量a和c上做的事情通常被称为"拳击":采用Javascript原始值(未定义,null,字符串,数字,布尔值,ES6中的符号)并调用它new运营商。

结果:

var a = new Boolean(true);

是一个包含Object原始值的Javascript Boolean

在某些语言内置工具(如thisFunction.prototype.call Function.prototype.apply)时,会隐式发生相同的调用模式>

即使用==替换===也会产生相同的结果,这是因为对象比较在JS中的工作方式。