JSLint预期为“ ===”,而看到为“ ==”


89

最近,当我想到此错误时,我正在通过JSLint运行我的一些代码。我认为对此错误很可笑的是,它会自动假定所有==应该都是===。

这真的有意义吗?我可以看到很多您不希望比较类型的实例,而且我担心这可能会导致问题。

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


7
我也与JSLint碰到了这一点。我从==更新到===,它实际上破坏了以前的工作代码。
kemiller2002's

5
如果您的代码有100行以上,那么它不会通过jslint,实际上,这是不可能的。

3
“布鲁克”这个词太强了。它改变了代码的含义。如果您要进行myVar == null检查,是的,可以有很大的改变。; ^)Crockford的观点是它使代码的含义更加精确,这很难争论。
鲁芬

Answers:


127

IMO,盲目使用 ===,但不尝试了解如何类型转换工作没有太大的意义。

首要的 对Equals运算符担心==是,取决于比较类型的比较规则可能使运算符不可传递,例如,在以下情况下:

A == B AND
B == C

并不能真正保证:

A == C

例如:

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

严格等于运算符 ===当您比较相同类型的值(最常见的示例)时,实际上不需要:

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

我们typeof比较运算符的结果,它总是一个字符串)与字符串文字进行比较...

或者当你知道类型强制规则,例如,检查是否是东西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
}

1
我讨厌JSLint的这个规则。我认为真正的问题是人们不应该以他们不理解的方式使用运算符(具有讽刺意味的是,这些人通常是同一类人,他们会盲目地将“ ===”替换为“ ==”)。当然,将数字0与各种字符串进行比较时会出现一些常见情况,但是如果要比较不相关的数据(例如0 =='this is a string'),则您的代码可能会遇到比double equal更大的问题!如果您确定要处理的类型,以及它们与==的确切交互方式,那么我认为您应该使用它。
2014年

3
@Jon===运算符的要点是代码清晰。没有合理的情况可以使用,==因为它永远不会像身份运算符那样清晰易懂。这与您是否了解运算符无关,而与使用使您的代码更易于阅读而几乎不花任何钱的代码有关。唯一反对身份运算符的开发人员是单独开发人员和不团队合作的人员。根据定义,没有足够的眼睛来审查代码的人。
Alternatex

2
我发现== null比较几乎是必不可少的。如果您的代码经过了良好的测试,则此问题变得不再重要。
2015年

1
实际上,有时必须使用==才能执行所需的测试。如果foo.toString()将以可预测的方式执行,并且需要针对该输出测试纯字符串,则编写foo == stringToTest比foo.toString()=== stringToTest干净得多。
克里斯彭·史密斯

2
@Alternatex如果重点是明确的,则不应该使它等于三倍!没有初学者理解。从其他语言中至少知道两倍等于。此外,there is no reasonable situation还有严重的错误陈述。考虑一下(本机)JavaScript类型NumberString。它们的存在证明Javascript作者考虑到了某些用例==。您真的认为对的new String('hi') === 'hi'评估false很明确吗?请编写一个代码片段,测试您的函数参数是否'hi'同时接受String和string,并告诉我这很清楚。
Stijn de Witt

25

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

从JSLint文档中:

==!=比较之前运营商做的强制类型转换。这是不好的,因为它使' \t\r\n' == 0事实成为事实。这可以掩盖类型错误。

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

如果您只关心值是真实的还是虚假的,请使用缩写形式。代替

(foo != 0)

说啊

(foo)

而不是

(foo == 0)

(!foo)

===!==运营商是优选的。


8
我必须得出结论,来自JSLint的人们在一个从未有过的高象牙塔中工作。Javascript旨在==操作员一起使用。这===是一种特殊情况... JSLint试图使它看起来好像使用起来==有点不对劲...但是,请尝试以下操作:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}。基本类型具有对应的类来替代它们(NumberString),而Javascript则取决于==运算符以使其自然地进行比较。
Stijn de Witt

17

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

通常,比较类型和值将使您的代码更安全(当类型转换未按您预期的方式运行时,您不会遇到意外行为)。


