zoukankan      html  css  js  c++  java
  • 【Javascript】Javascript中如何判断变量是数组类型

      在Javascript中,数组与传统的数组类型不同,它是一个特殊的对象,并具有可以通过数字作为下标的访问数据方式,特殊的length,数组相关的方法等特点。这个特性使得JS中的数组使用起来更加灵活,但与此,也带来一些小麻烦,有时我们会把数组当成对象,有时又会将对象当成数组。因此,判断该变量是否是数组变得十分必要。那么如何判断一个变量是数组呢?

      我们首先想到的就是typeof方法,最简单的例子:

    var a=[];
    alert(typeof a);

    上述代码弹出的不是array,而是object!个人感觉这是设计的失败,因为typeof得出的结果没有意义(并不代表它错了,因为数组确实是对象,只是这里我们想知道它是不是数组)。

      既然typeof方法不行,那就换一个方法。我们知道,数组也是对象,在我们创建数组时,它也有一个原型prototype,我们就用这个prototype中最原始的方法来做吧。见如下代码:

    var t=[];
    alert(t.constructor===Array);

    非常好!它如愿以偿返回了true,这个方法在大多数情况屡试不爽,并且可以将数组和对象分辨出来。因此,在大部分的情况下,这个方法是非常可行的办法。

      但是需要说明的是,仅仅是大部分情况下。如果我们的脚本跨域执行,或访问iframe、frame、不同window的变量时,它就会出问题。例如,我们创建一个页面main.html,在body中插入iframe(id为aa),它的src是另外一个页面:inner.html。inner.html的代码如下:

    var ia=[];

    main.html页面的js代码如下:

    window.onload=function(){
        alert(document.getElementById('aa').contentWindow.ia.constructor===Array);
    }

    当main.html页面打开时,会弹出false。原因是因为===运算符造成的,因为inner.html中的ia变量是通过inner页面的window下的Array构造的,而这段代码的Array是main页面中的Array,因此返回了false。针对这种方法我们需要一个适应性更强的方法。下面代码为最终解:

    alert(Object.prototype.toString.apply(document.getElementById('aa').contentWindow.ia)==='[object Array]');

      通过这样的方法,我们就可以得到准确的Array类型了。在多次使用时,我们不妨封装成一个函数:

    function is_array(val){
        return Object.prototype.toString.apply(val)==='[object Array]';
    }
  • 相关阅读:
    spring boot的application配置文件
    C# WinForm 中英文实现, 国际化实现的简单方法
    VS2012 2013 显示查找功能 无法具体定位 解决方法
    C#使用HttpWebRequest 进行请求,提示 基础连接已经关闭: 发送时发生错误。
    VS 默认开发环境如何更改
    C# winfrom HttpWebRequest 请求获取html网页信息和提交信息
    C# 定时器 Timers.Timer Forms.Timer
    HTTP 错误 500.21
    配置iis时,浏览项目提示 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
    asp xml对象转换为string
  • 原文地址:https://www.cnblogs.com/echoloyuk/p/3158936.html
Copyright © 2011-2022 走看看