2

经过测试,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

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

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

4

3 回答 3

11

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

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

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

正确的。JavaScript 中的数组是对象(而不是真正的数组)。

如果你想测试一个对象是一个普通的旧对象,你可以这样做:

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

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

ps 我正在制作一个允许用户向其传递配置选项的模块,并且我想测试以确保该参数只是一个对象文字。

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

于 2012-05-24T16:35:18.077 回答
2
function isPlainObject(o) {
     return Object(o) === o && Object.getPrototypeOf(o) === Object.prototype;
}

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

于 2012-05-24T16:35:24.360 回答
1

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

var isObject = options instanceof Object;
var isArray = options instanceof Array;
if(isObject && !isArray)
{
    alert('yes');
}
于 2012-05-24T16:34:54.107 回答