如何在JavaScript中检测“不同的对象类型”?(数组 vs Json vs 日期等...)

3
为了在递归遍历JSON对象时创建条件,我正在尝试找到一种清晰的方法来区分不同的对象类型。
考虑以下内容:
var aJSON     = {"foo" : 1, "bar" : 2};
var anArray   = [1,2,3,4,5];
var aDate     = new Date('2013-03-10T02:00:00Z');
var anISODate = user.timesTheyLoggedIn[0] // comes from MongoDB

console.log(typeof aJSON);     // object
console.log(typeof anArray);   // object
console.log(typeof aDate);     // object
console.log(typeof anISODate); // object

所有类型的对象都是没有更多信息的“对象”。
目前,我的使用情况仅需要检测ISODate对象,因此我利用ISODate对象具有resetTime函数来区分它们与其他对象,如下所示:
if (typeof(val) === "object" && val.resetTime === undefined) { //do stuff...

但是必须有一种更干净、更好的方法来检测对象是什么类型,类似于 val.isArray() 的东西……

你会怎么做呢?

PS:“不同的对象类型”用引号括起来,因为在JS中实际上只有一种对象类型,对吧?


5
“JSON对象”并不存在。 “aJSON”是一个对象,而不是一个JSON格式的字符串。 - phuzi
2个回答

6
如果它们是一个类,比如Date,你可以像这样使用instanceof
(new Date() instanceof Date)

这将评估为true

只要不使用iframes,就可以将相同的方法应用于数组:

([] instanceof Array)

但是对于那些不是类的类型,你需要找到自己的方法

如果你不必坚持使用普通的JavaScript,你可以转向Typescript,其中也可以描述类型。


3
您可以使用obj.constructor.name

var tst = 1 > 0;
var num = 3.141592;
var obj = {a:1};
var arr = [1,2];
var dat = new Date();
var xhr = new XMLHttpRequest();

console.log(tst.constructor.name);
console.log(num.constructor.name);
console.log(obj.constructor.name);
console.log(arr.constructor.name);
console.log(dat.constructor.name);
console.log(xhr.constructor.name);

我不确定这是否适用于例如Mongo类型。请尝试并告诉我们!


刚刚尝试了一下来自MongoDB的ISODate,它给了我一个Date。已经足够好了! - Félix Paradis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接