Javascript Has==和!=变成坏习惯?

Javascript Has==和!=变成坏习惯?,javascript,type-conversion,operators,warnings,equality,Javascript,Type Conversion,Operators,Warnings,Equality,几个月以来,my 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

几个月以来,my 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

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

是的,这是近二十年来的最佳实践

警告是非常清楚的(甚至解释了为什么会有这样的警告),在JavaScript书籍中以及在web上都可以找到相同的建议

所以,我不能理解为什么你会考虑忽略甚至禁用它。
您可以在此处找到有关何时选择
==
和何时选择
==
的更多信息:


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

例如,这些都是真实的:

 "0" == false
 "0"
虽然这是错误的:

 false

=
仅适用于
if(x==null)
,因为它会命中
未定义的
tooi.e。不“好”really@BoundaryImposition:那怎么不好?我从来都不想在空/未定义之间进行区分;两者都表示“不”。为什么打字比需要的字迹更清晰;让编译器来完成这项工作。@dandavis将这个问题标记为一个因没有建设性而关闭的问题的副本是没有帮助的。它本质上是说这个问题不是建设性的。你是在暗示隐式类型强制是一件坏事。如果您的应用程序不够明确,以至于您不确定要比较的类型/值,那么我认为您的代码有更大的问题<代码>=
相当于
=
当值属于同一类型时。@mhodges但如果有人滥用您的库或项目中的新开发人员传递错误的值并得到奇怪的结果,该怎么办?从长远来看,使用
==
对每个人都有帮助,而且非常值得额外的按键。如果没有确定“最佳”标准的支持,“最佳实践”一词是毫无意义的。@4castle:也许吧(尽管请参见我在问题下的评论)。我现在把dupevote变成了十字架-reference@BoundaryImposition实际上,在比较表达式中使用隐式类型强制时,只有少数值会产生意外的结果。如果你能知道这些并避免它们,
==
是完全安全的。这有点像
var
vs
let/const
辩论。let/const不是新的变量,
()=>
不是新的
函数,
==
不是“新的”
=
。它们各自有不同但非常合理的用途。如果你试图比较两个值,而你完全不知道这两种类型,你怎么知道
===
是否会比
==
更能达到可预测的结果?如果你那么无知,那么在进行相等性计算之前,你需要做一些类型检查。@robg,因为显式总是比隐式好。如果您不知道他可能传递了什么,比如在序列化中,您可以显式地检查一些情况并抛出错误,或者为其余的情况使用默认处理程序。它还为您保存了以下情况:最初为一种用途设计函数,然后将其扩展到新用途,由于隐式行为而获得意外结果。这些注释适用于这两种情况。我的问题是将
===
概括为“最佳实践”,而不考虑“最佳实践”实际上是什么。在不同的情况下,它通常会导致不同的结果,并且一直都在执行类型强制,以获得ISO工作日,我使用
date.getDay()| 7
。因此,在某些情况下使用
==
可能是合适的,而在另一些情况下使用
==
重新调整代码用途可能会导致许多问题,而不仅仅是抽象与严格比较所产生的问题