代码之家  ›  专栏  ›  技术社区  ›  Michał Turczyn

JS对象平等

  •  1
  • Michał Turczyn  · 技术社区  · 6 年前

    我试着和其他人一起玩东西 Symbol.toPrimitive 符号,以便将对象转换为基本体。

    我使用了以下代码:

    function UserEq(name) {
        this.name = name;
        this[Symbol.toPrimitive] = function (hint) {
            alert("hint is: " + hint);
            return 0;
        };
    }
    function objectEqualityCheck() {
        let user1 = new UserEq("John");
        let user2 = new UserEq("Rambo");
    
        if (user1 == user2) alert("Equal!");
    }
    

    我预计两次转换将导致警报 Equal! 但这不是发生的事。。。

    当像这样使用时 user1 == 0 一切正常(转换为 number 尽管如此)。

    为什么在比较两个对象时,它不起作用?

    编辑:它不适用于 ===

    1 回复  |  直到 6 年前
        1
  •  2
  •   Code Maniac    6 年前

    文档中的第一条规则 == 定义了这一点

    比较x==y,其中x和y是值,产生真或假 错误的这样的比较如下所示:

    If Type(x) is the same as Type(y), then
        Return the result of performing Strict Equality Comparison x === y.
    

    TC39


    user1 == user2
    

    这里比较的是同一个类型,所以根本不会发生类型转换


    只有在这些条件下才会调用TopPrimitive

    • 如果类型(x)是字符串、数字或符号,而类型(y)是对象, 返回比较结果x==ToPrimitive(y)。
    • 如果类型(x)是Object,类型(y)是String、Number或Symbol,则返回比较结果ToPrimitive(x)==y。
    推荐文章