【发布时间】: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