【问题标题】:Why does console.log() show an array, but typeof returns 'object'? [duplicate]为什么 console.log() 显示一个数组,但 typeof 返回 'object'? [复制]
【发布时间】:2016-04-06 16:40:10
【问题描述】:

这与 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"

标签: javascript node.js mongodb mongoose


【解决方案1】:

javascript 的一个奇怪行为是 typeof [] 是一个对象。尽管有一些方法可以检查对象是否为非数组。

其中一个是:

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

【讨论】:

  • 我不会认为它“奇怪”,但有时肯定会令人讨厌。您也可以使用Array.isArray。但不确定浏览器是否支持该功能。
  • 在数组实例是在另一个上下文中构造的情况下,它确实有效except。当 iframe 中的代码调用父窗口中的代码时,就会发生这种情况。每个窗口都有自己的全局 Array 构造函数,它们之间并不相等。
  • @Jamen hehe,这可能是我的英语不太好的原因。 :)
  • 谢谢大家的指点。那么 Mongoose 返回 Mongo 认为数组作为对象的东西有什么特别的原因吗?这似乎有点违反直觉。
  • @user1381745 JavaScript 中的所有数组都是对象(从技术上讲,它只是糖衣语法)。
【解决方案2】:

@jamen 但它不像一个数组,因为我无法访问长度属性,也无法通过campaign.advertGroups[0](未定义)或类似方法访问元素。从本质上讲,这就是我遇到的真正问题。

它看起来像一个奇怪的数组。我不确定到底是什么问题,但您可以尝试调用 .slice 将其转换为真实数组:

var bar = Array.prototype.slice.call(foo);

【讨论】:

    【解决方案3】:

    已解决:这是我的 Mongoose 架构的一个问题,特别是将本应是数组的内容定义为具有嵌套对象的对象。 Javascript 对数组的技术性实际上是糖衣对象,这使问题变得混乱,导致 console.log 和 typeof 呈现看似矛盾的信息;感谢您为这块拼图提供评论!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-22
      • 2012-10-11
      • 2017-09-06
      • 2021-11-27
      相关资源
      最近更新 更多