【问题标题】:How to determine if parameter is an Array or an Object in JavaScript?JavaScript中如何判断参数是数组还是对象?
【发布时间】:2013-05-27 11:01:04
【问题描述】:

我有一个这样的原型;

LocalDataEngine.prototype.ExecuteNonQuery = function (query) { }

我在下面两个不同的参数中调用这个原型;

使用对象数组;

var createQueries = new Array();
createQueries.push(new SQLiteQuery(""));
createQueries.push(new SQLiteQuery(""));
createQueries.push(new SQLiteQuery(""));

new LocalDataEngine().ExecuteNonQuery(createQueries);

仅使用对象;

new LocalDataEngine().ExecuteNonQuery(new SQLiteQuery(""));

我的问题是,如何确定原型中的query 参数是对象数组还是对象?

【问题讨论】:

  • + 这对我来说是个糟糕的设计。只需创建两个函数executeOneQueryexecuteManyQueries
  • 你是对的,但我不想改变现有的设计。
  • 关于设计,为什么不让ExecuteNonQuery 可变参数,即接受多个参数,每个参数都是一个查询。然后总是遍历所有参数。

标签: javascript


【解决方案1】:

你可以使用instanceof:

% js
> [] instanceof Array
true
> {} instanceof Array
false

如果您不使用框架,它将完美运行(无论如何这可能是个坏主意)。如果您使用框架和 ECMAScript 5,请使用 Array.isArray

> Array.isArray({})
false
> Array.isArray([])
true

有关其他解决方案,请参阅 thg435 链接的重复问题。

【讨论】:

  • 我听不懂你的语法
  • 这在多帧 DOM 环境中可能会失败。使用Object.prototype.toString 更安全,请看这里:perfectionkills.com/…
  • @MehmetInce:请参阅 this 以了解文字数组语法的说明。如您所见,有理由喜欢它。
  • 帧数 = 坏。 iFrames = 仍然很常见(f.ex 视频嵌入)。
【解决方案2】:

像这样:

if (query instanceof Array) {
    return 'array';
} else if (query instanceof Object) {
    return 'object';
} else {
    return 'scalar';
}

【讨论】:

    【解决方案3】:
    if( Object.prototype.toString.call( yourObj) === '[object Array]' ) {
        alert( 'Array!' );
    }
    

    【讨论】:

    • +1。这也是 jQuery 在后台使用的 $.isArray()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多