4
另外,它不能像程序员一样具有上下文智能。它的作用是使大多数用户被系统固有的自动类型转换绊倒(例如暴力-“帮助我被压制的帮助!”)
Rudu 2010年

14

三重等于不同于双重等于,因为除了检查双方是否具有相同的值外,三重等于还检查它们是否具有相同的数据类型。

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

Triple-equal的运行速度也稍快一些,因为JavaScript不必浪费时间进行任何类型转换,即可为您提供答案。

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

但是关于JSLint的好处是它只是一个指南。正如他们在网站上所说,即使您是一个非常优秀的JavaScript程序员,也会伤害您的感受。但是,您不应有义务听从它的建议。如果您已经阅读了要说的内容并且理解了,但是您确定自己的代码不会中断,那么您就不必强迫自己进行任何更改。

如果您不想受到警告,表示您将不做任何事情,甚至可以告诉JSLint忽略检查的类别。


3
我没有问“什么是===“,所以我不确定你为什么回答。
Metropolis

8
@Metropolis:如果没有其他原因,那么作为背景,以防其他人阅读不知道的答案。不过,我确实尝试在之后的段落中回答您的问题。
Spudley 2010年

@Spudley + 1的附加的和有用的信息
奔小型

1
是的,它快了10到100倍:jsperf速度测试
vladkras

8

来自http://javascript.crockford.com/code.html的报价:

===和!==运算符。

最好总是使用===和!==运算符。==和!=运算符确实会强制输入。特别是,请勿使用==与伪造的值进行比较。

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


很好的澄清。确实是关于webjslint.js不进行验证的-尽管我现在看到的大多数错误都与间距有关。显然,在使用JSLint审阅JavaScript时,必须使用常识和合理的判断力。
2011年

使用该词会always自动使该报价失去智慧。聪明的程序员不是教条。他们使用给定情况下的最佳方法。他们欢迎并拥抱语言核心所内置的任何工具,而不仅仅是使用just never touch it。底线:我的代码更短(不仅是保存一个=字符),因此,我的网站加载速度更快,带宽成本也更低,因此,可以为用户提供更好的服务。
Stijn de Witt

4

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

if (foo == null)

但确实允许

if (!foo)

使用===JSLint建议的。
clickbait

1
@NarawaGames此解决方案是完全可以接受的。

这个答案不好。问题是这两者都意味着其他。foo == null检查null或未定义。!foo检查null,undefined,0和空字符串。
Markos

@Markos此答案是使JSLint满意并保持代码逻辑完整的有用替代方法,而不是完全等效的方法。这就是为什么我在答案前加上“如果检查虚假性”的原因
nano2nd'1

3

为了帮助解释这个问题并解释为什么NetBeans(自)7.3开始显示此警告,这是从NetBeans Bug跟踪程序的响应中提取的,当有人将其报告为bug时:

在JavaScript中,最好使用===而不是==。

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

参考


1
我刚才也使用Netbeans发现了此错误。奇怪的是,由于他们提供的异常案例,他们会以严重的警告对待。
忽略了

1
我的意思是,这是真的,但是在很多用例中,人们都知道这两个被比较的事物将是同一类型,因此,由于这种奇怪的情况,可以将回车与数字进行比较,这似乎很奇怪零是==的所有用法均被视为错误的原因。我发现虽然===更快,因为没有类型转换完成。我很惊讶我在netbeans之前没有发现这一点。
忽略了

@oMiKeY是的,我明白您的意思,他们本可以给出更实际的例子!
EM-Creations

2

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


但是为什么使用“期望的”一词呢?这听起来好像您应该始终这样做。
Metropolis

4
评估人员正在尝试验证有效答案。如果没有得到有效的响应,则不是预期的结果。验证器首先假设一切都很好,然后在遍历代码时指出错误。它不一定了解什么是无效响应,而只是知道何时看到无效响应。它也可以相反地工作,根据坏的规则故意搜索坏的代码。白名单与黑名单。
Rushyo 2010年

问题是“这真的有意义吗?”。鉴于这个问题,是的。另外,那是五年前。耶稣。
Rushyo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.