需要一个示例来解释为什么使用比较操作数!=and==在JavaScript中被认为是不好的做法

需要一个示例来解释为什么使用比较操作数!=and==在JavaScript中被认为是不好的做法,javascript,Javascript,正如我在某个地方读到的,建议使用!==and==。“如果要检查两个操作数的类型和值是否相同,请使用严格相等运算符(==)。如果只关心值,而类型不重要,请使用常规相等运算符(=)。例如,如果一个操作数是数字5,另一个操作数是字符串”5,标准相等运算符将返回true,但由于它们不是同一类型,严格相等运算符将返回false 这取决于你想做什么 !==和===比较值和类型 上述内容将返回真值。如果这不是您想要的,您应该这样做: 5 === "5" 这将返回false。避免它们的基本原因是=和!=比严格

正如我在某个地方读到的,建议使用!==and==。

“如果要检查两个操作数的类型和值是否相同,请使用严格相等运算符(==)。如果只关心值,而类型不重要,请使用常规相等运算符(=)。例如,如果一个操作数是数字5,另一个操作数是字符串”5,标准相等运算符将返回true,但由于它们不是同一类型,严格相等运算符将返回false
这取决于你想做什么

!==和===比较值和类型

上述内容将返回真值。如果这不是您想要的,您应该这样做:

5 === "5"

这将返回false。

避免它们的基本原因是
=
!=
比严格的
=
!=
运算符更昂贵。这是因为其他主要问题,
=
!=
都执行隐式到字符串转换,如果这两个值的类型相同被比较是不同的

一个简单的例子是

警报({toString:function(){return“1”}==1)

这将产生true——因为对两个值都调用toString,然后将比较字符串结果。在这种情况下,这显然是荒谬的,但在更真实的情况下,这也可能是一个问题。

好吧,我认为您收到的“建议”可能是出于好意,但实际上并不是一个完整的评论

JavaScript是动态类型化的,这意味着变量可以动态更改类型(字符串、数字、布尔值),而无需强制转换。如果您这样做,解析器不会抱怨

var int = 3;    // Is typeof Number
int = 'haha!';  // is typeof String
但是,这并不是说JavaScript完全不考虑类型。相等和不相等运算符(=和!=)比较计算值,忽略类型

严格相等和严格不等运算符(==和!==)确实关心类型。因此,它们将在确定返回值之前比较值和类型

在这里阅读更多

==和!==运算符。

使用 ==和!==运算符。这些==和!=运算符执行类型强制。在 特别是,不要使用==进行比较 反对虚假的价值观


有关这方面的更多信息,请参阅Totty的答案,或者阅读,其中更详细地介绍了真实性、错误性和JavaScript类型强制的概念。

!=
的语义几乎总是你的意思。当你比较一个原语与另一个原语时,你想检查它们是否具有相同的值。当在比较一个对象和另一个对象时,需要检查它们是否引用了完全相同的对象


编辑:删除了有关比较“假”值的错误信息。我只想说,
=
运算符无法区分
null
未定义的
,或
中的
0
[0]
来自
0
。是的,我对最后一个问题是认真的。

就我个人而言,除了其他人所说的非常有效的理由之外,我只想知道我所比较的正是我想要的。对我来说,以下两者之间的区别很重要,即使它们都评估为
!myVar

false === myVar
'undefined' === typeof myVar

这是一个常见的误解。变量不会“改变类型”。在动态语言中,类型是值的属性,而不是变量的属性。值的每个类型都是固定的,变量没有任何好的区别,Javier。谢谢你的澄清!性能是你最不担心的。更令人担心的是非类型检查版本的“假阳性”。
false === myVar
'undefined' === typeof myVar