93

最近,当我遇到此错误时,我正在通过 JSLint 运行我的一些代码。我认为这个错误的有趣之处在于它自动假定所有 == 都应该是 ===。

这真的有意义吗?我可以看到很多你不想比较类型的实例,我担心这实际上会导致问题。

“预期”一词意味着每次都应该这样做......这对我来说没有意义。

4

8 回答 8

132

IMO,盲目地使用===,而不试图理解类型转换的工作原理没有多大意义。

对 Equals 运算符的主要担心==是,取决于比较类型的比较规则会使运算符不可传递,例如,如果:

A == B AND
B == C

并不能真正保证:

A == C

例如:

'0' == 0;   // true
 0  == '';  // true
'0' == '';  // false

当您比较相同类型的值时,Strict Equals 运算符===并不是必需的,最常见的示例:

if (typeof foo == "function") {
  //..
}

我们将始终stringtypeof的运算符的结果与字符串文字进行比较...

或者当您知道类型强制规则时,例如,检查某物是否是nullundefined某物:

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
}
于 2010-09-17T14:17:03.973 回答
26

JSLint 本质上比 Javascript 语法所允许的更具防御性。

从 JSLint 文档中:

==and运算符在!=比较之前进行类型转换。这很糟糕,因为它会导致' \t\r\n' == 0为真。这可以掩盖类型错误。

与以下任何值进行比较时,请使用===or!==运算符(不进行类型强制):0 '' undefined null false true

如果您只关心一个值是还是,那么请使用简写形式。代替

(foo != 0)

说啊

(foo)

而不是

(foo == 0)

(!foo)

和运算===!==是首选。

于 2010-09-17T14:04:48.507 回答
18

请记住,JSLint 强制人们对好的 JavaScript 应该是什么的想法。在实施它建议的更改时,您仍然必须使用常识。

一般来说,比较类型和值将使您的代码更安全(当类型转换没有按照您的想法进行时,您不会遇到意外行为)。

于 2010-09-17T14:01:43.420 回答
15

Triple-equal 与 double-equal 不同,因为除了检查两侧是否为相同的值之外,triple-equal 还检查它们是否为相同的数据类型。

所以("4" == 4)是真的,而是("4" === 4)假的。

Triple-equal 的运行速度也稍快一些,因为 JavaScript 在给出答案之前不必浪费时间进行任何类型转换。

JSLint 旨在使您的 JavaScript 代码尽可能严格,以减少晦涩的错误。它强调了这种事情,试图让你以一种迫使你尊重数据类型的方式编写代码。

但是 JSLint 的好处是它只是一个指南。正如他们在网站上所说,即使你是一个非常优秀的 JavaScript 程序员,它也会伤害你的感情。但你不应该觉得有义务听从它的建议。如果你已经阅读了它的内容并且理解了它,但你确信你的代码不会被破坏,那么你就不会强迫你改变任何东西。

如果您不想被警告轰炸而您不会做任何事情,您甚至可以告诉 JSLint 忽略检查类别。

于 2010-09-17T15:07:20.063 回答
8

来自http://javascript.crockford.com/code.html的引用:

=== 和 !== 运算符。

使用 === 和 !== 运算符几乎总是更好。== 和 != 运算符会进行类型强制。特别是,不要使用 == 与虚假值进行比较。

JSLint 非常严格,他们的“webjslint.js”甚至没有通过他们自己的验证。

于 2010-09-17T14:03:45.547 回答
4

如果你想测试虚假性。JSLint 不允许

if (foo == null)

但确实允许

if (!foo)
于 2015-06-24T19:39:11.697 回答
3

为了帮助解释这个问题并解释为什么 NetBeans (from) 7.3 开始显示此警告,这是从 NetBeans 错误跟踪器上的响应中摘录的,当时有人将此报告为错误:

在 JavaScript 中使用 === 而不是 == 是一种很好的做法。

== 和 != 运算符在比较之前进行强制类型转换。这很糟糕,因为它会导致 ' \t\r\n' == 0 为真。这可以掩盖类型错误。JSLint 无法可靠地确定 == 是否被正确使用,因此最好不要使用 == 和 != 并始终使用更可靠的 === 和 !== 运算符。

参考

于 2013-03-14T16:28:25.500 回答
2

好吧,它不会真正引起问题,它只是给你建议。要么接受,要么离开它。也就是说,我不确定它有多聪明。在某些情况下,它可能不会将其视为问题。

于 2010-09-17T14:01:35.603 回答