JavaScript比较中应该使用哪种等于运算符(== vs ===)?

5647

我使用JSLint检查JavaScript代码,它建议将比较语句中的==(两个等号)替换为===(三个等号),例如在if语句中比较idSele_UNVEHtype.value.length == 0

使用===代替==是否有性能优势?

任何性能提升都是受欢迎的,因为存在许多比较运算符。

如果不涉及类型转换,是否会比使用==更快?

48个回答

34

===运算符检查变量的值和类型是否相等。

==运算符仅检查变量的值是否相等。


34

这是一个严格的检查测试。

尤其是在0和false以及null之间进行检查时,这是一件好事。

例如,如果你有:

$a = 0;

然后:

$a==0; 
$a==NULL;
$a==false;

所有值都为true可能不是你想要的结果。假设你有一个函数,可以返回数组的第0个索引或在失败时返回false。如果你使用"=="与false进行比较,你可能会得到混淆的结果。

所以,采用与上述相同的内容,但采用严格检测:

$a = 0;

$a===0; // returns true
$a===NULL; // returns false
$a===false; // returns false

3
在JavaScript中,这是完全错误和不完整的:“0!= null”。-1 - Ry-

33

JSLint有时给出不切实际的理由来修改代码。如果类型已经相同,则使用===与使用==的性能完全相同。

只有在类型不同的情况下,===才更快,此时它不会尝试转换类型,而是直接返回false。

因此,我的看法是,JSLint可能用于编写新代码,但应避免无谓的过度优化。

也就是说,在像if (a == 'test')这样的检查中,如果你确信a只能是一个字符串,那么没有理由将==改为===

以这种方式修改大量的代码会浪费开发人员和审核人员的时间,却不会取得任何成果。


有趣的是,在Firefox中,a.length===4a.length==4实际上更慢。无论如何,这都是微观优化,但这与人们所声称的相反。 - aross

29

一个简单的例子是

2 == '2'  -> true, values are SAME because of type conversion.

2 === '2'  -> false, values are NOT SAME because of no type conversion.

26

前两个答案都提到 == 表示相等,而 === 表示恒等。不幸的是,这种说法是不正确的。

如果 == 的两个操作数都是对象,则它们将被比较以查看它们是否为同一个对象。如果两个操作数指向同一个对象,则相等运算符返回 true。否则,它们不相等。

var a = [1, 2, 3];  
var b = [1, 2, 3];  
console.log(a == b)  // false  
console.log(a === b) // false  

在上述代码中,== 和 === 都得到了false,因为a和b不是同一个对象。

也就是说:如果==的两个操作数都是对象,==的行为与===相同,这也意味着身份。这两个运算符的基本区别在于类型转换。==在检查相等性之前进行转换,但===则不会。


23

23

问题在于,由于JavaScript有很多隐式转换,你可能很容易陷入麻烦...

var x = 0;
var isTrue = x == null;
var isFalse = x === null;

很快这就成为了一个问题。最好的例子是在MFC / C++中,隐式转换会将CString转换为指针typedef类型HANDLE,这段代码实际上可以编译...

CString x;
delete x;

很明显,在运行时会进行非常未定义的操作...

搜索C ++中的隐式转换和STL,了解一些反对它的论点...


4
"0 == null" 的结果是假。 - Garrett

22

等值比较:

== 操作符

当两个操作数相等时返回 true。在进行比较之前,将操作数转换为相同的类型。

>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true

平等和类型比较:

=== 运算符

如果两个操作数相等并且类型相同,则返回 true。通常使用这种方式进行比较更好、更安全,因为没有任何幕后的类型转换。

>>> 1 === '1'
false
>>> 1 === 1
true

21

这里提供了一张实用的比较表格,展示了=====之间的转换和区别。

正如结论所述:

“除非你完全理解两个等号所发生的转换,请使用三个等号。”

http://dorey.github.io/JavaScript-Equality-Table/


21

null和undefined都代表着空值,也就是说,它们没有值。

var a;
var b = null;

这里的ab没有值。而0、false和''都是值。它们共同之处是它们都是假值,这意味着它们都满足假条件。

因此,0、false和''在一起形成了一个子组。另一方面,null和undefined形成了第二个子组。请查看下面图像中的比较。null和undefined将相等。其他三个将互相相等。但是,在JavaScript中,它们都被视为假条件。

Enter image description here

这与任何对象(例如{},数组等)、非空字符串和布尔值true都是真条件相同。但是,它们都不相等。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接