JavaScript对象的比较行为

JavaScript对象的比较行为,javascript,object,types,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 我已经知道关

我们假设我们有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
进行比较<代码>音调编号(b)为1。因此,我们将
1
c
进行比较。接下来,应用以下规则:

如果
类型(x)
字符串
数字
类型(y)
对象
, 返回比较结果
x==ToPrimitive(y)

这意味着我们将
1
ToPrimitive(c)
进行比较,后者是
ToPrimitive(Boolean(true))
ToPrimitive
调用
valueOf
,从而生成
1
。因此,我们将
1
1
进行比较。QED

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

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

回答你的问题:

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

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

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

如果您认为这是一个矛盾,可能是因为您假设
==
定义了一个

但事实并非如此:

  • 它不满足,例如
    NaN!=NaN
  • 正如你所注意到的,这并不令人满意
  • 不过,这是令人满意的,但光靠这一点是不够的

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


对变量a和c执行的操作通常被称为“装箱”:获取Javascript原语值(ES6中未定义、null、字符串、数字、布尔、符号),并使用
new
操作符调用它

结果:

var a=新布尔值(true)

是一个Javascript
对象
包装一个
布尔值
原语值

当您在一些语言内置功能(如
Function.prototype.call
Function.prototype.apply)中使用原语值作为上下文(
this
)时,隐式发生相同的调用模式


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

两个不同的对象永远不会进行相等的比较。a==c您正在比较两个对象引用,而不是一个具有原始数据的对象引用可能会重复。如果您想了解有关强制的更多信息,请检查我认为您不能将null和undefined框起来。另外,将
==
替换为
=
不会在前两次比较中产生相同的结果。“获取Javascript原语值(ES6中未定义、null、字符串、数字、布尔值、符号)并使用newoperator调用它”——这是不正确的<代码>布尔值
不是基元值,而是构造函数。