重學JS: 隱式強制類型轉換

隱式強制類型轉換指的是那些隱藏的強制類型轉換,反作用也不是很明顯,事實上,只要本身以爲不夠明顯的強制類型轉換均可以算做隱式強制類型轉換,接下來,此文將會介紹幾種常見的隱式類型轉換。函數

加法操做符

轉換規則:ui

  • 若是兩個操做數,一個操做數是數字,另外一個數是布爾值,那麼則將布爾值轉換爲數字,而後進行加法操做
  • 若是兩個操做都是字符串,則將第二個操做數與第一個操做數拼接起來
  • 若是隻有一個操做數是字符串,則將另外一個操做數轉換爲字符串,而後再將兩個字符串拼接起來
    • 若是另外一個操做數是數字、或布爾值,則調用它們的toString()方法取得對應的字符串值
    • 若是另外一個操做數對象,對象valueOf()方法返回基本值,則調用valueOf()方法取得返回值,而後再作字符串拼接,不然直接調用toString()方法取得對應的字符串值

舉例:編碼

console.log(1 + true) // 2
console.log('1' + '1') // '11'
console.log(1 + '1') // '11'
console.log('1' + 'true') // '1true'
var a = {
  valueOf: function() {
    return 2
  },
  toString: function() {
    return 1
  }
}
var b = {b: 1}
console.log(a + '1') // '21'
console.log(b + '1') // '[object Object]1'
複製代碼

減法操做符

轉換規則:spa

  • 若是有一個操做數字符串、布爾值、null或者undefined,則先在後臺調用Number()函數將其轉換爲數值,若是轉換的結果是NaN,則減法的結果就是NaN
  • 若是有一個操做數是對象,則調用的valueOf()方法取得表示該對象的數值,若是獲得的結果是NaN,則減法的結果就是NaN。若是對象valueOf()方法返回不是基本值,則調用toString()方法並將獲得的字符串轉爲數字

舉例:code

console.log(5 - '1') // 4
console.log(5 - true) // 4
console.log(5 - null) // 5
console.log(5- undefined) // NaN
const c = {
  valueOf: function() {
    return '1'
  }
}
console.log(5 - c) // 4
複製代碼

隱式強制類型轉爲布爾值

場景:對象

  • if()語句中的條件判斷表達式
  • for()語句中的條件判斷表達式
  • while()和do..while()循環條件中的判斷表達式
  • ?:三元運算中的判斷表達式
  • 邏輯元算符||和&&左邊的操做數

以上的場景中非布爾值會被隱式的強制轉爲布爾值,轉換規則遵循上篇文章的ToBoolean轉換規則
舉例:字符串

const d = 11
const e = null
let f
const g = f ? d : e
console.log(g) // null
console.log(d && e) // null
console.log(d || e) // 11
複製代碼

相等

相等操做符分爲寬鬆相等==和嚴格相等===,這兩個都用來判斷值是否相等,區別在於在判斷兩邊操做數是否相等時,寬鬆相等容許進行強制類型轉換,而嚴格相等不容許進行強制類型轉換,所以下面只會介紹寬鬆相等在比較時的強制類型轉換
轉換規則:string

  • 若是有一個操做數是布爾值,則在比較相等性以前先將其轉換爲數值,false轉爲0true轉爲1
  • 若是一個操做數是字符串,另外一個操做數是數字,在比較以前先將字符串轉換爲數字
  • 若是一個操做數是對象,另外一個操做數不是,則調用對象的valueOf()方法,若不是基本類型值,則調用toString()方法,用獲得的基本類型值按照前面的規則進行比較
  • null和undefined是相等的
  • 要比較相等性以前,不能將null和undefined轉換成其餘任何值
  • 若是有一個操做數是NaN,則相等操做符返回false,而不相等返回true。即便兩個操做數都是NaN,相等操做符也返回false
  • 若是兩個操做數都是對象,則比較它們是否是同一個對象。若是兩個操做數都指向同一個對象,則相等操做符返回true,不然,返回false

舉例:it

console.log(null == undefined) // true
console.log('NaN' == NaN) // false
console.log(5 == NaN) // false
console.log(NaN == NaN) // false
console.log(NaN != NaN) // true
console.log(false == 0) // true
console.log(true == 1) // true
console.log(true == 2) // false
console.log(undefined == 0) // false
console.log(null == 0) // false
console.log('5' == 5) // true
複製代碼

比較操做符

比較操做符包括小於(<)、大於(>)、小於等於(<=)、和大於等於(>=) 轉換規則:io

  • 若是兩個操做數都是字符串,則比較兩個字符串的字符編碼值
  • 若是一個操做數是數值,則將另外一個操做數轉換爲數值,而後進行數值比較
  • 若是一個操做數是對象,則調用這個對象的valueOf()方法,若返回值是基本類型,則用獲得的結果進行比較,不然調用toString()方法,用獲得的值進行比較
  • 若是一個操做數是布爾值,則先將其轉換爲數字,而後進行比較

舉例:

console.log('11' < 3) // false
console.log(true < 2) // true
const h = {
  valueOf: function () {
    return '22'
  }
}
console.log(h > 1) // true
複製代碼

總結

這篇文章對JS中的常見隱式強制類型轉換作了一個小結,但願能對你們理解有所幫助。若是有錯誤或不嚴謹的地方,歡迎批評指正,若是喜歡,歡迎點贊

相關文章
相關標籤/搜索