为什么console.log()显示一个数组,但typeof返回'object'?

5
这与mongoose find()操作的结果有关。以下代码: console.log('apparently this is an ' + typeof campaign.advertGroups, campaign.advertGroups); 会输出以下内容: apparently this is an object [ { adverts: [ [Object], [Object], [Object] ] } ] 尽管campaign.advertGroups是Mongo集合中的数组,但它不像一个数组(即长度属性未定义等等)。
有人可以解释一下吗?感觉很愚蠢,可能我漏掉了非常明显的东西。

typeof 对于非可调用的非原始值总是返回 "object" - Bergi
3个回答

5

JavaScript 的一个奇怪行为是 typeof [] 返回的是一个对象。虽然有办法判断该对象是否为数组。

其中一种方法是:

if(Array === someobj.constructor)
{
  console.log('Its an array');
}

1
我不认为这是“奇怪”的,但有时确实很烦人。您也可以使用Array.isArray。不过,我不确定浏览器对其的支持情况。 - user3117575
1
这在大多数情况下都是有效的,除了数组实例是在另一个上下文中构造的情况。当 iframe 中的代码调用父窗口中的代码时会发生这种情况。每个窗口都有自己的全局 Array 构造函数,它们彼此不相等。 - Pointy
@Jamen 嘿嘿,可能是因为我的英语不太好的原因。 :) - void
谢谢大家的指点。那么,Mongoose将Mongo认为是数组的东西返回为对象,有什么特别的原因吗?这似乎相当不直观。 - user1381745
1
@user1381745 在JavaScript中,所有的数组都是对象(从技术上讲,它只是语法上的糖衣)。 - user3117575
显示剩余2条评论

1
解决方案:这是我的Mongoose模式的问题,具体来说,应该将数组定义为带有嵌套对象的对象。Javascript中关于数组实际上是糖衣对象的技术细节使问题变得混乱,导致console.log和typeof呈现看似相互冲突的信息;感谢评论者提供了这个难题的一部分!

0
@jamen 但这个对象不像一个数组,我无法访问它的长度属性或通过 campaign.advertGroups[0] (undefined) 等方式访问它的元素。这实际上是我遇到的真正问题。
看起来像一个奇怪的数组,我不确定问题的具体原因,你可以尝试调用 .slice 方法将其转换为真正的数组:
var bar = Array.prototype.slice.call(foo);

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