27

在 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比较运算符

4

2 回答 2

12

没有您想要的内置运算符,但您始终可以创建自己的函数。例如,对于<

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

如果您只处理字符串和数字,另一种选择是扩展String.prototypeand 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
于 2012-10-26T17:00:42.977 回答
7

如何创建一个对象并使用它

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)) ;   
于 2012-10-26T17:03:27.263 回答