JavaScript中Number原型方法调用includes返回结果不符合预期如何解决?
问题根因
JavaScript 中调用原始数字类型的原型方法时,会自动对原始值做装箱操作,把原始值转为Number包装对象:
inList方法内拿到的this是new Number(0)的实例对象,不是你预期的原始值0- 数组
includes方法基于SameValueZero规则做相等判断,包装对象和原始数字属于不同类型,永远不会相等,因此返回false - 直接调用
[0,1].includes(value)时传入的是原始值0,符合匹配规则,因此返回true
修复方案
在判断前把this转换回原始数字值即可,推荐两种写法:
- 调用
valueOf()显式取原始值
Number.prototype.inList = function (list) { return list.includes(this.valueOf()); }
- 用一元加运算符隐式转原始值
Number.prototype.inList = function (list) { return list.includes(+this); }
修改后重新运行代码,find1和find2都会返回true。
注意事项
String、Boolean等其他原始类型调用原型方法时也会触发装箱逻辑,如果需要基于原始值做判断,都需要先把this转为对应的原始值再操作。
内容的提问来源于stack exchange,提问作者A.Baudouin
相关产品推荐
相关产品推荐

