如何检查参数是否是JavaScript中的对象(而不是数组)

时间:2012-05-24 16:31:06

标签: javascript arguments argument-passing

在测试instasnceof之后,我发现如果参数是数组或对象文字,它将返回true。

function test(options){
  if(options instanceof Object){alert('yes')}//this will alert for both arrays and object literals
}
test({x:11})// alerts
test([11])// alerts as well but I do not want it to

有没有办法测试参数“options”是否是对象文字?

P.S。我正在创建一个允许用户访问其配置选项的模块,我想测试参数是否只是对象文字

3 个答案:

答案 0 :(得分:10)

  

有没有办法测试参数“options”是否是对象文字?

不,因为没有意义。您可以测试它是否是对象,但它是如何创建的(通过调用函数的文字,通过其他地方的文字,通过new Object,通过反序列化JSON字符串,。 ..)不是维护的信息。

  

在测试instasnceof之后我发现如果参数是数组或对象文字,它将返回true

正确。 JavaScript中的数组是对象(和not really arrays)。

如果要测试对象是普通旧对象,可以执行以下操作:

if (Object.prototype.toString.call(options) === "[object Object]") {
    // It's a plain object
}

但实际上没有理由这样做。这不是你的问题。只要他们传递的内容具有您期望的属性,就不要试图进一步限制对象。

  

P.S。我正在创建一个模块,允许用户传递配置选项,我想测试以确保参数只是一个对象文字。

为什么呢?如果用户想要使用尚未被声明为文字的对象,那么,你为什么要关心?如果他们想要使用他们通过不同的构造函数创建的对象(例如,而不仅仅是普通对象),那么,为什么还要关心?

答案 1 :(得分:1)

如果你试图禁止数组,你可以这样做:

var isObject = options instanceof Object;
var isArray = options instanceof Array;
if(isObject && !isArray)
{
    alert('yes');
}

答案 2 :(得分:1)

function isPlainObject(o) {
     return Object(o) === o && Object.getPrototypeOf(o) === Object.prototype;
}

但是,您无法测试,o被声明为文字或以其他方式实例化 - 您可以只测试它是否是普通对象而没有任何构造函数而不是{{1} }。