【问题标题】:How to make comparison of objects `a == b` to be true? [duplicate]如何使对象`a == b`的比较为真? [复制]
【发布时间】:2013-06-27 17:11:52
【问题描述】:

这是面试前JavaScript在线测试中的问题之一:

function F(){};

var a = new F();
var b = new F();

Q:如何比较a == btrue? (例如console.log(a == b) // true

我回答这是不可能的,因为abF 的两个不同实例,并且在非原始比较引用的情况下,JS 中的相等比较。

但前段时间我读过 Axel Rauschmayer 的文章“JavaScript 中的假运算符重载”:http://www.2ality.com/2011/12/fake-operator-overloading.html — 我想知道在比较对象时是否存在假运算符重载的技巧?

【问题讨论】:

  • JSON.stringify(a) == JSON.stringify(b)
  • @roasted,其实不是。在您提到的主题中,答案是关于如何以正确的方式比较对象。这是另一个案例。
  • @jsguff 抱歉,刚刚看了标题我得出了一个仓促的结论
  • 轻微编辑function F(){}; => function F(){}

标签: javascript object operator-overloading comparison-operators


【解决方案1】:

这真的取决于他们所说的“如何使比较 a == b 为真?”

如果你被允许改变构造函数,那么你可以让你的构造函数成为一个单例:

function F(){
    if (!F.instance) {
        F.instance = this;
    } else {
        return F.instance;
    }
};
var a = new F();
var b = new F();
if (a === b) {
    //they are the same
}

如果他们希望您保留所有内容,但有一个包含 a == b 的比较,那么您可以编写以下内容:

if ("" + a == b) {
}

如果他们想知道确定两个对象是否是同一个构造函数的实例的方法,那么您可以比较constructor 属性或__proto__ 属性:

if (a.constructor === b.constructor) {
}

if (a.__proto__ === b.__proto__) {
}

如果他们想知道这两个对象的属性是否相同,可以比较他们的JSON字符串:

if (JSON.stringify(a) === JSON.stringify(b)) {
}

或者您编写一个函数,递归地比较两个对象中的所有属性(深度比较)。

对于“如何比较 a == b 为真?”这个问题的最简单答案:

var a = new F();
var b = new F();

b = a;

if (a === b) {
    //surprise!!!
}

【讨论】:

  • a === b 给出错误!其他人工作正常
  • @CME64 适合我:jsfiddle.net/hL3fA
  • 奇怪,这是怎么回事?,看看这个:jsbin.com/okinob/3/edit
  • @CME64 嗯...该代码来自哪里?这不是我的 ;) jsbin.com/usuvod/1/edit
  • @basilikum,好的,带有单例的变体工作正常(a == b // true)。谢谢!
【解决方案2】:

我的最佳答案是这样,因为您可以比较不同的功能:

console.log(a.constructor+"" === b.constructor+"");

因为它将函数作为字符串返回,然后逐字比较。

示例测试:

function f1(){}
function f2(){}
var a = new f1(),
    b= new f2();
console.log(a.constructor+"" === b.constructor+"");
b = new f1();
console.log(a.constructor+"" === b.constructor+"");

DEMO

注意:不需要=== 符号,因为第三个符号用于类型比较,此时两者都是字符串,因此使用 == 会做同样的事情

编辑:我对这个问题的实际答案是:通过从初始化中删除 new

【讨论】:

  • 我们需要字面意思 console.log(a == b) //=> true。不是.__proto__,也不是.constructor,也不是JSON.stringify(any)
  • @jsguff 在这种情况下,你认为你应该在console.log(a==b); 之前添加a = a.constructor+""; b=.. 以保持字面意思吗?
  • 嗯,为什么不a = 42; b = 42? :) 我认为他们(测试的作者)的意思正是singleton 模式,因为这是将a == btrue 进行字面上相等比较的唯一方法。
  • @jsguff 好的,那么您介意告诉我问题的限制吗?因为我看不到你有机会做任何事情来改变 a= false 到 true 只看它!
  • 我发布了原始问题(逐字逐句)。没有任何其他细节。
猜你喜欢
  • 1970-01-01
  • 2013-11-19
  • 1970-01-01
  • 2012-01-25
  • 2019-04-21
  • 1970-01-01
  • 2021-10-04
  • 2021-10-06
  • 1970-01-01
相关资源
最近更新 更多