JavaScript为啥不用instanceof检测数组

JS 中检测是不是数组的四种方法

1、用instanceof判断

instanceof 运算符可以用来判断某个构造函数的prototype属性所指向的对象是否存在于另外一个要检测对象的原型链上。在使用的时候语法如下:

[] instanceof Array // true

使用instanceof检测数组不是一种可靠的方法:

《JavaScript 权威指南》摘录:

《JavaScript 高级程序设计》原文摘录:

自从 ECMAScript 3 做出规定以后,就出现了确定某个对象是不是数组的经典问题。
对于一个网页,或者一个全局作用域而言,使用 instanceof 操作符就能得到满意
的结果:

    if (value instanceof Array){
      //对数组执行某些操作
    }

  instanceof 操作符的问题在于,它假定只有一个全局执行环境。如果网页中包含
多个框架,那实际上就存在两个以上不同的全局执行环境,从而存在两个以上不同版
本的 Array 构造函数。如果你从一个框架向另一个框架传入一个数组,那么传入的
数组与在第二个框架中原生创建的数组分别具有各自不同的构造函数。

例如

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script>
        window.onload = function () {
            var fwindow = window.framePage.contentWindow // frame 页面的window对象
            var fArray = fwindow.Array  // frame 页面的Array
            var fdata = fwindow.data  // frame 页面的 data [1,2,3]
            console.log(fdata instanceof fArray) // true
            console.log(fdata instanceof Array) // false
        }
    </script>
    <title>Document</title>
</head>
<body>
    <iframe id="framePage" src="frame.html" frameborder="0"></iframe>
</body>
</html>

 frame.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <script>
        window.data = [1,2,3]
    </script>
</head>
<body>
    <p>frame page</p>
</body>
</html>

参考:https://juejin.im/post/58ed74ce8d6d81006c9effce 

2、Array.isArray方法

使用方法:

if (Array.isArray(value)){
  //对数组执行某些操作
}

Array.isArray是可靠准确的方法,是ES5新增的方法,兼容IE9和IE9以上浏览器。IE9以下浏览器是不支持的。

3. Object.prototype.toString.call() 方法

Object.prototype.toString.call()方法是ES3语法,兼容性强,所有浏览器都支持。使用方式:

var value = [1, 2, 3]
console.log(Object.prototype.toString.call(value) === '[object Array]') // true

结合方法2和方法3,判断一个变量是不是数组可以这样写:

var isArray = Function.isArray || function (o) {
  return typeof o === 'object' &&
  Object.prototype.toString.call(o) === '[object Array]';
}

猜你喜欢

转载自blog.csdn.net/weixin_42467709/article/details/105302852