我试图在比较中将操作符的字符串表示转换为操作符本身。
例如,像
{obj1} '==' {obj2}
应:
{obj1} == {obj2}
或
{obj1} '!==' {obj2}
应:
{obj1} !== {obj2}
我可以使用eval()
,但这强制要比较的对象转换为字符串,导致===
(严格类型检查)比较无效。
例如,在下面的例子中,eval
会给出错误的结果:
const obj = "5"
const obj2 = 5
const operator = '===';
eval(`console.log(${obj} ${operator} ${obj2})`) //outputs true, incorrect (obj is of type string, obj2 is of type number)
console.log(obj === obj2) //outputs false, correct
我该如何处理?
可能方法
我想到的一种方法是通过if else
阶梯,让js处理比较,而不是解析比较操作符。
if(condition === '!=='){
return before_OrderRequest.Id !== after_OrderRequest.Id
}else if (condition === '==='){
return before_OrderRequest.Id === after_OrderRequest.Id
}
//...more if statements
可以用操作符的字符串表示定义一个对象,作为返回执行相应比较的箭头函数的属性。
const compare = {
'==': (a, b) => a == b,
'!=': (a, b) => a != b,
'===' : (a, b) => a === b,
'!==' : (a, b) => a !== b
}
const obj1 = 1;
const obj2 = 2;
console.log(compare['=='](obj1, obj2))
console.log(compare['!='](obj1, obj2))
console.log(compare['==='](obj1, obj2))
console.log(compare['!=='](obj1, obj2))
如果你正在处理类似的问题,请理解我的问题是建立在一个错误的前提之上的。请允许我解释一下……
如果你看一下我的示例可执行代码片段,你会注意到我在
下面使用了evaleval(`console.log(${obj} ${operator} ${obj2})`)
但是我的这种用法是错误的,在这里我使用字符串插值,这是强迫obj2
的值变成一个字符串。
正确的用法应该如下…
const obj = "5"
const obj2 = 5
const operator1 = '===';
const operator2 = '!==';
eval(`console.log(obj ${operator1} obj2)`) //outputs false which is correct
eval(`console.log(obj ${operator2} obj2)`) //outputs true which is correct
console.log(obj === obj2) //outputs false which is correct
将此添加为答案,而不仅仅是编辑问题,以便为面临类似挑战的人提供上下文。