JSLint 预期为 '===',而是看到了 '=='

IT技术 javascript jslint
2021-02-20 19:01:01

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

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

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

6个回答

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

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

A == B AND
B == C

并不能真正保证:

A == C

例如:

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

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

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

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

或者当你知道类型强制规则时,例如,检查某事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
}
事实上,有时使用 == 是必不可少的,以便执行所需的测试。如果 foo.toString() 将以可预测的方式执行并且需要针对该输出测试纯字符串,那么编写 foo == stringToTest 比 foo.toString() === stringToTest 更简洁。
2021-04-29 19:01:01
我发现 == null 比较几乎是必不可少的。如果您的代码经过良好测试,这个问题就变得不那么重要了。
2021-05-03 19:01:01
@Alternatex 如果重点是清晰,他们不应该让它三重相等!没有初学者理解它。其他语言至少知道双重等于。此外,这there is no reasonable situation是一个严重的错误陈述。想想(原生)Javascript 类型NumberString. 它们的存在证明 Javascript 作者对==. 你真的认为new String('hi') === 'hi'评估到false很清楚吗?请编写一个代码片段来测试您的函数参数是否'hi'接受 String 和 string 并告诉我这很清楚。
2021-05-04 19:01:01
我讨厌 JSLint 的这条规则。我认为真正的问题是人们不应该以他们不理解的方式使用运算符(具有讽刺意味的是,这些人通常会盲目地将“===”替换为“==”)。当然,在将数字 0 与各种字符串进行比较时会出现一些常见情况,但是如果您正在比较不相关的数据,例如 0 == 'this is a string' - 您的代码可能存在比 double equal 更大的问题!如果你确定你正在处理什么类型并且你知道它们如何与 == 交互,那么我认为你应该使用它。
2021-05-09 19:01:01
@Jon===运算符的重点是代码清晰度。没有合理的情况可以使用,==因为它永远不会像身份运算符那样清晰易懂。这与您是否了解运算符无关,而是关于使用使您的代码更易于阅读且几乎不花钱的运算符。唯一反对身份运算符的开发人员是单独的开发人员和不以团队形式工作的人。根据定义,编写代码的人没有经过足够多的眼睛审查。
2021-05-09 19:01:01

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

从 JSLint 文档:

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

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

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

(foo != 0)

说啊

(foo)

而不是

(foo == 0)

(!foo)

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

我必须得出结论,JSLint 的人在一个他们永远无法摆脱的非常高的象牙塔中工作。Javascript旨在==运算符一起使用===是一个特殊的情况下... JSLint的试图使它看起来像使用==会以某种方式是错误的......不过,试试这个:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}原始类型有相应的类来替代它们 ( Number, String) 并且 Javascript 依赖于==操作符来使这些比较自然。
2021-04-26 19:01:01

请记住,JSLint 强制一个人理解什么是好的 JavaScript。在实施建议的更改时,您仍然必须使用常识。

通常,比较类型和值将使您的代码更安全(当类型转换没有按照您认为应该做的事情进行时,您不会遇到意外行为)。

此外,它不能像程序员一样具有上下文智能。它只是在大多数用户被系统固有的自动类型转换绊倒的基础上工作的(比如暴力 - “帮助帮助我被压制!”)
2021-05-13 19:01:01

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

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

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

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

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

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

是的,它快了 10-100 倍:jsperf 速度测试
2021-04-20 19:01:01
我没有问“什么是 ===”,所以我不确定你为什么回答它。
2021-05-07 19:01:01
@Metropolis:如果没有其他原因,那么作为背景,以防其他人阅读不知道的答案。不过,我确实尝试在之后的段落中回答您的问题。
2021-05-10 19:01:01
@Spudley + 1 获取更多有用信息
2021-05-18 19:01:01

引自http://javascript.crockford.com/code.html

=== 和 !== 运算符。

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

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

使用这个词会always自动使这句话失去作为智慧的资格。聪明的程序员不是教条的。他们使用在给定情况下最好的方法。他们欢迎并接受任何内置于语言核心的工具,而不仅仅是用just never touch it. 底线:我的代码更短(不仅仅是保存一个=字符),因此我的网站加载速度更快,带宽成本更低,因此我的用户得到了更好的服务。
2021-04-20 19:01:01
很好的澄清。这是真的,关于webjslint.js不验证——尽管我现在看到的大多数错误都与间距有关。显然,在使用 JSLint 审查 JavaScript 时,必须使用常识和合理的判断。
2021-04-21 19:01:01