JSON.stringify 的操作顺序

Order of operations with JSON.stringify

我有以下 fiddle http://jsfiddle.net/kc11/h6nh1gvw/1/ 。我对 JS 没有经验。

我明白了;

alert(JSON.stringify(getCarData()[0]));

产生:

{"car":"Mercedes A 160","year":2006,"available":true,"comesInBlack":"yes"}

但是:

alert(JSON.stringify(getCarData())[0]);

产生:

[

有人能用通俗易懂的英语解释一下这里发生了什么吗?直觉上我觉得第二个操作应该也能产生第一个 JSON 记录。

在您提供的第一行代码中,您正在序列化一个对象并将结果作为 JSON 字符串。第二个示例似乎是您试图将该对象视为一个数组并序列化返回的该数组的第一个元素。

假设是这种情况,您需要将代码中括号的位置更改为:

alert(JSON.stringify(getCarData()[0]));

您所写的实际上只是从返回的 JSON 字符串中取出第一个字符(即“[”)。因此,您从中获得的输出。

这里值得注意的另一件事是,当您索引一个对象时,您不会得到您期望的结果。您可能应该指定一个希望序列化的 属性 名称,例如:

alert(JSON.stringify(getCarData()["car"]));

你明白了。祝你好运!

假设 JSON.stringify 没有抛出错误,JSON.stringify(foo) 的结果是一个 String,我们称它为 str,所以

JSON.stringify(getCarData())[0];
// same as
JSON.stringify(foo)[0]; // foo = getCarData()
// same as
str[0];

因此,通过在此处使用 [0],您可以从 String 中获取第一个字符。这将是一个 "[" 如果你 stringified 一个 Array


现在我们明白了这一点,让我们回顾一下JSON.stringify(foo[0]),假设foo类数组

这里的[0]是选择数组索引0处的项,我们称这个为item,所以

JSON.stringify(getCarData()[0]);
// same as
JSON.stringify(foo[0]); // foo = getCarData()
// same as
JSON.stringify(item);
// so we end up with
str2; // not the same as str

这次我们 stringified 来自 JavaScript 的东西,但没有做任何进一步的事情,所以结果是 JSON 表示我们在 stringify 上调用的任何内容(在你的例子中它是一个 Object

getCarData() 是一个对象数组。

getCarData()[0]是这个对象数组的第一个对象,所以可以字符串化。

JSON.stringify(getCarData()[0]) 将 return 对象数组的第一个对象的字符串。

JSON.stringify(getCarData()) 将 return 整个对象数组的 字符串

JSON.stringify(getCarData())[0] 将 return 上述命令生成的字符串的第一个字母,即 [,因为您实际上是在做类似 "hi"[0] 的事情是一个字符,而之前你做的 {"hi","hello"}[0] 是一个字符串元素。

让我们分解一下 alert(JSON.stringify(getCarData())[0]); 正在尝试做的事情。

还记得 PEMDAS 吗?我们基本上在做同样的事情。

  1. 最深的括号调用是getCarData(),也就是returns数组。

  2. 接下来,您在该数组上调用 JSON.stringify(),returns 一个字符串。

  3. 最后,您调用 [0],它有效地获取了该字符串的第一个字符。

这两种操作顺序有根本的区别,下面我会解释。

TLDR 第一次调用 JSON.stringify() 获取所需的汽车数据,然后将其字符串化,而第二种方式将包含汽车数据的对象数组字符串化,然后尝试访问该字符串中的第一个元素,即该字符串的第一个字符。

让我们分解下一行的作用:

alert(JSON.stringify(getCarData()[0]));

第一个

getCarData()

returns 和数组,它在位置 0 处有一个对象。[0] 是说给我汽车数据数组中的第一项 returned 由 getCarData() .

然后将此对象传递给 JSON.stringify() 函数以进行字符串化。正如您所期望的那样工作 returning:

{"car":"Mercedes A 160","year":2006,"available":true,"comesInBlack":"yes"}   

您进行的第二次字符串化调用:

alert(JSON.stringify(getCarData())[0]); 

正在获取汽车数据(return 编辑为数组)并将其传递给 JSON.stringify 函数。

JSON.stringify(getCarData())

这将 return 包含汽车数据的对象数组。 JSON 然后尝试对数组进行字符串化,然后 returns

[{"car":"Mercedes A 160","year":2006,"available":true,"comesInBlack":"yes"},{"car":"Citroen C4 Coupe","year":2008,"available":false,"comesInBlack":"yes"},{"car":"Audi A4 Avant","year":2011,"available":true,"comesInBlack":"no"},{"car":"Opel Astra","year":2004,"available":false,"comesInBlack":"yes"},{"car":"BMW 320i Coupe","year":2011,"available":false,"comesInBlack":"no"}]

接下来您尝试访问此字符串化数组中的第一项,但由于它现在是一个字符串(不是数组),它只是 returns [,字符串的第一个字符。

总结

第一种方法获取你想要的数据,然后将其字符串化,而第二种方法字符串化包含汽车数据的对象数组,然后尝试访问字符串中的第一个元素,即第一个字符那个字符串。