最近,当我想出这个错误时,我通过JSLint运行了一些代码。我认为这个错误很有趣但它自动假设所有==应该是===。
这真的有意义吗?我可以看到很多你不想比较类型的实例,我担心这实际上会导致问题。
“预期”这个词意味着每次都应该这样做.....这对我来说是没有意义的。
答案 0 :(得分:121)
IMO,盲目地使用===
,而没有尝试理解 类型转换的工作方式没有多大意义。
关于等于运算符==
的主要恐惧是,比较规则取决于所比较的类型可以使运算符不可传递,例如,如果:
A == B AND
B == C
并不能真正保证:
A == C
例如:
'0' == 0; // true
0 == ''; // true
'0' == ''; // false
当您比较相同类型的值时,不一定需要Strict Equals运算符===
,这是最常见的示例:
if (typeof foo == "function") {
//..
}
我们将typeof
运算符(始终 字符串)的结果与字符串文字进行比较...
或者,当您知道类型强制规则时,请检查某些内容是null
还是undefined
:
if (foo == null) {
// foo is null or undefined
}
// Vs. the following non-sense version:
if (foo === null || typeof foo === "undefined") {
// foo is null or undefined
}
答案 1 :(得分:24)
JSLint本质上比Javascript语法允许的更具防御性。
来自JSLint文档:
==
和!=
运算符会在比较之前输入强制。这很糟糕,因为它会导致' \t\r\n' == 0
为真。这可以掩盖类型错误。与以下任何值进行比较时,请使用
===
或!==
运算符(不执行类型强制):0 '' undefined null false true
如果您只关心某个值 truthy 或 falsy ,请使用简短表单。而不是
(foo != 0)
只是说
(foo)
而不是
(foo == 0)
说
(!foo)
首选
===
和!==
运算符。
答案 2 :(得分:17)
请记住,JSLint强制要求一个人了解JavaScript应该是什么。在实施它建议的更改时,您仍然需要使用常识。
通常,比较类型和值会使代码更安全(当类型转换没有按照您的想法进行时,您不会遇到意外行为。)
答案 3 :(得分:12)
Triple-equal不同于double-equal,因为除了检查双方是否是相同的值之外,triple-equal还检查它们是否是相同的数据类型。
所以("4" == 4)
为真,而("4" === 4)
为假。
Triple-equal也会稍微快一些,因为JavaScript在给你答案之前不必浪费时间进行任何类型的转换。
JSLint旨在尽可能严格地使您的JavaScript代码,以减少模糊的错误。它强调了这种尝试让你以强迫你尊重数据类型的方式编写代码的事情。
但JSLint的好处在于它只是一个指南。正如他们在网站上所说,即使你是一个非常优秀的JavaScript程序员,也会伤害你的感情。但你不应该感到有义务遵循它的建议。如果你已经阅读了它所说的内容并且你理解它,但是你确信你的代码不会破坏,那么就没有强迫你改变任何东西。
如果你不想被警告轰炸,你甚至可以告诉JSLint忽略支票类别。
答案 4 :(得分:8)
来自http://javascript.crockford.com/code.html的引用:
===和!==运营商。
使用它几乎总是更好 ===和!==运营商。 ==和!=运算符会输入强制。在 特别是,不要使用==来比较 反对虚假的价值观。
JSLint非常严格,他们的'webjslint.js'甚至没有通过他们自己的验证。
答案 5 :(得分:3)
为了帮助解释这个问题,并解释为什么NetBeans(from)7.3已经开始显示此警告,这是NetBeans错误跟踪器上的响应摘录,当有人将此报告为错误时:
最好在JavaScript中使用===而不是==。
==和!=运算符在比较之前输入强制。这很糟糕,因为 它会导致'\ t \ r \ n'== 0为真。这可以掩盖类型错误。 JSLint不能 可靠地确定是否正确使用==,因此最好不要使用== 和!=完全使用更可靠的===和!==运算符 代替。
答案 6 :(得分:2)
好吧它不能真正引起问题,它只是给你建议。要么接受,要么离开它。那就是说,我不确定它有多聪明。可能存在一些背景,它不会将其作为一个问题提出来。
答案 7 :(得分:2)
如果你想测试虚假。 JSLint不允许
if (foo == null)
但确实允许
if (!foo)