js隨手記-1

花間酒發表於2018-11-18

1.資料型別

1.1 基本資料型別

  • undefined
  • null
  • number
  • boolean
  • string

1.2 引用型別

  • object

Function,Arrayd其實也是object,部分文章會把Function也歸為基本資料型別。ES6裡新增了symbol,是基本資料型別

1.3 typeof操作符

typeof操作符返回一個字串,表示未經計算的運算元的型別

| 對應表 |

js隨手記-1
圖片原文連結
上面是一些容易混淆的,順便解釋下typeof null === 'object', 在 JavaScript 最初的實現中,JavaScript 中的值是由一個表示型別的標籤和實際資料值表示的。物件的型別標籤是 0。由於 null 代表的是空指標(大多數平臺下值為 0x00),因此,null的型別標籤也成為了 0,typeof null就錯誤的返回了"object"。將錯就錯,記住就好。

1.3.1 Call方法

typeof好玩的就是什麼時候是object什麼時候是function(此問題面試一問估計會問倒一批人哈哈)。畢竟function本身也是object,如Specification所示,function實現了call方法。仔細一想,call貌似也只能在function中起作用。比如用call來實現繼承(雖然看起來略顯醜陋)

2.操作符

2.1 雙等和三等

雙等不判斷型別,三等判斷型別。這種機制會有一些騷操作。 比如0 == ''為true, [0] == false為true等。
之前有個特別火的問題,if(a==1 & a==2 & a== 3)能否判定為true?。
答:雙等時如果左右型別不同,會呼叫valueOf,如果valueOf還是型別不同再呼叫toString。所以解決上面的問題,重寫物件的valueOf或者toString方法即可。下面兩段程式碼

const a = {
  i: 1,
  valueOf: function () {
    return a.i++; 
  },
  //toString: function () {  重寫valueOf和toString都可以
  //  return a.i++;
  //} 
} 

if(a == 1 && a == 2 && a == 3) {
  console.log('Hello World!');
}
複製程式碼

對於if(a==1 & a==2 & a== 3)為true這個問題,我也有一個另類的實現思路,即通過運算子過載實現。可以通過babel來實現運算子過載,令a的==操作符永遠返回true。有興趣可以搜一下運算子過載的babel外掛,在此就不贅述。

原文連結(github.com/sparkxxxxxx…)

相關文章