Подтвердить что ты не робот

Лучший и/или самый короткий способ сделать строгую (не-тип преобразования) <,>, <=, >= сравнение в Javascript

В Javascript сравнение == имеет строгую версию (не-тип): ===. Аналогично, != имеет строгую форму !==. Они защищают вас от следующего сумасшествия:

var s1 = "1",
    i1 = 1,
    i2 = 2;

(s1 == i1)   // true, type conversion
(s1 != i1)   // false, type conversion

(s1 === i1)  // false, no type conversion
(s1 !== i1)  // true, no type conversion

Однако другие операторы сравнения не имеют эквивалентных строгих режимов:

(s1 < i2)   // true, type conversion
(s1 <= i2)  // true, type conversion
([] < i2)   // true, wait ... wat!?

Очевидное решение кажется довольно многословным:

((typeof s1 === typeof i2) && (s1 < i2))  // false

Есть ли более идиоматический (или только менее подробный) способ сделать это в Javascript?

Ссылка: MDN Операторы сравнения

4b9b3361

Ответ 1

Нет встроенных операторов для того, что вы хотите, но вы всегда можете создавать свои собственные функции. Например, для <:

function lt(o1, o2) {
    return ((typeof o1 === typeof o2) && (o1 < o2));
}
lt("10", 11); // false

Другая опция, если вы имеете дело только со строками и числами, расширяет String.prototype и Number.prototype:

function lt(o) {
    return ((typeof this.valueOf() === typeof o) && (this < o));
}
String.prototype.lt = lt;
Number.prototype.lt = lt;
"10".lt(11);   // false
(11).lt("12"); // false

Ответ 2

Как создать объект и использовать его

var strictComparison = {
    "<" : function(a,b) { return ((typeof a === typeof b) && (a < b)) },
    "<=" : function(a,b) { return ((typeof a === typeof b) && (a <= b)) },
    ">" : function(a,b) { return ((typeof a === typeof b) && (a > b)) },
    ">=" : function(a,b) { return ((typeof a === typeof b) && (a >= b)) }
};

console.log(strictComparison["<"](5,"6")) ;  
console.log(strictComparison[">"](5,6)) ;