Отношение типа оператора реляционного сопоставления JavaScript определено в спецификации JavaScript , в частности в разделах 11.8-11.8.5 , которые описывают операторы и разделы 9.1 ( ToPrimitive) и 9.3 (ToNumber) , которые описывают процесс принуждения операндов.
Короче говоря, 4 оператора сравнения (<
, >
, <=
и >=
) делают все возможное, чтобы преобразовать каждый операнд в число, а затем сравнить числа. Исключение составляет то, что оба операнда являются строками, и в этом случае они сравниваются по алфавиту.
В частности,
o
является объектом вместо примитива, попытайтесь преобразовать его в примитивное значение , вызвав o.valueOf()
или - если o.valueOf
не был определен или не возвращал примитивный тип при вызове - путем вызова o.toString()
"a" < "b"
и "a" < "aa"
оба возвращают true. undefined
-> NaN
Null
-> +0 Boolean
примитивный тип -> 1
, если true
, +0
, если false
String
-> попытаться проанализировать число из строки NaN
оценивается как false
. Итак, это означает следующее:
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