【问题标题】:JavaScript: detect if argument is array instead of object (Node.JS)JavaScript:检测参数是否是数组而不是对象(Node.JS)
【发布时间】:2011-08-21 22:51:48
【问题描述】:

我应该如何检测参数是否为数组,因为typeof [] 返回'object',我想区分数组和对象。

对象可能看起来像{"0":"string","1":"string","length":"2"},但如果它实际上是一个看起来像数组的对象,我不希望它以数组的形式出现。

JSON.parseJSON.stringify 能够做出这种区分。我该怎么做?

我正在使用与 Chrome 相同的基于 V8 的 Node.JS。

【问题讨论】:

    标签: javascript arrays object node.js typeof


    【解决方案1】:
    • Array.isArray

    原生 V8 功能。它很快,它总是正确的。这是 ES5 的一部分。

    • arr instanceof Array

    检查对象是否由数组构造函数创建。

    下划线的方法。这是从他们的源代码中提取的一个 sn-p

    var toString = Object.prototype.toString,
        nativeIsArray = Array.isArray;
    _.isArray = nativeIsArray || function(obj) {
        return toString.call(obj) === '[object Array]';
    };
    

    此方法接受一个对象并在其上调用Object.prototype.toString 方法。对于数组,这将始终返回 [object Array]

    根据我的个人经验,我发现询问 toString 方法是最有效的,但它不如 instanceof Array 短或可读性也不如 Array.isArray 快,但这是 ES5 代码,我倾向于避免使用它为了便携。

    我个人建议您尝试使用underscore,这是一个包含常用实用方法的库。它有很多有用的函数可以让你的代码变干。

    【讨论】:

    • 使用 node.js util 库 - require('util').isArray(arr) nodejs.org/api/util.html#util_util_isarray_object
    • 温馨提示,我们在 node v4.00 及以上版本中不需要 require('util').isArray(arr) 。已弃用
    • 不知何故,在 Node 10.x 中,arr instanceof Array 似乎失败了。但是Array.isArray() 效果很好。
    【解决方案2】:

    怎么样:

    your_object instanceof Array
    

    在 Chrome 的 V8 中,我得到了

    [] instanceof Array
    > true
    ({}) instanceof Array
    > false 
    ({"0":"string","1":"string","length":"2"}) instanceof Array
    > false
    

    【讨论】:

      【解决方案3】:

      试试这个代码:

      Array.isArray(argument)
      

      【讨论】:

        【解决方案4】:

        我看起来这个问题有几个很好的答案,但为了完整起见,我会添加另一个选项,之前没有建议过。

        为了检查某物是否为数组,您可以使用 Node.js util 原生模块及其 isArray() 函数。

        示例:

        var util = require('util');
        
        util.isArray([]);  // true
        util.isArray(new Array); // true
        util.isArray({"0":"string","1":"string","length":"2"}); // false
        

        使用这种方法,您不必担心 V8 实现的 JS 标准,因为它总是会显示正确的答案。

        【讨论】:

        【解决方案5】:

        试试这个方法:
        console.log(Object.prototype.toString.call(arg).replace(/^[object (.+)]$/, '$1').toLowerCase())

        【讨论】:

        • 它可能会起作用,但是对于那段代码实际在做什么,它非常难以理解并且绝对神秘。我建议坚持使用更清晰的内容,例如 Array.isArray(variable),以确保几年后谁会阅读代码。
        猜你喜欢
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        • 2019-07-01
        • 1970-01-01
        • 2023-03-09
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多