instanceofarray详解

一、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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
VOKQ的头像VOKQ
上一篇 2024-10-03 23:50
下一篇 2024-10-03 23:50

相关推荐

发表回复

登录后才能评论