即使有元素,JSON数组零长度?

时间:2015-05-15 08:43:51

标签: javascript arrays json console.log

我从服务器获取JSON响应并创建Javascript对象。结构如下:

var response = {
    key1:[],
    key2:[],
    key3:[],
    key4:[],
    key5:[]
}

请求完成后,response对象成功完成,如下所示:

Object (*expandable):
    key1: Array[0]
    key2: Array[0]
    key3: Array[0]
    key4: Array[20]
    key5: Array[113]

现在稍后,我想将信息存储到数据库中。我已经创建了一个函数,我console.log响应对象,以确保它没问题(这里它变得有趣 - 请参阅注释):

function setupDatabase(){
    console.log(response); // prints the response correctly (see response above)
    console.log(response.key5); //prints key5: Array[0]. If I expand the Array[0] all the elements are inside.
    console.log("key5: "+response.key5.length);//prints 0!!
}

前3个键为0是正常的,因为没有为它们返回任何元素。剩下的2个还可以。为什么我得到这个日志,而我在一行中的同一个对象上运行3 console.log个命令?我错过了什么吗?

1 个答案:

答案 0 :(得分:7)

这是console.log如何在某些浏览器上运行的问题。您可以考虑使用console.log(JSON.stringify(response.key5))来获取时间点视图。

基本上,console.log会记录某些内容的最高级别,但如果您展开其中一项稍后,它会向您显示内容,因为它们在展开时是 ,而不是在您登录时。因此,response.key5在您记录时为空,但在您在控制台中展开之前已将其添加到其中。

这种行为非常松懈。例如,在Chrome上,当console.log发生时,您是否打开或关闭控制台可能很重要。如果你关闭了控制台,它会记录一个你无法扩展的静态内容。

这是一个展示问题的简单示例。

在Chrome中:

  1. 确保控制台已关闭。
  2. 运行此代码段。
  3. 打开控制台。
  4. 您会看到该数组,如果您展开该数组,您会看到在<{strong> console.log行之后添加的条目。

    var a = [];
    console.log(a);
    a.push("Hi there");

    console.log(JSON.stringify(...))对比:

    var a = [];
    console.log(JSON.stringify(a));
    a.push("Hi there");

    console.dir执行与console.log类似的操作,但始终记录“实时”版本,即使控制台已关闭:

    var a = [];
    console.dir(a);
    a.push("Hi there");

    当您关闭控制台后,稍后再打开它,console.dir会显示Array[1]一个扩展箭头,然后会显示该条目。但奇怪的是,如果您有控制台打开,您会看到Array[0] - 但随后展开它会显示条目:

    enter image description here

    这种是有意义的,因为当你记录它时数组是空的,但是当你展开它时你会看到它的内容。