重學JS: 數據類型及類型檢測

數據類型

JavaScript七種內置類型:web

  • 空值(null)
  • 未定義(undefined)
  • 布爾值(boolean)
  • 數字(number)
  • 字符串(string)
  • 對象(object)
  • 符號(symbol)

除對象以外,其餘統稱爲基本類型數組

類型檢測

typeof

typeof運算符後面跟操做數,typeof operand 或者 typeof (operand),返回一個類型的字符串值。函數

示例:

typeof undefined === "undefined" // true
typeof true === "boolean" // true
typeof 1 === "number" // true
typeof 'test' === "string" // true
typeof {} === "object" // true
typeof Symbol() === "symbol" // true
複製代碼

特殊示例:

typeof null === "object"
typeof function () {} === "function"
typeof [1] === "object"
複製代碼

typeof對null的處理有問題,正確的結果應該是"null",可是實際返回的是"object",這個bug由來已久,也許之後也不會修復。
typeof function() {}返回的是一個"function",彷佛function也是JavaScript的一個內置對象,實際上函數是一個可調用對象,它有一個內部屬性[[Call]],該屬性使其能夠被調用。
typeof [1]返回"object",說明數組也是object類型,實際上它是object的一個子類型,和普通對象經過字符串鍵索引不一樣,數組經過數字按順進行索引。工具

總結表格:

instance

typeof是檢測基本數據類型的最佳工具,可是檢測引用類型的值時做用不大,都會返回"object",這時候就須要instance操做符了。instance運算符用於測試構造函數的protytpe屬性是否出如今對象的原型鏈中的任何位置。
用法:object instanceof constructor,object: 要檢測的對象,constructor某個構造函數測試

示例:

function A() {}
function B() {}
function C() {}
A.prototype = new C()
const a = new A()
console.log(a instanceof A) // a是A類的實例 true
console.log(a instanceof C) // A繼承C true
console.log(a instanceof B) // a不是A類的實例 false
console.log(a instanceof Object) // Object實全部引用類型的父類 true
console.log(A.prototype instanceof Object) // true
A.prototype = {}
a1 = new A()
console.log(a1 instanceof A) // true
console.log(a instanceof A) // false
const date = new Date()
console.log(date instanceof Date) // true
複製代碼

原理

function instance_of(L, R) {//L 表示左表達式,R 表示右表達式
 var O = R.prototype;// 取 R 的顯示原型
 L = L.__proto__;// 取 L 的隱式原型
 while (true) { 
   if (L === null) 
     return false; 
   if (O === L)// 這裏重點:當 O 嚴格等於 L 時,返回 true 
     return true; 
   L = L.__proto__; 
 } 
}
複製代碼

想要對instanceof運算符有更加深刻的瞭解車票ui

toString

toString()方法返回一個表示該對象的字符串,每一個對象都有一個toString()方法,當該對象被表示爲一個文本值時,或者一個對象以預期的字符串方式引用時自動調用。默認狀況下,toString()方法被每一個Object對象繼承。若是此方法在自定義對象中未被覆蓋,toString()返回"[object type]",其中type是對象的類型
spa

示例

const toString = Object.prototype.toString
console.log(toString.call(null)) // [object Null]
console.log(toString.call(undefined)) // [object Undefined]
console.log(toString.call(new String)) // [object String]
console.log(toString.call(Function)) // [object Function]
console.log(toString.call(new Date)) // [object Date]
console.log(toString.call('new Date')) // [object String]
console.log(toString.call(['a'])) // [object Array]
複製代碼

從示例能夠看出,Object.prototype.toString.call()能夠準確表示數值的類型prototype

總結

  • typeof運算符適合檢測基本數據類型,且返回類型的字符串
  • instanceof運算符適合檢測引用類型值
  • toString()返回對象的類型,能夠準確判斷數值的類型
相關文章
相關標籤/搜索