如何在Javascript中检查对象?

如何在Javascript中检查对象?,javascript,object,typeof,Javascript,Object,Typeof,真实世界的使用情况 typeof非常有用,但它的通用性不如所需。例如,typeof([]),是'object',以及typeof(newdate()),typeof(/abc/),等等 为了在检查类型时更加具体,生产级代码中使用的typeof包装器如下所示(前提是obj存在): 功能类型(obj,showFullClass){ //获取obj的toPrototypeString()(处理所有类型) if(对象的showFullClass和Type==“对象”){ 返回Object.prototy

真实世界的使用情况

typeof非常有用,但它的通用性不如所需。例如,
typeof([])
,是
'object'
,以及
typeof(newdate())
typeof(/abc/)
,等等

为了在检查类型时更加具体,生产级代码中使用的
typeof
包装器如下所示(前提是
obj
存在):

功能类型(obj,showFullClass){
//获取obj的toPrototypeString()(处理所有类型)
if(对象的showFullClass和Type==“对象”){
返回Object.prototype.toString.call(obj);
}
if(obj==null){return(obj+“”).toLowerCase();}//隐式toString()转换
var deepType=Object.prototype.toString.call(obj.slice(8,-1).toLowerCase();
if(deepType=='generatorfunction'){return'function'}
//防止过度指定(例如,[object HtmlLevel]等)。

//计算functionish Regexp(Android每当我们调用对象上的
toString
时,它返回
“[对象类型]”
,其中
type
是对象类型。因此
type(obj,showFullClass)
的目标是从“toString”输出字符串中提取
类型

1.函数声明中的'showFullClass'参数是什么

showFullClass是一种布尔类型。因此,如果在其中传递true,它将只返回
toString
的输出,而不进行任何处理。 例如。
类型(new Date(),true)
将返回
[对象日期]

  • 什么
    var deepType=Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
    do
  • 它提取
    “[对象类型]”
    字符串的
    类型
    子字符串,然后将其转换为小写。从字符串的第8个索引开始,直到字符串的第二个索引。-1表示字符串提取应在字符串的最后一个索引(-1)之前结束。 例如,如果
    obj
    是日期对象
    deepType
    值将是
    'date'

  • 什么
    返回deepType.match(/^(数组| bigint |日期|错误|函数|生成器| regexp |符号)$/)?deepType:(对象类型=='object'|对象类型=='function')?'object':对象类型;
    do
  • 它检查
    deepType
    是否与“array”或“bigint”或“date”或“error”或“function”或“generator”或“regexp”或“symbol”匹配,然后返回
    deepType

    否则,如果obj的
    类型
    'object'
    'function'
    返回
    'object'


    否则,对于字符串、数字等基本类型,将返回其类型。

    看起来像是
    showFullClass
    应该是一个布尔值。它在逻辑表达式中只使用一次。如果有示例说明如何在输出中使用它,那就好了。您可以使用
    obj.constructor.name
    我不确定代码有多有用。JS有基本类型,对象只是基本类型之一。唯一需要特殊处理的类型是
    null
    ,因为
    typeof
    将其类型返回为“object”。如果要检查对象的“type”或“class”,只需使用
    deepType
    (如代码中定义的)即可(无下框),认为从ES6开始就有可能实现价值。谢谢大家-所有的输入都非常有用谢谢你们花时间解释@Ankit
    function type(obj, showFullClass) {
    
        // get toPrototypeString() of obj (handles all types)
        if (showFullClass && typeof obj === "object") {
            return Object.prototype.toString.call(obj);
        }
        if (obj == null) { return (obj + '').toLowerCase(); } // implicit toString() conversion
    
        var deepType = Object.prototype.toString.call(obj).slice(8,-1).toLowerCase();
        if (deepType === 'generatorfunction') { return 'function' }
    
        // Prevent overspecificity (for example, [object HTMLDivElement], etc).
        // Account for functionish Regexp (Android <=2.3), functionish <object> element (Chrome <=57, Firefox <=52), etc.
        // String.prototype.match is universally supported.
    
        return deepType.match(/^(array|bigint|date|error|function|generator|regexp|symbol)$/) ? deepType :
           (typeof obj === 'object' || typeof obj === 'function') ? 'object' : typeof obj;
    
     }