JavaScript之隱式類型轉換

布爾操做符(!、&&、||)

當使用 條件判斷語句(if...else) 以及 布爾操做符(!、&&、||) 時,會調用Boolean()進行隱式類型轉換編碼

  • 轉換爲false的有:0, null, undefined, NaN, '', false
  • 其他都爲true([], {}爲true)
![];  //  !Boolean([]);   ------------>    false     
!2;   // false

!null; //  !Boolean(null);   ------------>  true
!undefined;  // true
!0;  // true

if([]) consolo.log('true');   //  if(Boolean([])) ... ----------->  true  

 

乘/除法操做符(*、/)

  • 如有一個操做數爲NaN,則結果爲NaN
  • 若其中一個操做數不爲數字,則調用Number()將其轉換爲數值
2 * '5';   // 10
2 * '5a';  // 2 * Number('5a')  -------->  2 * NaN  ------------>   NaN

 

加法操做符(+)

  • 如有一個操做數爲NaN,結果爲NaN
  • 如有一個操做數爲字符串,則將另外一個數轉換爲字符串而後拼接
  • 如有一個操做數爲對象,則調用對象的toString方法再執行上一步
// num: 數值操做數   str: 字符串  obj: 對象
num + 非字符串操做數(NaN/undefined/null/false/true) = num + Number(非字符串操做數)
num + str = 'numstr';        // 1 + 2 + '3' = '33'

str + NaN = 'strNaN';        //  '1' + NaN = '1NaN'
str + null = 'strnull';      // '1' + null = '1null'
str + true = 'strture';

obj + num = obj.toString() + num;  // Math + 123 = '[object Math]123'
obj + str = obj.toString() + str;  // Math + '123' = '[object Math]123'

 

減法操做符(-)

  • 若一個操做數爲字符串、null、undefined、布爾值,就調用Number()將其轉換爲數值再運算
  • 若一個操做數爲對象則調用該對象valueOf(),沒有valueOf()則調用toString()
1 - '2' = -1;
1 - '123a' = NaN; // 1 - Numer('123a')
1 - Math = NaN;   // 1 - Math.valueOf()
1 - true = 0;

 

關係操做符(>、<、>=、<=)

  • 與NaN比較都會返回false
  • 若兩個操做數都爲字符串,則比較字符串的編碼值
  • 如有一個操做數爲數值,則對另外一個操做數用Number()轉換
  • 如有一個操做數爲對象,則調用該對象valueOf(),沒有valueOf()則調用toString()
4 > '2';  // true
4 > '2a'; // false
4 > Math; // false
4 > true; // true

'ab' > 'a' // true

 

相等操做符(==、!=)

  • 字符串、布爾類型和數值比較,現將前者用Number()轉換爲數值
  • 若一個操做數是對象另外一個不是,則調用該對象valueOf(),沒有valueOf()則調用toString()
  • 若兩個操做數都是對象,則比較它們是否是同一個對象(地址是否相同)
  • null和undefined是相等的
  • null和undefined不會轉換成任何值
  • 任何數都不等於NaN,包括NaN本身
// true
123 == '123';
1 == true;
'123' == new String(123);
123 == new String(123);
null == undefined;

// false
null == 0;
2 == true;
new String(123) == new String(123); 

 

全等操做符(===、!==)

全等操做符不會轉換操做數spa

123 ===  '123';  // false
null === undefined; // false

 

總結

你能說說下面結果是什麼以及緣由嗎?code

[] == 0;  // 1.??
{} == 0;  // 2.??
0 == {};  // 3.??
[] == {};  // 4.??
  1. true
  2. true
  3. error: Uncaught SyntaxError: Unexpected token ==
  4. false

根據相等操做符的規定,當一個操做數爲對象另外一個不是時,會調用對象的valueOf()對象

[] == 0;  --------->  [].valueOf()  ----->  ''  -----> Number('')  ----> 0

當兩個操做數都爲對象則會比較它們是否指向同一塊區域,而[]和{}是兩個獨立的對象,因此爲false。blog

相關文章
相關標籤/搜索