一、instanceofarray的定義
instanceof是 JavaScript 運算符,用於檢查某個對象是否屬於某個特定的類。 而instanceofarray則可以用於判斷某個變量是否為數組類型。
let arr = [1, 2]
console.log(arr instanceof Array) // true
上述代碼中,我們可以使用instanceofarray來判斷arr是否為一個數組。
二、instanceofarray的內部實現原理
instanceofarray的內部實現原理與instanceof是相同的。在 Javascript 引擎中,所有的對象都是由 Object 構造函數生成。而Array、Function、Date等原生數據類型,都是繼承自 Object 的原型鏈上的對象。因此,我們可以利用 instanceof 運算符,判斷某個對象是否屬於某個特定的類。
實際上,instanceof 的檢查機制是沿着原型鏈往上找,如果鏈上某個原型與右邊的操作數(也就是要檢查的類型)相等,那麼返回 true。如果一直找到 Object.prototype ,還是沒找到相等的原型,就返回 false。這就是 instanceof 的內部實現。
let arr = [1, 2]
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true
在這個例子中,我們也可以發現arr同樣屬於Object類型。因為數組繼承自Object,因此,arr同樣也是Object類型的實例。
三、instanceofarray的注意事項
1. 引用類型必須是Object類型
因為內部實現原理中存在繼承關係,所以判斷引用類型是否為數組時,被比較的對象的類型必須是Object類型。如果被比較的對象為null或undefined,那麼instanceofarray將返回false。
console.log(null instanceof Array) // false
console.log(undefined instanceof Array) // false
2. 類型檢查只能用於同一window或同一iframe之間
instanceofarray的類型檢查只有在同一window或iframe之間才有效。如果檢查跨iframe或跨窗口,則instanceofarray始終返回false。
下面這個例子中,我們創建了兩個iframe標籤,分別將window對象傳遞給變量win和ifm中,並在它們之間使用instanceofarray進行檢查。
let win = window
let ifm = document.createElement('iframe')
document.body.appendChild(ifm)
ifm.onload = function () {
var childWin = ifm.contentWindow
console.log(childWin instanceof window) // false
console.log(childWin instanceof Window) // false
}
ifm.src = 'about:blank'
在上述代碼中,我們發現嵌入的iframe window實例和父級窗口的window實例並不相等。
3. instanceofarray只能檢測數組所在的window實例是否相等
除了在同一window或同一iframe之間的類型檢測有效,instanceofarray只能檢測數組所在的window實例是否相等。
let ifm = document.createElement('iframe')
document.body.appendChild(ifm)
ifm.onload = function () {
let win = ifm.contentWindow
let arr = win.eval('new Array(1, 2, 3)')
console.log(arr instanceof Array) // true
}
ifm.src = 'about:blank'
在上述代碼中,我們創建了一個iframe,在這個iframe裏面創建了一個數組對象。雖然這個數組並不位於父級窗口的window實例中,但是在iframe窗口的實例中卻是一個數組。因此,instanceofarray的類型檢測依然有效。
原創文章,作者:VOKQ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/132176.html
微信掃一掃
支付寶掃一掃