我们假设我们有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”会创建一个新对象。
该对象的类型就是对象。

从数学上讲,我们如何解释这一矛盾?

最佳答案

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

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


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


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


  如果Type(x)StringNumber并且Type(y)Object
  返回比较结果x == ToPrimitive(y)


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

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


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


要回答您的问题:


  从数学上讲,我们如何解释这一矛盾?


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

10-05 20:51
查看更多