美文网首页
javascript怎么判断一个变量是数组

javascript怎么判断一个变量是数组

作者: SuperSnail | 来源:发表于2016-01-19 11:07 被阅读55次

    之前strong去见了大神回来问我,怎么判断一个变量是数组,至少要用三种方法。

    参见一篇来自前端大全的文章
    参考链接在这里

    isArray()

    照理说这个方法是最简便的方法。

    if(Array.isArray(value)){}
    

    但是这个方法在IE9以下的浏览器并不支持

    typeof()

    数组是特殊的对象,所以数组的typeof结果是object。然而,null的typeof结果也是object。所以要用typeof的话就得写成

    var a = [1,2,3];
    //是object且要排除null和纯对象
    console.log(
    (typeof a === 'object' && a !== null &&               Object.prototype.toString.call(a) !== '[object Object]')); //true
    

    instanceof()

    对于一个网页或者一个全局作用域而言。这个方法是有效的

    if(a instanceof Array){//...}
    

    但是如果这个页面嵌套了frame暂且叫做a.html。
    这个frame里定义了window.a= [1,3,5];

    那么

    window.onload = function(){
        var a = window.frames[0].a;
        console.log(a instanceof Array); //false
        console.log(a.constructor === Array); //false
    }
    

    这是因为每个 frame 都有一套自己的执行环境,跨 frame 实例化的对象彼此不共享原型链。如果打印 a instanceof window.frames[0].Array,那么结果就是 true 了。

    特性嗅探

    var b = [3,4,5];
    if(b.sort){//.....}
    

    这样一旦某个对象正好有值为sort的key的话,就会有问题。
    比如:

    var b = {sort:'aaa'};
    

    这样的话b.sort也是true,所以也不能用。

    最靠谱的方法应该是

    Object.prototype.toString.call(value)
    

    这个方法的原理是:
    每个对象有一个叫做class的内部属性,再配合 call,我们可以取得任何对象的内部属性 [[Class]],然后把类型检测转化为字符串输出。

    相关文章

      网友评论

          本文标题:javascript怎么判断一个变量是数组

          本文链接:https://www.haomeiwen.com/subject/qzmkkttx.html