最近,当我想到此错误时,我正在通过JSLint运行我的一些代码。我认为对此错误很可笑的是,它会自动假定所有==应该都是===。
这真的有意义吗?我可以看到很多您不希望比较类型的实例,而且我担心这可能会导致问题。
“期望”一词意味着每次都应该这样做。...那对我来说没有意义。
最近,当我想到此错误时,我正在通过JSLint运行我的一些代码。我认为对此错误很可笑的是,它会自动假定所有==应该都是===。
这真的有意义吗?我可以看到很多您不希望比较类型的实例,而且我担心这可能会导致问题。
“期望”一词意味着每次都应该这样做。...那对我来说没有意义。
myVar == null
检查,是的,可以有很大的改变。; ^)Crockford的观点是它使代码的含义更加精确,这很难争论。
Answers:
IMO,盲目使用 ===
,但不尝试了解如何类型转换工作没有太大的意义。
首要的 对Equals运算符担心==
是,取决于比较类型的比较规则可能使运算符不可传递,例如,在以下情况下:
A == B AND
B == C
并不能真正保证:
A == C
例如:
'0' == 0; // true
0 == ''; // true
'0' == ''; // false
严格等于运算符 ===
当您比较相同类型的值(最常见的示例)时,实际上不需要:
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
}
===
运算符的要点是代码清晰。没有合理的情况可以使用,==
因为它永远不会像身份运算符那样清晰易懂。这与您是否了解运算符无关,而与使用使您的代码更易于阅读而几乎不花任何钱的代码有关。唯一反对身份运算符的开发人员是单独开发人员和不团队合作的人员。根据定义,没有足够的眼睛来审查代码的人。
there is no reasonable situation
还有严重的错误陈述。考虑一下(本机)JavaScript类型Number
和String
。它们的存在证明Javascript作者考虑到了某些用例==
。您真的认为对的new String('hi') === 'hi'
评估false
很明确吗?请编写一个代码片段,测试您的函数参数是否'hi'
同时接受String和string,并告诉我这很清楚。
JSLint本质上比Javascript语法所允许的更具防御性。
从JSLint文档中:
在
==
与!=
比较之前运营商做的强制类型转换。这是不好的,因为它使' \t\r\n' == 0
事实成为事实。这可以掩盖类型错误。与以下任一值进行比较时,请使用
===
或!==
运算符(不键入强制):0 '' undefined null false true
如果您只关心值是真实的还是虚假的,请使用缩写形式。代替
(foo != 0)
说啊
(foo)
而不是
(foo == 0)
说
(!foo)
的
===
和!==
运营商是优选的。
==
操作员一起使用。这===
是一种特殊情况... JSLint试图使它看起来好像使用起来==
有点不对劲...但是,请尝试以下操作:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
。基本类型具有对应的类来替代它们(Number
,String
),而Javascript则取决于==
运算符以使其自然地进行比较。
请记住,JSLint强制一个人对好的JavaScript应该是什么的想法。在实现建议的更改时,您仍然必须使用常识。
通常,比较类型和值将使您的代码更安全(当类型转换未按您预期的方式运行时,您不会遇到意外行为)。
三重等于不同于双重等于,因为除了检查双方是否具有相同的值外,三重等于还检查它们是否具有相同的数据类型。
所以("4" == 4)
是真实的,而("4" === 4)
是假的。
Triple-equal的运行速度也稍快一些,因为JavaScript不必浪费时间进行任何类型转换,即可为您提供答案。
JSLint旨在使您的JavaScript代码尽可能严格,以减少模糊的错误。它强调了这种事情,试图使您以迫使您尊重数据类型的方式进行编码。
但是关于JSLint的好处是它只是一个指南。正如他们在网站上所说,即使您是一个非常优秀的JavaScript程序员,也会伤害您的感受。但是,您不应有义务听从它的建议。如果您已经阅读了要说的内容并且理解了,但是您确定自己的代码不会中断,那么您就不必强迫自己进行任何更改。
如果您不想受到警告,表示您将不做任何事情,甚至可以告诉JSLint忽略检查的类别。
来自http://javascript.crockford.com/code.html的报价:
===和!==运算符。
最好总是使用===和!==运算符。==和!=运算符确实会强制输入。特别是,请勿使用==与伪造的值进行比较。
JSLint非常严格,他们的“ webjslint.js”甚至没有通过自己的验证。
webjslint.js
不进行验证的-尽管我现在看到的大多数错误都与间距有关。显然,在使用JSLint审阅JavaScript时,必须使用常识和合理的判断力。
always
自动使该报价失去智慧。聪明的程序员不是教条。他们使用给定情况下的最佳方法。他们欢迎并拥抱语言核心所内置的任何工具,而不仅仅是使用just never touch it
。底线:我的代码更短(不仅是保存一个=
字符),因此,我的网站加载速度更快,带宽成本也更低,因此,可以为用户提供更好的服务。
为了帮助解释这个问题并解释为什么NetBeans(自)7.3开始显示此警告,这是从NetBeans Bug跟踪程序的响应中提取的,当有人将其报告为bug时:
在JavaScript中,最好使用===而不是==。
==和!=运算符在比较之前会键入强制。这很糟糕,因为它导致'\ t \ r \ n'== 0为真。这可以掩盖类型错误。JSLint无法可靠地确定==是否正确使用,因此最好不要使用==和!=,而始终使用更可靠的===和!==运算符。
嗯,这并不能真正引起问题,只是给您建议。要么接受,要么离开它。也就是说,我不确定它有多聪明。在某些情况下,它可能不会将其视为问题。