如何检测"不同的对象类型"在JavaScript? (阵列vs Json vs Date等......)

时间:2018-05-01 15:06:36

标签: javascript

为了在递归迭代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对象,因此我利用具有resetTime函数的ISODate对象来区分它们,如下所示:

if (typeof(val) === "object" && val.resetTime === undefined) { //do stuff...

但必须有更清洁,更好的方法来检测对象是什么类型的对象,val.isArray()有点......

怎么做?

PS:"不同的对象类型"是在引号中,因为JS中只有一个对象类型,对吗?

2 个答案:

答案 0 :(得分:6)

如果他们是班级,例如Date,您可以像instanceof这样使用:

(new Date() instanceof Date)

评估为true

只要您不使用iframe,就可以将相同的内容应用于数组:

([] instanceof Array)

但是你必须为不属于类的类型找到你自己的方式

如果您不必坚持使用纯JavaScript,您可以切换到Typescript,您也可以在其中描述类型。

答案 1 :(得分: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型。请尝试告诉我们!