【问题标题】:How to check for an object in Javascript?如何在 Javascript 中检查对象?
【发布时间】:2021-08-15 08:34:47
【问题描述】:

实际使用情况

typeof 非常有用,但它并不像可能需要的那样通用。比如typeof([])'object',还有typeof(new Date())typeof(/abc/)等。

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

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;

 }

我有上面的代码 sn-p - 从 MDN webdocs 引用 - 在回答所述问题时最有用。URL:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof 。我必须承认,尽管要完全理解代码是很困难的——例如,函数声明中的“showFullClass”参数是什么,以下几行是做什么的? var deepType = Object.prototype.toString.call(obj).slice(8,-1).toLowerCase(); return deepType.match(/^(array|bigint|date|error|function|generator|regexp|symbol)$/) ? deepType :(typeof obj === 'object' || typeof obj === 'function') ? 'object' : typeof obj;

我们将不胜感激任何代码理解方面的帮助或帮助!

【问题讨论】:

  • 似乎showFullClass 应该是一个布尔值。它仅在逻辑表达式中使用一次。如果有示例说明如何将其与他们的输出一起使用,那就太好了。
  • 你可以使用obj.constructor.name
  • 我不确定这段代码有多大用处。 JS 有原始类型,对象只是原始类型之一。唯一需要特殊处理的类型是null,因为typeof 将其类型返回为“对象”。如果你想检查一个对象的“类型”或“类”,deepType(正如它在代码中定义的那样)单独工作(没有小写),认为可以从 ES6 分叉值.
  • 非常感谢大家 - 您的所有意见都非常有帮助

标签: javascript object typeof


【解决方案1】:

每当我们在对象上调用toString 时,它都会返回"[object type]",其中type 是对象类型。所以type(obj, showFullClass)的目标是从'toString'输出字符串中提取type

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

showFullClass 是一个布尔类型。所以如果传入 true ,它只会返回toString 的输出而不做任何处理。 例如。 type(new Date(),true) 将返回 [object Date]

  1. var deepType = Object.prototype.toString.call(obj).slice(8,-1).toLowerCase(); 做什么?

它提取"[object type]"字符串的type子字符串,然后将其转换为小写。从字符串的 第 8 个索引 开始,直到字符串的 倒数第二个索引。 -1 表示字符串提取应该在字符串的最后一个索引(-1)之前结束。 例如。如果obj 是日期对象deepType 值将是'date'

  1. return deepType.match(/^(array|bigint|date|error|function|generator|regexp|symbol)$/) ? deepType :(typeof obj === 'object' || typeof obj === 'function') ? 'object' : typeof obj; 做什么?

它检查deepType 是否匹配“array”或“bigint”或“date”或“error”或“function”或“generator”或“regexp”或“symbol”然后它返回deepType

否则,如果typeof obj'object''function',则返回'object'

否则对于字符串、数字等原始类型返回其类型。

【讨论】:

  • 感谢您花时间解释@Ankit
猜你喜欢
  • 2020-11-12
  • 2011-07-18
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2016-04-10
  • 2016-12-29
相关资源
最近更新 更多