为什么在字符串状态检查中使用严格比较?

Why to use strict comparison in string status checking?

我经常看到在状态检查时使用严格比较 (===) 而不是正常比较 (==) 的答案,即 here:

if(document.readyState === 'complete') ...

如果将它应用于空字符串,我会理解原因,并且获得的值也可能是其他具有不同含义的虚假值。但是当应用于非空字符串时(如示例中的 'complete'),我相信 '==' 和 '===' 的结果总是相同的。是这样吗?

有些人测量“===”可以更快,但我还没有看到一个真实世界的例子,它会产生任何明显的差异,所以我不认真对待这种微优化。

另一方面,每当我看到这个运算符时,我都会将其视为警告“注意这里的类型!”。但是由于 document.readyState 始终是字符串,这让我很恼火,因为原始编码器让我研究代码可能出现的其他类型 - 只是为了发现只有字符串。

对我来说,当类型在比较中不起作用时,对那些阅读我的代码并且从不使用'==='的人礼貌是一个强有力的理由。

由于“===”出现在许多 SO 答案和许多专家页面的类似情况下,我想知道它是否只是社交潮流,或者是否有任何充分的理由为什么要在状态检查中使用它。

我建议在需要 strict 相等性检查时始终使用“===”而不是“==”,这在大多数情况下是必需的,原因如下:声明意图。当我看到带有“===”的代码时,我会将其读作 'a must be referentially or primitively equal to b'。当我看到'=='时,我会读成'a must be coercibly equal to b'。据此,我将判断代码/原始程序员试图完成什么样的目标,以及他们如何传递数据以完成工作。从本质上讲,它可以深入了解应用程序的上下文、数据传递的方式以及此功能/方法/代码块如何适应图片。

话虽这么说,如果我看到有人'a == b'当他们都是弦乐的时候,我也不会高高在上大惊小怪。

这总是取决于你想要达到什么,以及你认为什么是平等的。

== 并不总是坏事,但它常常会导致错误的假设。

如果你有这样的事情:

class TestA {
  toString() {
     return 'complete'
  }
}

class TestB {
  valueOf() {
     return 'complete'
  }
}

let testA = new TestA()
let testB = new TestB()
console.log(testA == 'complete')
console.log(testB == 'complete')

那么 testA == 'complete' 可能正是您想要的,但是因为它进行了隐式转换,所以当它的计算结果为 true.[=19 时,您可能会错误地假设它是一个字符串=]

因此,如果您以后想对其调用 substring 之类的东西,或者将其传递给另一个需要实际字符串的函数,那么它可能会因意外错误而失败。

== 上使用 === 主要是关于可维护性,如果您开始重构代码,或者如果您查看旧代码并看到 ==,您总是需要考虑如果你真的想在那个时候进行隐式转换,或者这是一个意外。因此,您需要遵循代码流程或检查是否已记录。

显式使用和 === 并不能防止您犯其他错误,但可以使代码保持一致。