如何检测变量是否为纯javascript对象

如何检测变量是否为纯javascript对象,javascript,object,typeof,Javascript,Object,Typeof,我有一个需要传递对象的函数。我使用typeof运算符在处理之前进行检查。但是看看,许多javascript实例,比如array或regex,似乎都是作为对象类型的 我需要我的参数是纯对象(比如:{key:value,…}) 我可以用什么方法检查变量是否为纯对象,而不必对每个对象实例运行特定的测试,比如Array.isArray()?要获得预期的结果,请使用下面的“查找构造函数名”选项来检查变量是否为纯javascript对象 根据MDN 所有对象(使用创建的对象除外) create(null))

我有一个需要传递对象的函数。我使用
typeof
运算符在处理之前进行检查。但是看看,许多javascript实例,比如array或regex,似乎都是作为对象类型的

我需要我的参数是纯对象(比如:
{key:value,…}


我可以用什么方法检查变量是否为纯对象,而不必对每个对象实例运行特定的测试,比如
Array.isArray()

要获得预期的结果,请使用下面的“查找构造函数名”选项来检查变量是否为纯javascript对象

根据MDN

所有对象(使用创建的对象除外) create(null))将具有构造函数属性。创建的对象 没有显式使用构造函数(即对象 和数组文本)将具有指向 该对象的基本对象构造函数类型

有关构造函数属性的更多详细信息,请参阅此链接-

varx={a:1,b:2};
变量y=[1,2,3];
console.log(x.constructor.name==“Object”)//x.constructor.name是Object

console.log(y.constructor.name==“Object”)//y.constructor.name是数组
您可以检查原型:

函数isPureObject(输入){
返回null!==输入&&
输入的类型===“对象”&&
getPrototypeOf(输入).isPrototypeOf(对象);
}
log(isPureObject({}));
log(isPureObject(newobject());
log(isPureObject(未定义));
log(isPureObject(null));
console.log(isPureObject(1));
log(isPureObject('a'));
log(isPureObject(false));
log(isPureObject([]);
log(isPureObject(新数组());
log(isPureObject(()=>{}));

log(isPureObject(函数(){}))由于“普通”或“纯”的定义,普通对象的检测有点问题。我使用以下方法来检测普通对象。我从不使用节点列表的
x instanceof
类型验证,因为它们不适用于跨帧情况。(每个窗口或框架都有自己的实例)

我认为这是检测普通物体最简单、最有效的方法

函数isPlainObject(o){
var c=Object.prototype.toString.call(o)='[Object-Object]'
&&o.constructor&&o.constructor.name==“对象”;
返回c==true;
}
函数myTestFunction(){
/* ... */
}
类myTestClass{
/* ... */
}
log(isPlainObject({“a”:1,“b”:2}))//真的
log(isPlainObject({}))//真的
log(isPlainObject(null))//假的
log(isPlainObject(“我的字符串”)//假的
console.log(isPlainObject(“”)//假的
日志(isPlainObject([1,2,3])//假的
log(isPlainObject(document.queryselectoral(“*”))//假的
log(isPlainObject(新的RegExp(/[a-z]+/))//假的
log(isPlainObject(myTestFunction))//假的
log(isPlainObject(新的myTestFunction())//假的
log(isPlainObject(myTestClass))//假的
log(isPlainObject(新的myTestClass())//false
最短版本

constIsobj=o=>o?.constructor==Object;

在这里可以找到:

看看是什么组成了一个普通对象。“我需要我的论点是一个纯粹的对象”-为什么?你的函数应该不需要在意。知道即使是任何类的实例对象也不会匹配,对你来说,
Boolean(obj)和&obj.constructor==Object
足够好吗?那么
Object.getPrototypeOf(variable)==Object.prototype
@Bergi False呢!如果您需要区分普通javascript对象和HtmleElement、SVGElement、日期对象、节点对象等对象,该怎么办。。。“你的功能不需要关心”是一个非常主观的陈述,考虑到你的合同可能会规定,“如果参数是一个普通对象,做X,否则做Y”@Michael是的,我认为一个好的API契约不应该是这样的,用对象的简单程度来区分事物是个坏主意。你有实际的用例吗?如果要查找
HTMLElement
(等),可以使用
instanceof
。“普通对象”就是
else
的情况。我发现@falinksy非常有用,可以帮助递归遍历对象属性。我得到的结果是:
function myFunction(){/*…*/}
测试它
isPureObject(myFunction)
并将返回
true
返回c==true?真:假
可以简化为只返回c==true@flinsky在许多浏览器上进行的一些测试中,我注意到当测试null和未定义的值时,它有时返回undefined或null而不是false。所以我添加了它以确保它只返回true或false。是
返回c==true
是一种更好的方法。我编辑了它。谢谢。另外,使用此条件
typeof o===“object”
在您的实现环境中有点多余(只要您依赖
.toString
实现),请参阅@fallinsky中的更多内容,以提高评估效率。第一次求值后,非对象值将立即返回false。以下检查范围更广。请记住,通常情况下,过早优化不是默认情况下应该努力的。除非(理想情况下)明确地对或多或少已知或预期的数据集进行实际度量(或者至少知道数据的性质或限制),否则您不知道什么会真正更有效。例如,考虑为一组1000000个数组执行这个函数,或者只是代码> null < /代码> -这个<代码>类型O==''对象< /代码>将导致1000000个不必要的检查。