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

JSON array zero length even with elements?

我从服务器收到 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个都OK。为什么我得到这个日志,而我在同一对象上连续 运行 3 console.log 命令?我错过了什么吗?

这是 console.log 在某些浏览器上的工作方式的问题。您可能会考虑使用 console.log(JSON.stringify(response.key5)) 来获取时间点视图。

基本上,console.log 会记录某些内容的顶层内容,但是如果您稍后 展开其中一个内容,它会按原样显示内容 当您展开它时,而不是当您记录它时。所以 response.key5 在您记录它时 是空的 ,但是在您在控制台中展开它之前添加了一些东西。

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

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

在Chrome中:

  1. 确保控制台已关闭。
  2. 运行 这个片段。
  3. 打开控制台。

您会看到该数组,如果展开它,您会看到在 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 的操作,但始终记录 "live" 版本,即使控制台已关闭:

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

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

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