在JavaScript 中存在着三种等号运算符,分别为:= ;== ;=== 。一个等号的是赋值运算符, 两个等号的是相等运算符,三个等号的是严格相等运算符。后两者是今天讨论的主角,因为JavaScript 提供了两种相等运算符,那么我们在进行比较运算时,应该优先使用哪种相等运算符呢?为什么优先使用?为了解答这个问题,对于这两个运算符,我们要有一个大概的了解。
相等运算符(==)
运算结果为布尔值(true 或者 false),相等时返回 true
,不相等时返回 false
。但使用这个比较运算符时要注意当两者类型不同时也有可能会返回true。
假设比较x 和 y ( x == y ):
- 当x 和 y 的数据类型相同时
- 如果x 和 y 都是基本数据类型(字符串、数值、undefined、null、boolean),当字面上的值相同,就返回true,否则返回 false。(比较的是值)
- NaN 与任何值比较都返回 false ,包括它自己。
- 如果 x 和 y 都是复合数据类型,当 x 和 y 都是引用同一个对象,就返回true,否则返回 false。(比较的是地址)
- 当x 和 y 的数据类型不同时
- 如果 x 为 null, y 为 undefined,就返回 true,比较结束。
- 如果 x 为 undefined,y 为 null,返回 true,比较结束。
- x 或 y 其中一个为 null 或 undefined,而另外一个是null 和undefined 之外的类型,就返回 false,比较结束。
- 如果 x 为 Number 类型,y 为 String 类型,就先用Number() 函数将 y 转换为数值,再进行类型相同比较。
- 如果 x 为 String 类型,y 为 Number 类型,就先用Number() 函数将 x 转换为数值,再进行类型相同比较。
- x 或 y 其中一个为Boolean 类型,就先用Number() 函数将 Boolean 转换为数值,然后进行后续比较。
- x 或 y 其中一个为Object 类型,就先调用 Object 的valueOf() 方法,如果返回的是基本数据类型 ,那么就回到前面几种情况的比较,否则调用Object 的toString() 方法,如果返回的是基本数据类型,那么就回到前面几种情况的比较,否则比较结束,结果为 false。
例子:
var obj1 = {valueOf: function(){return 1}};
var obj2 = {valueOf: function(){return 1}};
1 == obj1 //true
obj1 == obj2 // false
var obj3 = {valueOf: function(){return null}};
0 == null // false
null == obj3 // false
null == undefined //true
undefined == null //true
var obj4 = {name: 'michael'};
0 == obj4 //false
'' == obj4 //false
var obj5 ={valueOf: function(){return undefined}};
undefined == obj5 //false
0 == undefined //false
0 == '' //true
123 == '123' //true
'0' == false //true
严格相等运算符
严格相等运算符的比较过程就比较简单了,比较过程内部不会发生类型转换。
如果比较的双方类型不同就直接返回 false,比较结束。
如果比较的双反类型相同,则:
- 如果x 和 y 都是基本数据类型(字符串、数值、undefined、null、boolean),当字面上的值相同,就返回true,否则返回 false。(除了NaN)
- NaN 与任何值比较都返回 false ,包括它自己。
- 如果 x 和 y 都是复合数据类型,当 x 和 y 都是引用同一个对象,就返回true,否则返回 false。
例子:
0 === false //false
null === undefined //false
0 === '' //false
NaN === NaN //false
[0] === 0 //false
总结
个人认为在JavaScript 中用 ==
或 ===
进行比较运算各有利弊,使用 ==
进行比较会使比较原则更宽松,减少了类型转换的麻烦,但是有时会产生混乱,不知道过程发生了什么。而===
比较会更严格,因为内部不会发生类型转换,我们可以进行准确的预测,避免不必要的麻烦,所以个人推荐在JavaScript 中使用===
进行相等比较。
网友评论