最近,当我遇到这个错误时,我正在通过 JSLint 运行我的一些代码。我认为这个错误的有趣之处在于它自动假设所有 == 应该是 ===。
这真的有意义吗?我可以看到很多您不想比较类型的实例,我担心这实际上会导致问题。
“预期”这个词意味着每次都应该这样做......这对我来说没有意义。
最近,当我遇到这个错误时,我正在通过 JSLint 运行我的一些代码。我认为这个错误的有趣之处在于它自动假设所有 == 应该是 ===。
这真的有意义吗?我可以看到很多您不想比较类型的实例,我担心这实际上会导致问题。
“预期”这个词意味着每次都应该这样做......这对我来说没有意义。
IMO,盲目使用===
,但不尝试了解如何类型转换工作没有太大的意义。
对 Equals 运算符的主要担心==
是取决于所比较类型的比较规则可能会使运算符不可传递,例如,如果:
A == B AND
B == C
并不能真正保证:
A == C
例如:
'0' == 0; // true
0 == ''; // true
'0' == ''; // false
===
当您比较相同类型的值时,Strict Equals 运算符并不是真正必要的,最常见的例子是:
if (typeof foo == "function") {
//..
}
我们将typeof
运算符的结果(始终为string)与字符串文字进行比较...
或者当你知道类型强制规则时,例如,检查某事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
}
JSLint 本质上比 Javascript 语法所允许的更具防御性。
从 JSLint 文档:
在
==
和!=
比较之前运营商做的强制类型转换。这是不好的,因为它导致' \t\r\n' == 0
真实。这可以掩盖类型错误。与以下任何值进行比较时,请使用
===
or!==
运算符(不执行类型强制):0 '' undefined null false true
如果您只关心一个值是真的还是假的,那么请使用简写形式。代替
(foo != 0)
说啊
(foo)
而不是
(foo == 0)
说
(!foo)
的
===
和!==
运营商是优选的。
请记住,JSLint 强制一个人理解什么是好的 JavaScript。在实施建议的更改时,您仍然必须使用常识。
通常,比较类型和值将使您的代码更安全(当类型转换没有按照您认为应该做的事情进行时,您不会遇到意外行为)。
Triple-equal 与 double-equal 不同,因为除了检查两侧是否为相同的值之外,triple-equal 还会检查它们是否为相同的数据类型。
所以("4" == 4)
是真的,而是("4" === 4)
假的。
Triple-equal 的运行速度也稍快一些,因为 JavaScript 在给出答案之前不必浪费时间进行任何类型转换。
JSLint 有意使您的 JavaScript 代码尽可能严格,目的是减少晦涩的错误。它强调了这类事情,试图让您以一种强迫您尊重数据类型的方式进行编码。
但 JSLint 的好处在于它只是一个指南。正如他们在网站上所说的那样,即使您是一个非常优秀的 JavaScript 程序员,它也会伤害您的感情。但是你不应该觉得有义务听从它的建议。如果您已经阅读了它的内容并且理解了它,但是您确定您的代码不会被破坏,那么您就没有必要进行任何更改。
如果您不想被警告轰炸,您甚至可以告诉 JSLint 忽略检查类别,如果您不想做任何事情的话。
引自http://javascript.crockford.com/code.html:
=== 和 !== 运算符。
使用 === 和 !== 运算符几乎总是更好。== 和 != 运算符进行类型强制。特别是,不要使用 == 与虚假值进行比较。
JSLint 非常严格,他们的'webjslint.js' 甚至没有通过他们自己的验证。