当操作数是不同类型时,JavaScript关系比较运算符适用哪些规则?
例如,如何是真的> null评估?我可以在我的开发者控制台中输入它,结果是真的,但为什么呢?
解决方法
JavaScript关系比较运算符类型强制在
JavaScript specification中定义,特别是在描述运算符的
11.8 to 11.8.5部分中,以及描述强制操作数的过程的部分
9.1 (ToPrimitive)和
9.3 (ToNumber).
简而言之,4个比较运算符(<,>,< =和> =)尽力将每个操作数转换为数字,然后比较数字.例外情况是两个操作数都是字符串,在这种情况下,它们按字母顺序进行比较.
特别,
>如果参数o是一个对象而不是一个原语,try to convert it to a primitive value通过调用o.valueOf()或 – 如果没有定义o.valueOf或者在调用时没有返回一个原始类型 – 通过调用o.toString()
>如果两个参数都是字符串,则根据它们的lexicographical ordering进行比较.例如,这意味着“a”< “b”和“a”< “aa”都回归真实.
>否则,convert each primitive to a number,表示:
> undefined – >为NaN
> Null – > 0
>布尔基元类型 – >如果为真则为1,如果为假则为0
>字符串 – > try to parse a number从字符串
>然后按照您对运算符的期望比较每个项目,并注意任何涉及NaN的比较评估为假.
所以,这意味着以下内容:
console.log(true > null); //prints true console.log(true > false); //prints true console.log("1000.0" > 999); //prints true console.log(" 1000\t\n" < 1001); //prints true var oVal1 = { valueOf: function() { return 1; } }; var oVal0 = { toString: function() { return "0"; } }; console.log(oVal1 > null); //prints true console.log(oVal0 < true); //prints true console.log(oVal0 < oVal1); //prints true