在测试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。我正在创建一个允许用户访问其配置选项的模块,我想测试参数是否只是对象文字?
答案 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} }。