不使用数组时如何让单个变量匹配多个值?技术实现疑问
解决单个变量多次相等判断返回不同值的问题
嘿,我懂你的需求啦——不用数组,让同一个变量在连续的==判断里分别匹配500、600、700,对吧?你的原始代码里直接把对象和数字比较肯定行不通,因为对象和原始值用==比较时,JS会尝试把对象转成原始值,但默认转换逻辑不会帮你返回不同的值。不过咱们可以利用JS的类型转换机制来实现这个小技巧!
核心思路
当你用==比较对象和原始值时,JavaScript会自动调用对象的类型转换方法。我们可以重写这些方法,让每次调用返回不同的目标值,这样就能满足连续的相等判断了。
方案1:用Symbol.toPrimitive(ES6+推荐)
这是ES6引入的专门用于类型转换的方法,优先级最高,能直接控制转换后的原始值:
let num = { currentValue: 500, [Symbol.toPrimitive](hint) { // 先保存当前要返回的值 const returnVal = this.currentValue; // 按顺序更新下一次要返回的值 if (returnVal === 500) { this.currentValue = 600; } else if (returnVal === 600) { this.currentValue = 700; } // 返回当前匹配的值 return returnVal; } }; if (num == 500 && num == 600 && num == 700) { console.log("working"); // 现在会输出这个啦! } else { console.log("not working"); }
方案2:用valueOf方法(兼容旧环境)
如果需要兼容ES6之前的环境,重写valueOf方法也能达到同样的效果,因为JS在类型转换时会优先尝试调用valueOf获取原始值:
var num = { currentValue: 500, valueOf() { const returnVal = this.currentValue; if (returnVal === 500) { this.currentValue = 600; } else if (returnVal === 600) { this.currentValue = 700; } return returnVal; } }; if (num == 500 && num == 600 && num == 700) { console.log("working"); } else { console.log("not working"); }
为什么这能生效?
每次执行num == X的时候,JS都会触发对象的类型转换,调用我们重写的方法。我们用currentValue属性来追踪当前应该返回的值,第一次返回500,然后更新为600;第二次返回600,更新为700;第三次返回700,刚好满足三个判断条件,所以代码会输出"working"。
内容的提问来源于stack exchange,提问作者Ryan Arellano
相关产品推荐
相关产品推荐

