获取Javascript变量类型的更好方法是什么?

Ail*_*lyn 246 javascript types typeof

有没有更好的方法来获取JS中的变量类型typeof?当你这样做时它工作正常:

> typeof 1
"number"
> typeof "hello"
"string"
Run Code Online (Sandbox Code Playgroud)

但是当你尝试时它没用了:

> typeof [1,2]
"object"
>r = new RegExp(/./)
/./
> typeof r
"function"
Run Code Online (Sandbox Code Playgroud)

我知道instanceof,但这要求你事先知道这种类型.

> [1,2] instanceof Array
true
> r instanceof RegExp
true
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?

ipr*_*101 214

安格斯·克罗尔最近写了一篇有趣的博客文章 -

http://javascriptweblog.wordpress.com/2011/08/08/fixing-the-javascript-typeof-operator/

他详细介绍了各种方法的优点和缺点,然后定义了一种新方法'toType' -

var toType = function(obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
Run Code Online (Sandbox Code Playgroud)

  • 正则表达式还需要包含诸如"Uint8Array"之类的数字.相反,考虑更通用的`match(/\s([^ \]] +)/)`应该处理任何事情. (6认同)
  • 这里有趣的注意事项 - 这可能会破坏"主机"对象传递给函数的位置.例如,Internet Explorer`ActiveObjectObject`实例. (3认同)
  • 我建议使用`\ w`字符运算符代替...... (2认同)

Ale*_*pin 48

你可以尝试使用constructor.name.

[].constructor.name
new RegExp().constructor.name
Run Code Online (Sandbox Code Playgroud)

就像所有的JavaScript一样,有人最终总会指出这是某种邪恶的,所以这里有一个链接到一个很好地涵盖这个问题的答案.

另一种方法是使用 Object.prototype.toString.call

Object.prototype.toString.call([])
Object.prototype.toString.call(/./)
Run Code Online (Sandbox Code Playgroud)

  • 回答投票,因为确认怀疑在javascript中完成的所有事情都是邪恶的. (13认同)
  • `name`是ECMAScript的扩展,不适用于所有浏览器. (10认同)
  • 邪恶:如果你正在缩小你的代码,那么`constructor.name` 可能最终会变成类似 `n` 的东西,而不是你期望的对象名称。所以要注意这一点 - 特别是如果你只在生产中缩小。 (3认同)
  • JavaScript 本身就是邪恶的。而且很傻。这个问题没有好的答案这一事实就是活生生的证据。 (2认同)

小智 38

一个相当不错的类型捕获函数是YUI3使用的函数:

var TYPES = {
    'undefined'        : 'undefined',
    'number'           : 'number',
    'boolean'          : 'boolean',
    'string'           : 'string',
    '[object Function]': 'function',
    '[object RegExp]'  : 'regexp',
    '[object Array]'   : 'array',
    '[object Date]'    : 'date',
    '[object Error]'   : 'error'
},
TOSTRING = Object.prototype.toString;

function type(o) {
    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
};
Run Code Online (Sandbox Code Playgroud)

这捕获了javascript提供的许多基元,但您总是可以通过修改TYPES对象来添加更多基元.请注意,typeof HTMLElementCollection在Safari中将报告function,但类型(HTMLElementCollection)将返回object


Vix*_*Vix 30

您可能会发现以下功能有用:

function typeOf(obj) {
  return {}.toString.call(obj).split(' ')[1].slice(0, -1).toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

或者在ES7中(如果进一步改进则发表评论)

function typeOf(obj) {
  const { toString } = Object.prototype;
  const stringified = obj::toString();
  const type = stringified.split(' ')[1].slice(0, -1);

  return type.toLowerCase();
}
Run Code Online (Sandbox Code Playgroud)

结果:

typeOf(); //undefined
typeOf(null); //null
typeOf(NaN); //number
typeOf(5); //number
typeOf({}); //object
typeOf([]); //array
typeOf(''); //string
typeOf(function () {}); //function
typeOf(/a/) //regexp
typeOf(new Date()) //date
typeOf(new Error) //error
typeOf(Promise.resolve()) //promise
typeOf(function *() {}) //generatorfunction
typeOf(new WeakMap()) //weakmap
typeOf(new Map()) //map
Run Code Online (Sandbox Code Playgroud)

感谢@johnrees通知我:错误,承诺,生成器功能


小智 14

我们也可以从ipr101改变一个小例子

Object.prototype.toType = function() {
  return ({}).toString.call(this).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
Run Code Online (Sandbox Code Playgroud)

并打电话给

"aaa".toType(); // 'string'
Run Code Online (Sandbox Code Playgroud)

  • 记住孩子,操纵JavaScript基础对象会导致兼容性和其他奇怪的问题.尝试在图书馆和大型项目中谨慎使用它! (5认同)

Yuk*_*élé 8

一行功能:

function type(obj) {
    return Object.prototype.toString.call(obj).replace(/^\[object (.+)\]$/,"$1").toLowerCase()
}
Run Code Online (Sandbox Code Playgroud)

这给出了相同的结果 jQuery.type()


And*_*y E 5

您可以应用于Object.prototype.toString任何对象:

var toString = Object.prototype.toString;

console.log(toString.call([]));
//-> [object Array]

console.log(toString.call(/reg/g));
//-> [object RegExp]

console.log(toString.call({}));
//-> [object Object]
Run Code Online (Sandbox Code Playgroud)

这适用于所有浏览器,IE 除外 - 当在从另一个窗口获得的变量上调用它时,它只会吐出[object Object].

  • @pessimopoppotamus 但没有人会将他们的浏览器更新到 IE9 使用 IE。 (4认同)