引言
在javascript中,你可能会写出以下两段代码:
if (x == y) {
// do something here
}
或者
if (x === y) {
// do something here
}
这两端代码的区别是:第二段代码使用了三等于运算符,也称为严格相当或恒等于运算符。对于Javascript初学者来说,可能提倡使用三等于运算符,不用双等运算符。但就是不明白为什么,他们两者的区别又是什么?
两者区别
在使用双等运算符的比较中,如果被比较的两个值相等,将返回true(真)。但有种情况:在类型不同的两个值之间比较时,就会发生强制转换。每个JavaScript值属于一个特定的“类型”。这些类型是:数字,字符串,布尔值,函数和对象。所以,如果你尝试用字符串(string)和数字(number)进行比较,浏览器在比较之前,就会尝试把字符串转换成数字,再进行比较。同样,如果用真(true)或假(false)与数字(number)进行比较,它会把真或假转化为1或0 。
这会带来不可预知的后果,下面是一些例子:
console.log(99 == "99"); // true
console.log(0 == false); // true
尽管看起来没有问题,但它可以引起麻烦,例如:
console.log(' \n\n\n' == 0); // true
console.log(' ' == 0); // true
鉴于此,多数javascript专家建议使用三等运算符,不用双等运算符。因为三等运算符从来不会强制类型转换。这意味着:使用三等运算符,上面四个例子将会得到正确的结果。
console.log(99 === "99"); // false
console.log(0 === false); // false
console.log(' \n\n\n' === 0); // false
console.log(' ' === 0); // false
不等于又是什么情况?
这次用不等于测试上面的例子:
console.log(99 != "99"); // false
console.log(0 != false); // false
console.log(' \n\n\n' != 0); // false
console.log(' ' != 0); // false
注意,每个例子的最终结果都应该是真(true),但事实相反,因为受到了强制转换的影响。
如果改成双等运算符,将得到正确的结果:
console.log(99 !== "99"); // true
console.log(0 !== false); // true
console.log(' \n\n\n' !== 0); // true
console.log(' ' !== 0); // true
总结
建议总是使用严格相等运算符,这将有助于你的代码保持数据完整性。