我们假设我们有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'会创建一个新对象。 这个对象的类型就是对象。
数学上,我们如何解释这个矛盾?
答案 0 :(得分:3)
在前两个示例中,由于比较涉及原始值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
与1
进行比较。 QED。
对于您的第三个示例,规范的以下部分适用:
如果
Type(x)
与Type(y)
相同,则...如果x
和y
引用同一个对象,则返回true。否则,返回false。
回答你的问题:
数学上,我们如何解释这个矛盾?
这不是数学问题。这是JS规范中比较定义的问题。
答案 1 :(得分:0)
此问题是Javascript如何比较对象和文字值。
本文讨论"对象平等"在javascript:http://adripofjavascript.com/blog/drips/object-equality-in-javascript.html
总之,对于对象Javascript 仅比较引用(如果两个变量引用到同一对象)。
答案 2 :(得分:0)
数学上,我们如何解释这个矛盾?
如果您认为这是一个矛盾可能是因为您认为==
定义了equivalence relation。
但事实并非如此:
NaN != NaN
。答案 3 :(得分:0)
我不认为这种行为可以从数学的角度来解释。
你在变量a和c上做的事情通常被称为"拳击":采用Javascript原始值(未定义,null,字符串,数字,布尔值,ES6中的符号)并调用它new
运营商。
结果:
var a = new Boolean(true);
是一个包含Object
原始值的Javascript Boolean
。
在某些语言内置工具(如this
和Function.prototype.call
即使用==
替换===
也会产生相同的结果,这是因为对象比较在JS中的工作方式。