最近,当我遇到此错误时,我正在通过 JSLint 运行我的一些代码。我认为这个错误的有趣之处在于它自动假定所有 == 都应该是 ===。
这真的有意义吗?我可以看到很多你不想比较类型的实例,我担心这实际上会导致问题。
“预期”一词意味着每次都应该这样做......这对我来说没有意义。
最近,当我遇到此错误时,我正在通过 JSLint 运行我的一些代码。我认为这个错误的有趣之处在于它自动假定所有 == 都应该是 ===。
这真的有意义吗?我可以看到很多你不想比较类型的实例,我担心这实际上会导致问题。
“预期”一词意味着每次都应该这样做......这对我来说没有意义。
IMO,盲目地使用===
,而不试图理解类型转换的工作原理没有多大意义。
对 Equals 运算符的主要担心==
是,取决于比较类型的比较规则会使运算符不可传递,例如,如果:
A == B AND
B == C
并不能真正保证:
A == C
例如:
'0' == 0; // true
0 == ''; // true
'0' == ''; // false
当您比较相同类型的值时,Strict Equals 运算符===
并不是必需的,最常见的示例:
if (typeof foo == "function") {
//..
}
我们将始终为stringtypeof
的运算符的结果与字符串文字进行比较...
或者当您知道类型强制规则时,例如,检查某物是否是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 文档中:
==
and运算符在!=
比较之前进行类型转换。这很糟糕,因为它会导致' \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”甚至没有通过他们自己的验证。
如果你想测试虚假性。JSLint 不允许
if (foo == null)
但确实允许
if (!foo)
为了帮助解释这个问题并解释为什么 NetBeans (from) 7.3 开始显示此警告,这是从 NetBeans 错误跟踪器上的响应中摘录的,当时有人将此报告为错误:
在 JavaScript 中使用 === 而不是 == 是一种很好的做法。
== 和 != 运算符在比较之前进行强制类型转换。这很糟糕,因为它会导致 ' \t\r\n' == 0 为真。这可以掩盖类型错误。JSLint 无法可靠地确定 == 是否被正确使用,因此最好不要使用 == 和 != 并始终使用更可靠的 === 和 !== 运算符。
好吧,它不会真正引起问题,它只是给你建议。要么接受,要么离开它。也就是说,我不确定它有多聪明。在某些情况下,它可能不会将其视为问题。