使用JSON.stringify的操作顺序

时间:2015-01-01 23:32:55

标签: javascript json

我有以下小提琴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记录。

5 个答案:

答案 0 :(得分:2)

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

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

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

你写的内容实际上只是从返回的JSON字符串中取出第一个字符(即" [")。因此你得到的输出。

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

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

你明白了。祝你好运!

答案 1 :(得分:2)

假设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 中获取第一个字符。如果您字符串化 数组

,那么这将是"["

现在我们理解这一点,让我们回顾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

这次我们 JavaScript em> stringify on(在您的情况下,它是 Object

答案 2 :(得分:2)

getCarData()是一个对象数组。

getCarData()[0]是此对象数组的第一个对象,因此可以进行字符串化。

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

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

JSON.stringify(getCarData())[0]将返回上述命令生成的字符串的第一个字母,即[,因为您基本上做的是像"hi"[0]这样的字符,而之前你做的是{"hi","hello"}[0]这是一个字符串元素。

答案 3 :(得分:2)

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

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

  1. 最深的括号调用是getCarData(),它返回数组。

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

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

答案 4 :(得分:1)

两个操作顺序之间存在根本区别,我将在下面解释。

<强> TLDR 第一次调用JSON.stringify()可以获取所需的汽车数据,然后对其进行字符串化,而第二种方法是对包含汽车数据的对象数组进行字符串化,然后尝试访问该字符串中的第一个元素,这是第一个该字符串的字符。

让我们分解以下几行:

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

第一

getCarData()

返回并且在位置0处有一个对象的数组。[0]说给我getCarData()返回的汽车数据数组中的第一项。

然后将此对象传递给JSON.stringify()函数进行字符串化。这可以按预期的方式返回:

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

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

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

获取汽车数据(以数组形式返回)并将其传递给JSON.stringify函数。

JSON.stringify(getCarData())

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

[{"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"}]

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

总结

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