zoukankan      html  css  js  c++  java
  • JavaScript中如何判断数组类型

    前言

    JavaScript中关于数组的判定问题,一直都是一个必须要掌握的点,那么,运用知识,如何判断一个类型是数组,就需要有对JavaScript使用有着深入的了解。

    判断方法

    一、Array.isArray

    ES5新增的数组方法,Array.isArray应该是我们最先想到的判定方式,现在应用的也比较广泛。

    const arr = [1,2,3,4]
    Array.isArray(arr)    // true
    

      

    如果是在支持ES5的浏览器中,用这样的方式自然没什么问题,但是如果是在IE9以下版本,这个方法并未受到支持,这时候我们就要用别的方式来判断数组。

    二、instanceof

    一般来说,instanceof关键字,是用来判断某个元素是否某对象构造函数实例。在数组判断上,instanceof关键字也可以进行数组的判定。

    const arr = [1, 2, 3, 4]
    arr instanceof Array   // true
    

      

    instanceof支持的浏览器版本比较多,所以一般来说,用instanceof判断,会比Array.isArray判定的范围要广泛。

    三、toString

    对象的toString方式也可以判定数组类型,一般来说这种方式的判定是各大库的一种Array.isArray的代替实现。

    例如,polyfill中,就是如此实现:

    if (!Array.isArray) {
      Array.isArray = function(arg) {
        return Object.prototype.toString.call(arg) === '[object Array]';
      };
    }
    
    const arr = [1, 2, 3, 4]
    Object.prototype.toString.call(arr) === '[Object Array]'   // true
    

      

    四、constructor

    除了以上的方式之外,我们还可以通过构造函数来判定:

    const arr = [1, 2, 3, 4]
    arr.constructor === Array  // true
    arr.__proto__.constructor === Array //true
    

      

    弊端

    instanceof和constructor的判定也存在一些弊端,他们判定的数组必须定义在同一个页面,否则将会判定为false。

    如果在iframe中的数组判定,就会出错。

    var iframe = document.createElement('iframe');
    document.body.appendChild(iframe);
    xArray = window.frames[window.frames.length-1].Array;
    var arr = new xArray(1,2,3); // [1,2,3]
    
    // Correctly checking for Array
    Array.isArray(arr);  // true
    // Considered harmful, because doesn't work through iframes
    arr instanceof Array; // false
    arr.constructor === Array; // false
    

      

    总结

    由上述几个方法判定,可以得出,其实polyfill的判定是最合理的,也最具有兼容性的一种判定。

    利用toString判定,胜出。

    我的博客:http://www.gaoyunjiao.fun/?p=165

  • 相关阅读:
    Python中webbrowser的用法
    python爬虫笔记
    PHP yii2.0框架利用mpdf导出pdf
    PyQt5中QTableWidget设置列宽大小的几种方式
    看linux正在运行的服务用哪个命令?
    查看SELinux状态
    查看SMB服务器用户
    centOS7 下安装smb服务器
    (samba启动失败)smb.service: main process exited, code=exited, status=1/FAILURE
    Linux 操作日志
  • 原文地址:https://www.cnblogs.com/qixingduanyan/p/11725557.html
Copyright © 2011-2022 走看看