为什么我有时需要使用JSON.stringify,有时候不需要

时间:2018-04-20 11:52:28

标签: javascript json

有时在我的项目中,当我将值记录到控制台时,我使用JSON.Stringify来读取数据,有时我不需要这样做...我想知道为什么?

在这个例子中:

 this._productServices.getAll().do(data => console.log(data)).subscribe(products=> this.articles= products);

当我看到控制台时,有这样的值:

(4) [{…}, {…}, {…}, {…}]

Acctualy有可读数组值。

但在这种情况下:

  filteredSubProducts: Group[];

 filterSubProductsByIdId(Id) {
    this.filteredSubProducts= this.articles.filter(item => item.parentId == Id);
    console.log("Products array" + this.filteredSubProducts);
  }

我得到的结果为:

Products array[object Object],[object Object]

所以我需要在几秒钟内使用JSON.stringify()来获取我的值[object Object],[object Object]可读...我想知道为什么会这样?有时候我正在使用它,有时候我不是......

由于

5 个答案:

答案 0 :(得分:6)

您收到它是因为您要向字符"Products array"添加字符串filteredSubProducts

所以代码实际上在做

console.log("Products array" + this.filteredSubProducts.toString());

toString()方法导致[object Object]。

解决方法是不连接,但在console.log语句中使用逗号

console.log("Products array", this.filteredSubProducts)

现在它允许您在不使用JSON.stringify()

的情况下显示它

现在JSON.stringify()的优点在于它会在那时为您提供快照。有时您更改数组,对象并在控制台中显示为错误值对延迟评估。 stringify会导致它被评估,并在那个时刻看到它。

答案 1 :(得分:1)

因为如果您尝试使用字符串放置对象,Chrome将无法解析内容。如果你需要"说"在将对象或数组写入控制台之前,您需要在两个console命令中执行此操作或添加逗号

var myArray = [{content:"hola"}, {content:"hello"},{content:"hallo"}];

console.log("This does not work " + myArray);

console.log("This will work just ok");
console.log(myArray);

console.log("this works too" , myArray);

答案 2 :(得分:0)

如果您在服务中将响应转换为JSON,则必须在要使用该响应时进行字符串化。

res => res.json() //在这种情况下,您需要使用stringify

答案 3 :(得分:0)

这是因为您将一个字符串"Products array"与一个带有.toString()的对象连接在一起 - 另一个字符串。你在控制台看到的是字符串。否则记录整个对象。尝试

console.log("Products array", this.filteredSubProducts);

编辑:只删除toString()并不起作用,因为"string" + ...之后的所有内容都会先转换为字符串。

// does not work
console.log("Products array" + this.filteredSubProducts);

此行为称为类型强制,您可以在this SO answerthis article或只是谷歌google it for more info

中阅读相关内容

答案 4 :(得分:0)

console.log()仅适用于嵌套的第二级,例如,如果我运行console.log({}, {}, {}),则数组中的所有对象都将显示而不进行任何混淆,但是如果我尝试记录

console.log([
  {},
  {},
  {a: {
    a: {
      a: {}
    }
  }}
])

结果类似于[ {}, {}, { a: { a: [Object] } } ]

您仍然可以通过在任何体面的浏览器控制台中扩展它们来查看对象,但是终端没有该设施,因此为了查看嵌套项,我们使用JSON.stringify()将对象及其子项转换为字符串然后可以轻松打印,但你可能已经注意到它们以这种方式松开了它们的缩进,因为你基本上是在打印一个字符串。