【问题标题】:Comparison Behaviour of JavaScript ObjectsJavaScript 对象的比较行为
【发布时间】:2016-05-08 09:24:24
【问题描述】:

我们假设我们有 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”创建了一个新对象。 这个对象的类型,就是简单的对象。

在数学上,我们如何解释这个矛盾?

【问题讨论】:

标签: javascript object types


【解决方案1】:

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

准确地说,与布尔值的双等比较使用规范中的这条规则(以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,产生 1。所以我们将11 进行比较。 QED。

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

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

回答你的问题:

在数学上,我们如何解释这个矛盾?

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

【讨论】:

【解决方案2】:

在数学上,我们如何解释这个矛盾?

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

但它没有:

【讨论】:

    【解决方案3】:

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

    您对变量 a 和 c 所做的操作通常称为“装箱”:获取 Javascript 原始值(ES6 中的 undefined、null、String、Number、Boolean、Symbol)并使用 newoperator 调用它.

    结果:

    var a = new Boolean(true);

    是一个 Javascript Objectwrapping 一个 Boolean 原始值。

    当您在某些语言内置工具(例如Function.prototype.callFunction.prototype.apply)中使用原始值作为上下文(this)时,会隐式发生相同的调用模式

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

    【讨论】:

    • 我认为您不能将 null 和 undefined 框起来。此外,将 == 替换为 === 不会在前两次比较中产生相同的结果。
    • “获取一个 Javascript 原始值(ES6 中的 undefined、null、String、Number、Boolean、Symbol)并使用 newoperator 调用它”——这是不正确的。 Boolean 不是原始值,而是构造函数。
    猜你喜欢
    • 2014-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 2011-12-27
    相关资源
    最近更新 更多