js隨手記-1

1.數據類型

1.1 基本數據類型

  • undefined
  • null
  • number
  • boolean
  • string

1.2 引用類型

  • object

Function,Arrayd其實也是object,部分文章會把Function也歸爲基本數據類型。ES6裏添加了symbol,是基本數據類型javascript

1.3 typeof操做符

typeof操做符返回一個字符串,表示未經計算的操做數的類型java

| 對應表 |git

圖片原文連接
上面是一些容易混淆的,順便解釋下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來實現繼承(雖然看起來略顯醜陋)github

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插件,在此就不贅述。bash

原文連接(github.com/sparkxxxxxx…)babel

相關文章
相關標籤/搜索