JavaScript 檢測型別
阿新 • • 發佈:2020-07-19
檢測原始值
若檢測一個值是字串、數字、布林值或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)//instanceof 運算子用於檢測建構函式的 prototype 屬性是否出現在某個例項物件的原型鏈上。 instanceof不僅能檢測構造這個物件的構造器,還能檢測原型鏈;預設情況下,每個物件都繼承Object,因此每個物件的 value instanceof Object都會返回true,如:檢測日期 if (value instanceof Data) { console.log(value.getTime()) } // 檢測正則表示式 if (value instanceof RegExp) { }
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