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
相关产品推荐
相关产品推荐

