-
5 变量就是变量。 它可能指的是一个对象。 此外,你可能想定义“对象”——正如答案和评论所示,有各种相互冲突的定义(例如,是否 无效的 是一个对象)。 – 用户395760 评论 2011年12月14日20:46 -
9 OP,IMO你应该接受@Daan的答案,因为这是最好的解决方案,并且应该列在其他答案的前面,所以它是第一个看到的。 (没有冒犯其他也有好答案的人。) – 蒂芬 评论 2015年11月17日21:11 -
三 我个人认为,这实际上取决于你(寻找这个问题答案的人)对一个对象的看法,以及你为什么要检查它。如果你试图区分数组,这个问题会给出不同的答案(即 是 对象)来自 其他 对象或试图将标量值与“向量”分离。 以及是否为null(即 是 对象(根据类型)或函数(即 是 对象)是否应该被排除,这实际上取决于你为什么要检查它。这就是为什么有这么多答案,而且大多数答案在上下文中都是正确的。 – 弗朗西斯科MM 评论 2017年2月8日11:52 -
1 如果你能从确切的 你 意思是“是一个物体”。 (或者,明确地说,你要寻找的答案之一是确定“是一个物体”的各种流行含义,然后区分它们。)没有这一点,每个人都在相互回避。 – 唐·哈奇 评论 2019年12月26日13:43 -
1 @tiffon如何在 stackoverflow.com/a/52478680/1096194 。我写这篇文章的时候,看到了许多投票率最高的答案中冗长的细节,我不知所措。 我相信它值得更多的关注。 – 一半WebDev 评论 2020年6月8日10:40
57个答案
typeof x===“对象”&&! 数组.isArray(x)&&x!== 无效的
-
81 -
5 -
12 -
17 @Tresdin最好的办法是跑步 Object.prototype.toString.call(yourVar) ,正在 你的Var 你需要检查什么。 在阵列的情况下, Object.prototype.toString.call([1,2]) 收益 [对象数组] 评论 2016年2月25日9:48 -
27
yourVariable的类型===“对象”&&yourVaiable!== 无效的
-
149 -
三 -
21 数组也将作为“对象”返回,如下所示: someArray对象实例//true 或 typeof someArray===“对象”//true 。关于: Object.prototype.toString.call(someObject)===“[对象对象]” ,或 “[对象数组]” 如果你想检测阵列? – 康·安东尼亚科斯 评论 2015年6月19日14:52 -
9 -
10
基元,基元值
不是对象且没有任何方法的数据。 JavaScript有7种基本数据类型:string、number、bigint、boolean、undefined、symbol和null。
三 “abc” 真的 无效的 未定义
对象.原型 一切都是从 对象.原型 函数.原型 对象 功能 函数C(){} --用户定义函数
C.原型 --用户定义函数的原型属性:这是 不 C类 s原型 新C() --“新建”-使用用户定义的函数
数学 阵列原型 阵列
{“a”:1,“b”:2} --使用文字符号创建的对象 新编号(3) --基本体周围的包装 ... 还有很多其他事情 ...
Object.create(空) 一切都源于 Object.create(null)
//oops:isObject(Object.prototype)->false //oops:isObject(Object.create(null))->false 函数isObject(val){ return val对象实例; }
//oops:isObject(Object)->false 函数isObject(val){ return(类型val===“对象”); }
>Object.prototype.toString.call(3) “[对象编号]” >Object.prototype.toString.call(新编号(3)) “[对象编号]”
函数isObject(val){ if(val===null){return false;} return((类型为val==='函数')||(类型为val==='对象')); }
函数isObject(obj){ return obj===对象(obj); }
Object构造函数为给定值创建对象包装器。 如果值为null或未定义,它将创建并返回一个空对象,否则,它将返回一个与给定值对应的类型的对象。 如果该值已经是一个对象,它将返回该值。
//这5个示例抛出异常 Object.getPrototypeOf(空) Object.getPrototypeOf(未定义) Object.getPrototypeOf(3) Object.getPrototypeOf('abc') Object.getPrototypeOf(true) //这5个示例没有抛出异常 Object.getPrototypeOf(对象) Object.getPrototypeOf(Object.protype) Object.getPrototypeOf(Object.create(null)) Object.getPrototypeOf([]) Object.getPrototypeOf({})
-
48 -
6 -
23 -
1 -
6
_.isObject=函数(obj){ return obj===对象(obj); };
_.isObject=函数(obj){ var类型=对象类型; return type===“函数”||type==='对象'&&!! 对象; };
-
70 在javascript中,数组也是一个对象,因此大多数时候您都希望排除数组: return obj===对象(obj)&&Object.prototype.toString.call(obj,obj)!==' [对象数组]' – 大安 评论 2013年7月12日8:57 -
28 -
92 -
7 -
7
“[对象对象]” 如果myVar是对象 “[对象数组]” 如果myVar是数组 等。
-
19 -
5 @克利斯朵夫没有区分原语和 物体 . Object.prototype.toString.call(3) -> “[对象编号]” . Object.prototype.toString.call(新编号(3)) -> “[对象编号] " – 马特·芬威克 评论 2014年3月18日17:25 -
9 -
三 -
getType=function(obj){return Object.prototype.toString.call(obj).match(/\[对象(\w+)\]/)[1];}; 评论 2014年11月17日22:08
isArray=函数(a){ return(!!a)&&(a.constructor===数组); }; console.log(isArray());// 假 console.log(isArray(null));// 假 console.log(isArray(true));// 假 console.log(isArray(1));// 假 console.log(isArray('str'));// 假 console.log(isArray({}));// 假 console.log(isArray(new Date));// 假 console.log(isArray([]));// 真的
isLiteralObject=函数(a){ return(!!a)&&(a.constructor===对象); }; console.log(isLiteralObject());// 假 console.log(isLiteralObject(null));// 假 console.log(isLiteralObject(true));// 假 console.log(isLiteralObject(1));// 假 console.log(isLiteralObject('str'));// 假 console.log(isLiteralObject([]));// 假 console.log(isLiteralObject(新日期));// 假 console.log(isLiteralObject({}));// 真的
-
4 @祖帕:什么!! a是吗? – 用户1094081 评论 2015年4月23日10:59 -
9 -
三 -
30 出乎意料的是,到目前为止,最好的答案都在下面。 这基本上回答了这个问题——这会在JSON中表示为以 { 字符。 对于阵列情况,只要不需要支持IE<9,就可以使用 数组.isArray() 确定某个东西是否是数组。 它通过了您提供的所有测试用例。 – 基普 评论 2016年3月10日14:56 -
三
函数isObject(item){ return(typeof item===“object”&&!Array.isArray(item)&&item!== 空); }
-
4 -
8 @马赫因为 新日期() 返回一个对象。 数组是从逻辑的角度来看的,而不是一个对象,尽管JavaScript会这样处理和报告它们。 然而,在实践中,看到他们平等是无益的,因为他们并非如此。 对象没有 长度 属性,并且它没有像push()这样的方法。 有时你可能想给一个函数重载参数,在这里你需要区分数组或对象,特别是当其他参数取决于给定的参数时。 – StanE公司 评论 2016年8月5日22:10 -
2 @StanE阵列绝对是对象。 不确定为什么您认为对象不能具有 长度 属性或类似的方法 推 , Object.create(Array.prototype) 是一个具有这些属性的非数组对象的简单反例。 数组的特殊之处在于,它们是带有自定义[[DefineOwnProperty]]基本内部方法的外来对象,但它们仍然是对象。 – 奥里奥尔 评论 2016年8月28日19:50 -
5 @Oriol我既没有写数组不是对象,也没有写对象不能有 长度 属性(我的意思是对象文字没有 长度 属性)。 我写道,数组不是来自 符合逻辑的 观点。 我说的是程序逻辑。 有时有必要检查数组是否是“真实”数组,而绝对不是“真实”对象。 就是这样 数组.isArray() 是的。 假设您有一个接受对象或对象数组的函数。 检查特殊属性或方法是一种肮脏的解决方案。 土生土长的方式总是更好。 – StanE公司 评论 2016年8月29日21:50 -
2
使用函数 阵列.isArray
:
函数isObject(o){ 返回o!== null&&typeof o===“对象”&&Array.isArray(o)===false; }
无功能 阵列.isArray
:
函数isObject(o){ return o对象实例&&o.constructor===对象; }
console.log(isObject({}));// 将返回:true console.log(isObject([]));// 将返回:false console.log(isObject(null));// 将返回:false console.log(isObject(/.*/));// 将返回:false console.log(isObject(函数(){}));// 将返回:false
函数isDate(o){ return o instanceof Object&&o.constructor===日期; }
var d=新日期(); console.log(isObject(d));// 将返回:false console.log(isDate(d));// 将返回:true
函数isObject(o){ return o instanceof Object&&typeof o.constructor===“函数”; }
函数isObject(o,strict=true){ if(o===null||o===未定义){ 返回false; } const instanceOfObject=o对象实例; const typeOfObject=类型o===“对象”; const constructorUndefined=o.constructor===未定义; const constructorObject=o.constructor===对象; const typeOfConstructorObject=o.constructor类型===“函数”; 设r; if(严格===真){ r=(instanceOfObject||typeOfObject)&&(constructorUndefined||constructor对象); }其他{ r=(constructorUndefined||typeOfConstructorObject); } 返回r; };
-
1 -
1 因为这对isObject(myDateObject)返回false,所以这不是问题的答案。 它不知道变量是否是对象,只知道它是否是特定类的对象。 这里的问题是对于任何对象都返回true的泛型函数。 评论 2018年1月13日19:09 -
@Yetanotherjosh这确实是个答案 🤓 你提到了答案中描述的案例,以及要点-你必须使用 isDate(是日期) 为您的DateObject编写健壮的代码,否则您将变得脆弱 is对象 方法。 – cn0047号 评论 2018年1月19日17:03 -
1 @Vladimir Kovpak使用 日期 在我的评论中没有选择,因为是的,答案确实讨论了 日期 .但是 日期 只是无限可能的类之一,这一点适用于任何其他类。 例子: 类Foo(){}; var x=新Foo(); 是对象(x) 收益 假 。我不知道OP的具体用例是什么,但很容易想到必须了解的场景 所有可能的类 和检查 专门针对他们中的每一个人 是不可行的。 评论 2018年1月19日21:09 -
1
短代码和最终代码
函数isObject(obj) { 返回对象!= null&&obj.constructor.name===“对象” } console.log(isObject({}))//返回true console.log(isObject([]))//返回false console.log(isObject(null))//返回false
解释
退货类型
console.log(typeofnull,typeof[],typeof{})
检查他们的施工人员
console.log(({}).constructor)//返回名为“Object”的函数 console.log(([]).constructor)//返回一个名为“Array”的函数 console.log((null).constructor)//抛出错误,因为null实际上没有属性
函数名称简介
console.log(({}).constructor.name)//返回“Object” console.log(([]).constructor.name)//返回“Array” console.log((null).constructor.name)//抛出错误,因为null实际上没有属性
-
7 -
如果您愿意,可以排除这种罕见的情况: 返回对象!= null&&obj.constructor&&obj.construtor.name===“对象” 条件“obj.constructor”返回false,因为Object.create(null)创建的对象没有属性,甚至没有属性__ proto__或.constructor。 – jkdev公司 评论 2021年11月8日15:57 -
三 根据您的回答,我在NodeJS中的最后一个(ES11)助手是: const is对象=(obj)=>(obj??false)?。 构造函数?。 name===“对象”; 谢谢您! – 赛吉奥 评论 2021年12月15日10:53
if(objectName对象实例){ 警报(“物体”); }其他{ alert(“非对象”); }
变量obj={obj1:“obj1”,obj2:“obj 2”};
//这就是如何在角度框架中进行检查 函数isObject(obj){ 返回对象!== null&&typeof obj===“对象”; }
//确保第二个对象大写 函数isObject(obj){ return Object.prototype.toString.call(obj)===“[对象对象]”; }
函数isObject(obj){ return obj.constructor.toString().indexOf(“Object”)>-1; }
函数isObject(obj){ return obj instanceof Object; }
是对象(obj);
//如果是实object,则返回“object”; jQuery.type(obj);
角度.is对象(obj);
//(注意:在Undercore和Lodash中,函数和数组也返回true,但不返回null) _.is对象(obj);
-
您还需要检查它是否不是数组。 所以函数isObject(obj){return obj!==null&&typeof obj===“object”&&!Array.isArray(obj);} – 马特·古 评论 2017年4月3日19:51 -
我同意你的观点,但正如你在注释中看到的,这是如何在angularJ中完成的,我在函数前面的注释中提到过,他们将数组作为一个对象。。。 查看此处了解更多信息: docs.angularjs.org/api/ng/function/angular.is对象 – 阿里雷扎 评论 2017年4月4日0:50
函数isAnyObject(值){ 返回值!= null&&(typeof value===“object”||typeof value===“function”); }
函数isPlainObject(值){ if(Object.prototype.toString.call(value)!==' [object对象]'){ 返回false; }其他{ var prototype=Object.getPrototypeOf(值); return prototype===null||prototype===Object.prototype; } }
变量anyVar={}; typeof anyVar==“object”&&anyVar对象实例&&! (anyVar数组实例)//true
任意变量=[]; typeof anyVar==“object”&&anyVar对象实例&&! (anyVar数组实例)//false
anyVar=空; typeof anyVar==“object”&&anyVar对象实例&&! (数组的anyVar实例);// 假
-
三 -
答案很好@HalfWebDev,但为了满足Jamie Birch所评论的功能,我们可以使用这种类型的anyVar==“object”&&anyVar实例object&&! (anyVar数组实例)&&typeof anyVar!==' 函数' 评论 2021年5月2日15:35 -
1
常量isObj=o=>o?。 constructor===对象; //这是真的 控制台.log(isObj({}));// 反对! //这些错误 console.log(isObj(0));// 数 console.log(isObj([]));// 阵列 console.log(isObj('lo'));// 一串 console.log(isObj(null));// 无效的 console.log(isObj(未定义));// 未定义 控制台.log(isObj(()=>{}));// 功能 console.log(isObj(Object));// 班
-
1 -
三 -
-
-
它会返回 “对象” 对于 无效的 ,属于Null类型。 它会返回 “功能” 对于属于Object类型的可调用对象。 它可以为非标准的不可调用对象返回(几乎)它想要的任何内容。 例如,IE似乎喜欢 “未知” 。唯一禁止的结果是 “功能” 和基元类型。
测试值是否属于Object类型的正确方法的全面列表,但并不详尽。
对象 建造师 这个 对象 构造函数将传递的参数强制为对象。 如果它已经是一个对象,则返回相同的对象。 因此,可以使用它将值强制为对象,并将该对象与原始值进行严格比较。 以下函数需要ECMAScript 3,它引入了 === : 函数isObject(value){/*需要ECMAScript 3或更高版本*/ return Object(value)===value; } 我喜欢这种方法,因为它简单且自我描述,类似的检查也适用于布尔值、数字和字符串。 然而,要知道它依赖于全球 对象 没有被遮蔽或改变。 建造师 实例化构造函数时,它可以返回与刚创建的实例不同的值。 但该值将被忽略,除非它是一个对象。 以下函数需要ECMAScript 3,它允许构造函数返回非对象。 在引发错误的ECMAScript 3之前,但是 尝试 当时还没有声明。 函数isObject(value){/*需要ECMAScript 3或更高版本*/ return new function(){return value;}()===value; } 虽然与前一个示例相比有点简单,但此示例不依赖任何全局属性,因此可能是最安全的。 这 价值 旧的ECMAScript规范要求 这 值作为对象。 引入ECMAScript 3 功能.原型.call ,它允许使用任意 这 值,但强制为对象。 ECMAScript 5引入了一个严格的模式来消除这种行为,但在草率模式下,我们仍然可以(但可以说不应该)依赖它。 function isObject(value){/*在slopy模式下需要ECMAScript 3或更高版本*/ return function(){return this==value;}.call(value); } [[原型]] 所有普通对象都有一个名为[[Prototype]]的内部插槽,其值决定了它从哪个其他对象继承。 该值只能是对象或 无效的 。因此,您可以尝试创建从所需值继承的对象,并检查它是否有效。 两者都有 对象.创建 和 对象.get原型 需要ECMAScript 5。 函数isObject(value){/*需要ECMAScript 5或更高版本*/ 尝试{ Object.create(值); 返回值!== 无效的; }捕获(错误){ 返回false; } } 函数isObject(value){/*需要ECMAScript 5或更高版本*/ 函数构造函数(){} Constructor.protype=值; return Object.getPrototypeOf(new Constructor())===值; } 一些新的ECMAScript 6方式 ECMAScript 6引入了一些新的间接方法来检查值是否为对象。 它们使用前面看到的方法将值传递给一些需要对象的代码,这些对象包装在 尝试 语句捕获错误。 一些隐藏的例子,不值得评论 函数isObject(value){/*需要ECMAScript 6或更高版本*/ 尝试{ Object.setPrototypeOf({},值); 返回值!== 无效的; }捕获(错误){ 返回false; } } 函数isObject(value){/*需要ECMAScript 6或更高版本*/ 尝试{ 新的WeakSet([值]); 返回true; }捕获(错误){ 返回false; } }
-
2 -
1 @zzzzBov好吧,我看了所有的答案,他们不保证总是返回正确的答案,除了我和Daan的。我可以为他们中的大多数给出可重复的反例。 其他人建议检查typeof是否返回“function”或“object”,但正如我解释的那样,规范允许对某些对象使用其他结果。 Matt Fenwick的答案包含与Daan相同的正确答案,但也包含不正确的答案。 – 奥里奥尔 评论 2016年9月2日16:59 -
1 我不同意你的回答“完全正确”的前提,认为其他人“不能确保总是返回正确的答案”并没有以任何方式反驳我的立场。 此外,这个问题并没有提出任何关于什么输入应该产生什么输出的主张。 评论 2016年9月2日17:04 -
2 @zzzzBov该问题询问如何检查某物是否为对象。 ECMAScript定义了对象是什么,所以我使用了这个定义。 我看不出任何其他合理的解释。 在某些情况下,做其他事情的答案(例如排除数组)可能很有用,但它们不会检查某个对象是否为对象。 – 奥里奥尔 评论 2016年9月2日17:28 -
随时可用的检查功能
函数isObject(o){ 返回null!= o和& 类型o===“对象”&& Object.prototype.toString.call(o)===“[对象对象]”; } 函数isDerivedObject(o){ 返回! 是对象(o)&& 空!= o和& (typeof o===“对象”|| typeof o===“函数”)&& /^\[对象/.test(object.prototype.toString.call(o)); } //松散等式运算符(==)专门用于检查 //对于未定义的 //还要注意,即使null也是isDerivedObject中的一个对象 //函数,我们跳过它并总是为null返回false
解释
在Javascript中, 无效的 , 对象 , 阵列 , 日期 和 功能 s都是对象。 虽然, 无效的 有点做作。 因此,最好检查 无效的 首先,检测它不为空。 正在检查 typeof o===“对象” 保证 o(o) 是一个对象。 如果没有这张支票, 对象.原型.to字符串 这是毫无意义的,因为它会为任何事物返回对象,即使是 未定义 和 无效的 ! 例如: toString(未定义) 收益 [对象未定义] ! 之后 typeof o===“对象” check,toString.call(o)是检查 o(o) 是一个对象,类似于 阵列 , 日期 或 功能 . 在 是派生对象 函数,它检查 o(o) 是一个函数。 因为函数也是一个对象,这就是它存在的原因。 如果它没有这样做,函数将返回false。 例子: 是派生对象(函数(){}) 会回来的 假 但现在它又回来了 真的 . 人们总是可以改变对象的定义。 因此,可以相应地更改这些函数。
测验
函数isObject(o){ 返回null!= o&& 类型o===“对象”&& Object.prototype.toString.call(o)===“[对象对象]”; } 函数isDerivedObject(o){ 返回! is对象(o)&& 空!= o和& (typeof o===“对象”|| typeof o===“函数”)&& /^\[对象/.test(object.prototype.toString.call(o)); } //测试 //null是一个对象吗? 控制台.log( '是否为null对象?', isObject(空) ); 控制台.log( “null是派生对象吗?”, isDerivedObject(空) ); //1234是一个对象吗? 控制台.log( '1234是对象吗?', 是对象(1234) ); 控制台日志( '1234是派生对象吗?', 是派生对象(1234) ); //新数字(1234)是对象吗? 控制台.log( '新编号(1234)是对象吗?', isObject(新编号(1234)) ); 控制台.log( '新编号(1234)是派生对象吗?', 是派生对象(1234) ); //函数对象是对象吗? 控制台.log( '(new(function(){}))是对象吗?', isObject((新(函数(){})) ); 控制台.log( '(new(function(){}))是派生对象吗?', isObject((new(function(){})) ); //{}是对象吗? 控制台.log( “{}是对象吗?”, 是对象({}) ); 控制台日志( “{}是派生对象吗?”, 是派生对象({}) ); //数组是对象吗? 控制台.log( '数组是对象吗?', 是对象([]) ) 控制台.log( “Array是派生对象吗?”, 是派生对象([]) ) //Date是对象吗? 控制台.log( '日期是对象吗?', isObject(新日期()) ); 控制台.log( “Date是派生对象吗?”, isDerivedObject(new Date()) ); //函数是一个对象吗? 控制台.log( '函数是对象吗?', isObject(函数(){}) ); 控制台.log( '函数是派生对象吗?', 是派生对象(函数(){}) );
函数isPlainObject(o){ return(o===null||Array.isArray(o)||typeof o=='函数'||o.constructor===日期)? 假 :(类型o==“对象”); }
console.debug(isPlainObject(isPlain Object))// 函数,false console.debug(isPlainObject({'x':6,'y':16}))// 文字对象,true console.debug(isPlainObject(5))// 数字,假 console.debug(isPlainObject(未定义))// 未定义,错误 console.debug(isPlainObject(null))// 空,假 console.debug(isPlainObject('a'))// 字符串,false console.debug(isPlainObject([]))// 数组?, 假 console.debug(isPlainObject(true))// 布尔,假 console.debug(isPlainObject(false))// 布尔,假
函数isObject(n){ return Object.prototype.toString.call(n)===“[对象对象]”; }
const isObject=n=>Object.prototype.toString.call(n)===“[对象对象]”
-
1 -
1 您还可以删除 无效的 检查,因为 Object.prototype.toString.call(null)===“[Object null]” 评论 2019年11月6日0:02
变量a=[1] //“对象”的类型 Object的一个实例//true 数组的一个实例//true 变量b={a:1} b对象实例//true b数组实例//false var c=空 c对象实例//false c数组实例//false
if(myVar instanceof Object&&!(myVar-instanceof Array)){ //对象代码 }
功能类型(val){ 返回val===空?' 空': val===未定义?' “未定义”: Object.prototype.toString.call(val).slice(8,-1); }
R.type({});//=> “对象” R型(1);//=> “数字” R.type(错误);//=> “布尔型” R.type(s’);//=> “字符串” R.type(空);//=> “空” R型([]);//=> “数组” R型(/[A-z]/);//=> “RegExp” R.type(()=>{});//=> “功能” R.type(未定义);//=> “未定义”
性能
结果
在所有情况下,解决方案C和H在所有浏览器上都是快速/最快的 在所有情况下,解决方案D和G在所有浏览器上都是最慢/最慢的
细节
// https://stackoverflow.com/a/14706877/860099 函数A(x){ return x===对象(x); }; // https://stackoverflow.com/a/42250981/860099 函数B(x){ 返回_.isObject(x); } // https://stackoverflow.com/a/34864175/860099 函数C(x){ 返回x!= null&&(typeof x===‘object’||typeof x===‘function’); } // https://stackoverflow.com/a/39187058/860099 函数D(x){ return new function(){return x;}()===x; } // https://stackoverflow.com/a/39187058/860099 函数E(x){ return function(){return this===x;}.call(x); } // https://stackoverflow.com/a/39187058/860099 函数F(x){/*需要ECMAScript 5或更高版本*/ 尝试{ Object.create(x); 返回x!== 无效的; }捕获(错误){ 返回false; } } // https://stackoverflow.com/a/39187058/860099 函数G(x){/*需要ECMAScript 5或更高版本*/ 函数构造函数(){} 构造函数原型=x; return Object.getPrototypeOf(new Constructor())===x; } // https://stackoverflow.com/a/8511332/860099 函数H(x){ 返回类型x===“对象”&&x!== 无效的 } // https://stackoverflow.com/a/25715455/860099 函数I(x){ return(typeof x===“object”&&!Array.isArray(x)&&x!== 空); }; // https://stackoverflow.com/a/22482737/860099 函数J(x){ return x instanceof Object; } // https://stackoverflow.com/a/50712057/860099 函数K(x) { 设t=JSON.stringify(x); 返回t? t[0]===“{”:假; } // https://stackoverflow.com/a/13356338/860099 函数L(x){ return Object.prototype.toString.call(x)===“[对象对象]”; }; // https://stackoverflow.com/a/46663081/860099 函数M(o,strict=true){ if(o===null||o===未定义){ 返回false; } const instanceOfObject=o对象实例; const typeOfObject=类型o===“对象”; const constructorUndefined=o.constructor===未定义; const constructorObject=o.constructor===对象; const typeOfConstructorObject=o.constructor类型===“函数”; 设r; if(严格===真){ r=(instanceOfObject || typeOfObject)&&(constructorUndefined || constructorObject); }其他{ r=(constructorUndefined||typeOfConstructorObject); } 返回r; } // https://stackoverflow.com/a/42250981/860099 函数N(x){ return$.type(x)===“对象”; } // https://stackoverflow.com/a/34864175/860099 函数O(x){ if(Object.prototype.toString.call(x)!==' [对象对象]'){ 返回false; }其他{ var原型=Object.getPrototypeOf(x); return prototype===null||prototype===Object.prototype; } } // https://stackoverflow.com/a/57863169/860099 函数P(x){ while(Object.prototype.toString.call(x)===“[对象对象]”) if((x=Object.getPrototypeOf(x))===null) 返回true 返回false } // https://stackoverflow.com/a/43289971/860099 函数Q(x){ 尝试{ 开关(x.constructor){ 案例编号: case函数: case布尔值: 外壳符号: 案例日期: case字符串: 案例RegExp: return x.constructor===对象; case错误: 案例评估错误: 案例范围错误: 案例引用错误: case语法错误: 案例类型错误: 案例URI错误: return(Object===错误?错误:x.constructor)===对象; case数组: case Int8Array(大小写Int8Array): case Uint8Array: case Uint8ClampedArray: 案例Int16Array: 案例Uint16Array: 案例Int32Array: 案例Uint32Array: 案例Float32Array: 案例Float64Array: return(Object===数组?数组:x.constructor)===对象; case对象: 违约: return(Object===Object?Object:x.constructor)===对象; } }捕获(ex){ return x==对象; } } // https://stackoverflow.com/a/52478680/860099 函数R(x){ return typeof x=='object'&&x instanceof object&&! (x个数组实例); } // https://stackoverflow.com/a/51458052/860099 函数S(x) { 返回x!= null&&x.构造函数?。 name===“对象” } // https://stackoverflow.com/a/42250981/860099 函数T(x){ 返回x?。 构造函数?。 toString().indexOf(“对象”)>-1; } // https://stackoverflow.com/a/43223661/860099 函数U(x) { 返回x?。 constructor===对象; } // https://stackoverflow.com/a/46663081/860099 函数V(x){ return x对象实例&&x.constructor===对象; } // ------------- //测试 // ------------- 控制台日志('列:1 2 3 4 5 6-7 8 9 10 11'); 【A、B、C、D、E、F、G、H、I、J、K、L、M、N、O、P、Q、R、S、T、U、V】 .map(f=>控制台.log(`${f.name}:${1*f(new Date())}${1*.f(/./)}$}1*f内联)}`)) 控制台.log(` 列图例(测试用例): 1:新日期() 2: /./ (注册费用) 3: {} 4:对象原型 5:Object.create(空) 6:()=>{}(函数) 7:“abc”(字符串) 8:3(数字) 9:true(布尔值) 10:空 11:未定义 排: 1=是对象 0=不是对象 理论上,第1-6列应该有1,第7-11列应该有0 `);
<脚本 src=“ https://code.jquery.com/jquery-3.5.1.min.js " 完整性=“sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbj0=” crossource=“anonymous”></script> <脚本 src=“ https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js " 完整性=“sha512-90vH1Z83AJY9DmlWa8WkjkV79yfs2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovwww==” crossource=“anonymous”></script> 这艘船只提供性能测试中使用的功能,它本身不执行测试!
函数isPrimitive(o){返回类型o!=='object'||null}
函数isObject(o){return!isPrimitive(o)}
函数isObject(o){返回对象的o实例} 函数isPrimitic(o){return!isObject(o)}
const isArray=(函数(){ const arrayTypes=对象.create(null); arrayTypes['Array']=true; arrayTypes['Int8Array']=true; arrayTypes['Uint8Array']=true; arrayTypes['Uint8ClampedArray']=true; arrayTypes['Int16Array']=true; arrayTypes['Uint16Array']=true; arrayTypes['Int32Array']=true; arrayTypes['Uint32Array']=true; arrayTypes['BigInt64Array']=true; arrayTypes['BigUint64Array']=true; arrayTypes['Float32Array']=true; arrayTypes['Float64Array']=true; 返回函数(o){ 如果(!o)返回false; 返回! 是原语(o)&&!! arrayTypes[o.constructor.name]; } }());
const isObjectStrict=(函数(){ const nativeTypes=Object.create(null); nativeTypes['Date']=true; nativeTypes['RegExp']=true; nativeTypes['Boolean']=true; nativeTypes['Number']=true; nativeTypes['String']=true; nativeTypes['Function']=true; 返回函数(o){ if(!o)返回false; 返回! 是原语(o)&&! isArray(o)&&! nativeTypes[o.constructor.name]; } }());
只要字符串化版本的 五 是 “[对象对象]” . 我希望函数的结果与下面的日志完全相同,所以这是我最后得出的唯一“对象性”标准。 如果失败,函数将立即返回false。 五 替换为链中的下一个原型 v=Object.getPrototypeOf(v) ,也可以在之后直接评估。 当的新值 五 是 无效的 ,这意味着 每个原型,包括根原型 (很可能是 只有 链内的原型)已经通过while循环中的检查,我们可以返回true。 否则,将开始新的迭代。
函数isObj(v){ while(Object.prototype.toString.call(v)===“[对象对象]”) if((v=Object.getPrototypeOf(v))===空) 返回true 返回false } console.log('FALSE:') 控制台.log('[]->',isObj([])) console.log('null->',isObj(null)) console.log('document->',isObj(document)) console.log('JSON->',isObj(JSON)) console.log('function->',isObj(function(){})) console.log('new Date()->',isObj(new Date[)]) 控制台.log('RegExp->',isObj(/./)) console.log('TRUE:') 控制台.log('{}->',isObj({})) console.log('new Object()->',isObj(new Objects())) console.log('新对象(null)->',isObj(新对象(null))) log('new Object({})->',isObj(新对象({foo:'bar'})) console.log('对象原型->',isObj(对象原型)) console.log(“Object.create(null)->”,isObj(Object.create[null)) console.log(“Object.create({})->”,isObj(Object.created({foo:'bar'})) console.log('deep heritance->',isObj(Object.create(Object.create({foo:'bar'})))
const checkType=o=>对象原型 .to字符串 .call(o) .replace(/\[|对象\s|\]/g,“”) .to下壳体();
功能检查类型(o){ return对象原型 .to字符串 .调用(o) .replace(/\[|object\s|\]/g,'') .to下壳体(); }
checkType([])===“数组”;// 真的 checkType({})===“对象”;// 真的 checkType(1)===“数字”;// 真的 checkType(“”)===“字符串”;// 真的 checkType({}.p)===“未定义”;// 真的 checkType(null)===“null”;// 真的
var isObject=函数(项){ return item.constructor.name===“对象”; };
-
2 -
-
-
-
如果你的变量不能有错误的值 varName&&varName.constructor.name===“对象” 如果您的变量可能有错误的值varName!= null&&varName!= 未定义&&varName.constructor.name===“对象” – 马诺伊·拉纳 评论 2022年3月31日8:09
const isObject=obj=>obj&&obj.constructor&&obj constructor==对象; console.log(isObject({}));// 真的 console.log(isObject([]));// 假 console.log(isObject(新函数));// 假 console.log(isObject(新编号(123));// 假 console.log(isObject(null));// 无效的
-
2
const isObject=函数(obj){ 常量类型=对象类型; return type===“函数”||type==='对象'&&!! 目标; };