我们假设我们有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
的原始值,因此a
和c
最终被强制转换为原始值。另一方面,在最后一种情况下,您正在比较两个不同的对象,因此没有强制发生。
确切地说,与布尔值的双等式比较使用规范中的以下规则(以b == c
为例):
如果Type(x)
是Boolean
,则返回比较结果ToNumber(x) == y
。
因此,这意味着将ToNumber(b)
与c
进行比较。 ToNumber(b)
为1。因此,我们将1
与c
进行比较。接下来,应用以下规则:
如果Type(x)
是String
或Number
并且Type(y)
是Object
,
返回比较结果x == ToPrimitive(y)
。
因此,这意味着我们将1
与ToPrimitive(c)
进行比较。 ToPrimitive(Boolean(true))
调用ToPrimitive
,产生valueOf
。因此,我们将1
与1
进行比较。 QED。
对于第三个示例,适用规范的以下部分:
如果1
与Type(x)
相同,则...如果Type(y)
和x
引用相同的对象,则返回true。否则,返回false。
要回答您的问题:
从数学上讲,我们如何解释这一矛盾?
这不是数学问题。这取决于JS规范中比较的定义。