【问题标题】:Has == and != become bad practise?== 和 != 是否已成为坏习惯?
【发布时间】:2017-12-03 19:21:20
【问题描述】:

几个月以来,我的 IDE (WebStorm) 突出显示了 JavaScript 常规相等运算符,并带有以下警告:

Comparioson a == b may cause unexpected type coercion.
This inspection reports usages of JavaScript quality operators which may cause unexpected
type coercions. It is considered a good practice to use the type-safe equality operators
=== and !== instead of their regular counterparts == and !=.

我知道这两个操作员的不同行为,我倾向于使用它们,因为它们的行为不同,例如。对于惰性类型转换:

if(parseInt(val) == val) // val can be safely converted to int

但是,IDE 正在为==所有 个事件添加警告,因此上述内容不再感觉正确。我可以将所有这些部分转换成可读性差的东西:

if(parseInt(val).toString() === val) // be happy webstorm

这真的是要走的路吗?还是我应该忽略/禁用这些警告?

【问题讨论】:

  • == 只对 if(x==null) 有用,因为它也命中 undefined
  • 即真的不是“好”
  • @BoundaryImposition:这怎么不好?我从来不想在 null/undefined 之间分裂头发;都是“不”的意思。为什么要输入更多内容以使其清晰易读;让编译器完成这项工作。
  • 将此问题标记为因不具建设性而被关闭的问题的副本没有帮助。它本质上是在说这个问题没有建设性。

标签: javascript type-conversion operators warnings equality


【解决方案1】:

是的,这是近二十年来的最佳做法。

警告非常明确(甚至解释了为什么它会出现),您会在 JavaScript 书籍以及网络上广泛找到相同的建议。

所以,我无法理解您为什么会考虑忽略甚至禁用它。


您可以在此处找到有关何时选择== 以及何时选择=== 的更多信息:

【讨论】:

  • 您暗示隐式类型强制是一件坏事。如果您的应用程序足够模糊以至于您不确定要比较的类型/值,我认为您的代码存在更大的问题。当值的类型相同时,== 等效于 ===
  • @mhodges 但是,如果有人滥用您的库或新开发人员进入项目传递错误的值并得到奇怪的结果怎么办?从长远来看,使用=== 可以帮助每个人,并且非常值得额外按键。
  • 如果没有确定“最佳”的标准,“最佳实践”一词就毫无意义。
  • @4castle:也许(尽管请参阅我在问题下的评论)。我现在已将 dupevote 转换为交叉引用
  • @BoundaryImposition 实际上,在比较表达式中使用隐式类型强制时,只有少数值会产生意外结果。如果你能知道这些并避免它们,== 是完全安全的。这有点像 varlet/const 的辩论。 let/const 不是新的 var,() => 不是新的 function=== 不是“新”==。它们各自服务于不同但非常合法的目的。
【解决方案2】:

我认为任何形式的类型强制,如果对于在运行时可能不知道的类型(如任何动态语言)是意外的,都是不好的做法。

例如,这些都是真实的:

 "0" == false
 "0"

虽然这是错误的:

 false

【讨论】:

  • 如果您尝试比较两个值,但您完全不知道任何一种类型,您如何知道=== 是否会比== 获得更可预测的结果?如果您对此一无所知,那么无论如何您都需要在相等性评估之前进行一些类型检查。
  • @robg 因为显式总是比隐式好。如果您不知道他可能传递了什么,例如可能在序列化中,您可以明确检查一些情况并抛出错误或为其余情况使用默认处理程序。它还可以避免您最初为一种用途设计功能,然后将其扩展到新用途并由于隐式行为而获得意外结果的情况。
  • 这些 cmets 适用于这两种情况。我的问题是将=== 概括为“最佳实践”,而不考虑“最佳实践”实际上是什么。它通常会在不同的情况下导致不同的结果,并且类型强制一直在进行,为了获得 ISO 工作日我使用date.getDay() || 7。因此,在某些情况下使用=== 和在其他情况下使用== 可能是合适的。重新调整代码用途可能会导致许多问题,而不仅仅是抽象与严格比较引起的问题。 ;-)
猜你喜欢
  • 1970-01-01
  • 2018-05-18
  • 2010-10-16
相关资源
最近更新 更多