You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS中使用==比较两个继承String的自定义字符串对象返回false如何解决

核心原因

JavaScript中==运算符的比较规则明确规定:当两侧操作数都是对象类型时,不会执行任何类型转换,直接判断二者是否指向同一个内存引用。这也是重写valueOf不生效的根本原因——两个独立new出来的MyString实例是不同的引用,比较时根本不会触发原始值转换逻辑,自然直接返回false。

只有当==两侧分别是对象和原始值类型时,才会调用对象的valueOf/toString/Symbol.toPrimitive方法把对象转成原始值再比对,这就是new MyString('hi') == 'hi'能触发重写的valueOf并返回true的原因。

注意:JS不支持运算符重载,没有任何方法可以修改两个对象做==比较时的默认规则,不要在这个方向浪费时间。

可行解决方案
  • 显式转原始值后比较
    比对时手动把实例转成原始字符串再判断,写法简单无侵入:
    const str1 = new MyString('hi');
    const str2 = new MyString('hi');
    console.log(str1.toString() === str2.toString()); // true
    console.log(String(str1) === String(str2)); // true
    console.log(`${str1}` === `${str2}`); // true
    
  • 给类新增专用相等判断方法
    在MyString类上封装equals方法,统一处理和其他MyString实例、原始字符串的相等判断逻辑:
    class MyString extends String {
      doSomething(someData) {
        return doSomethingWithData(this, someData);
      }
      equals(target) {
        return this.toString() === String(target);
      }
      valueOf() {
        console.log('valueOf called');
        return this.toString();
      }
    }
    
    // 调用示例
    console.log(new MyString('hi').equals(new MyString('hi'))); // true
    console.log(new MyString('hi').equals('hi')); // true
    

内容的提问来源于stack exchange,提问作者Gamer Omega

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 21:45:33