一、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/n/132176.html