JavaScript对象的比较行为
我们假设我们有3个变量:a,b和cJavaScript对象的比较行为,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 我已经知道关
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调用它”——这是不正确的<代码>布尔值
不是基元值,而是构造函数。