js中等性操作符(==)、關系操作符(<,>)和布爾操作符(!)比較規則


  最近一直在筆試面試,經常碰到例如 123=='123''abc'==true等問題,其中有答對的,也有答錯的,主要原因還是對ECMAScript的規范沒有理解清楚,很多題目沒有具體分析所導致。現查閱資料后對此進行一些總結。

等性操作符(==)

1、比較的類型是String、Number、Boolean這幾個基本類型時

當是這幾中類型進行比較時,會先將兩邊轉換成數字,在進行比較。

1 console.log(1 == true); // true轉換成數字為1,因此結果為true
2 
3 console.log('123' == 123); //true
4 
5 console.log('abc' == true); //'abc'轉換成數字為NaN,結果為false,ECMAScript規定,NaN與任何值比較都是false,包括NaN==NaN
6 

2、上述基本類型與引用類型比較時

首先會調用對象的valueOf()方法,期待返回一個基本類型的值(測試為若返回Boolean、Number、String、null、undefined或沒有返回值,則將不會繼續調用toString方法),若返回的仍然是一個復合對象的話,則調用其toString()方法,若仍然沒有返回上述基本類型的話,則直接判為不相等。

1 var obj = {};
2 console.log(obj == '1') //obj.valueOf()返回這個對象,因此接着調用obj.toString()返回'[object Object]'字符串,按基本類型的比較方式,都轉換成數字,發現不相等,因此結果是false
3 //重寫obj的toString方法
4 obj.toString() = function(){
5     return 1;
6 }
7 console.log(obj == '1'); //結果就為true了
8 console.log(obj == true); //結果也為true
 1 var obj = {
 2     valueOf : function(){
 3         console.log('first');
 4     },
 5     toString : function(){
 6         console.log('second');
 7     }
 8 }
 9 console.log(obj == 1); //結果為 first false
10 
11 var obj = {
12     valueOf : function(){
13         console.log('first');
14         return null; //或者return undefined
15     },
16     toString : function(){
17         console.log('second');
18     }
19 }
20 console.log(obj == 1); //結果為 first false
21 
22 var obj = {
23     valueOf : function(){
24         console.log('first');
25         return {}; //或者return其他復合對象
26     },
27     toString : function(){
28         console.log('second');
29     }
30 }
31 console.log(obj == 1); //結果為 first second false

 

對於undefined和null,ECMAScript規定null==undefined結果為true;在比較等性之前,不能將null和undefined轉換成其他值。

1 console.log(null == undefined); //true
2 console.log(null == 0); //false
3 console.log(0 == undefined); //false

3、兩個對象比較

若兩個操作數指向同一個對象,則返回true,否則返回false。

關系操作符(<,>)

1、兩邊都是字符串

都是字符串時,按字符串對應的字符編碼比較

1 console.log('abc'<'adc') //true

2、有一個操作數是數值

若有一個操作數是數值,則將另一個轉換為數值進行比較

1 console.log('a' > 5); //‘a'轉換為數值為NaN,結果為false
2 console.log('2.3' > 1); // true

3、有一個操作數是對象

調用該對象的valueOf方法,用返回的結果用前面的規則比較,若沒有valueOf方法,則調用toString方法

 1 var obj = {};
 2 console.log(obj < 5); //false
 3 var obj = {
 4     valueOf: function() {
 5         console.log('first');
 6         return 2;
 7     },
 8     toString: function() {
 9         console.log('second');
10     }
11 }
12 console.log(obj < 5); //first true

4、有一個操作數是布爾值

將此布爾值轉換成數值,再進行比較

1 console.log('3' > true); //true

與NaN比較的都將返回false

布爾操作符(!)

1、操作數是對象

任何對象都返回false

1 var obj = {};
2 console.log(!obj); //false

2、操作數是字符串

空字符串返回true,非空返回false

1 var a = 'OK';
2 var b = '  ';
3 var c = '';
4 console.log(!a); //false
5 console.log(!b); //false
6 console.log(!c); //true

3、操作數是數值

0返回true,非0(包括Infinity)返回false

4、操作數是null,undefined,NaN

返回true

1 console.log(!null); //true
2 console.log(!NaN); //true
3 console.log(!undefined); //true

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM