最近一直在筆試面試,經常碰到例如 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