1. 程式人生 > 實用技巧 >JavaScript 檢測型別

JavaScript 檢測型別

檢測原始值

若檢測一個值是字串、數字、布林值或undefined,選擇使用typeof運算子

  • 對於字串,typeof返回"string"
  • 對於數字,typeof返回"number"
  • 對於布林值,typeof返回"boolean"
  • 對於undefind,typeof返回"undefind"

typeof 基本語法

typeof '123123'

注意:"typeof null"返回的是"object"

檢測引用值

若檢測一個值是引用型別,選擇使用instanceof運算子;如:Object、Array、Date和Error

instanceof 基本語法

value instanceof Object (返回結果true或false)
//
檢測日期 if (value instanceof Data) { console.log(value.getTime()) } // 檢測正則表示式 if (value instanceof RegExp) { }

instanceof 運算子用於檢測建構函式的 prototype 屬性是否出現在某個例項物件的原型鏈上。 instanceof不僅能檢測構造這個物件的構造器,還能檢測原型鏈;預設情況下,每個物件都繼承Object,因此每個物件的 value instanceof Object都會返回true,如:
let now = new Date()
console.log(now instanceof Object); // true
console.log(now instanceof Date); // true

// instanceof運算子也可以檢測自定義的型別
function Person(name) {
      this.name = name
}
let me = new Person('Jack')
console.log(now instanceof Person); // true
在瀏覽器中,我們的指令碼可能需要在多個視窗之間進行互動。多個視窗意味著多個全域性環境,不同的全域性環境擁有不同的全域性物件,從而擁有不同的內建型別建構函式。這可能會引發一些問題。 假設一個frame或window (frameA)裡的一個物件被傳入到另一個frame或window (frameB)中。這兩個裡面都定義了建構函式Person。如果來自frameA的物件 是frameA的Person的例項,則:
frameA instanceof frameAPerson // true 
frameA instanceof frameBPerson // false
會出現這種情況是因為每個幀(frame)都擁有Person的一份拷貝,它被認為是改幀(frame)中的Person的拷貝的例項。 這個問題不僅出現在自定義型別身上,函式和陣列 也有這個問題,不過對於這兩個型別一般用不著使用instanceof.

檢測函式

檢測函式最好的方法是使用typeof

function fn() {}
console.log(typeof fn === 'function') // true

檢測陣列

檢測陣列可以使用ECMASript5中的Array.isArray()

function isArray(value) {
     if (typeof Array.isArray === 'function') {
         return Array.isArray(value)
     } else {
         return Object.prototype.toString.call(value) === "[object Array]"
     }
}

檢測屬性

判斷屬性是否存在使用in運算子,in運算子僅僅會簡單的判斷屬性是否存在,而不會去讀取屬性的值;如果例項物件的屬性存在、或者繼承自物件的原型,in運算子 都會返回true,如:

let obj = {
      id: 10,
     name: 'abc'
}
if ('name' in obj) {
      console.log(obj.name)
}

如果只想檢查例項物件的某個屬性是否存在,則使用hasOwnProperty()方法。所有繼承自Object的JavaScript物件都有這個方法,如果例項中存在 這個屬性則返回true(如果這個屬性只存在於原型裡,則返回false),如:

let object = {
     id: 10,
     name: 'abc'
}
if (object.hasOwnProperty('name')) {
     console.log(object.name)
}

參考:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/instanceof