JSON.stringify的第三个参数的行为

时间:2016-09-06 19:10:36

标签: javascript json stringify

我很困惑为什么在下面的代码输出中的数字1,2,3之前有10个破折号。 (在此处复制:https://repl.it/DRuH

var a = {
    b: 42,
    c: "42",
    d: [1,2,3]
};

console.log(JSON.stringify( a, null, "-----" ));

输出

{
-----"b": 42,
-----"c": "42",
-----"d": [
----------1,
----------2,
----------3
-----]
}

为什么不会[1,2,3]出现在一起,就像b和c看起来一样?

为什么这些数字有10个破折号而不是5个破折号?

4 个答案:

答案 0 :(得分:1)

当您提供space参数时,数组或对象的每个元素都放在它自己的行上,并缩进以指示它在对象和数组的层次结构中的深度。由于d数组中的数字是层次结构的第二级,因此它们会获得-----字符串的2个副本。

答案 1 :(得分:0)

有10个短划线,因为每个嵌套级别嵌套2次,例如{ - >直接在这里的所有内容都是1x嵌套,因此得到" -----"。 { "-----"然后b: { "-----"b: [ "-----"额外获得5个额外的嵌套级别。

换句话说,每个键的值为typeof value == 'array' || typeof value == 'object'但也不是空的,如[1][{}],尽管字符数较少,这将决定将其分解为在这种情况下,下一行和每个新行将获得您在运行stringify时选择的"spacer" * degree that it is nested" -----"该值内的任何内容都必须有额外的嵌套。决定JSON如何看待的人决定这是嵌套对象的功能,我同意他们这看起来不错。

答案 2 :(得分:0)

来自MDN (see here)

  

用于将空白插入输出JSON字符串的String或Number对象,以便于阅读。如果这是一个数字,则表示用作空格的空格字符数;如果此数字大于10,则该数字的上限为10。小于1的值表示不应使用空格。 如果这是一个字符串,则字符串(或字符串的前10个字符,如果它长于该字符串)用作空格。如果未提供此参数(或者是null),没有使用空格。

所以它有效地取代了空白。我假设与没有可选参数的调用有所不同并没有使用任何空格来格式化数组,但是给定可选参数它会尝试使用它来使用indententation格式化数组,或者在这种情况下破折号。它在数组元素上使用两次参数来进一步缩进它们以获得更好的可读性。

答案 3 :(得分:0)

当您将"-----"作为第3个参数传递时, gap 参数将变为"-----"

输出的缩进最初是空字符串,但在每个嵌套级别, gap 会附加到它上面,并在返回上一级时被删除。

SerializeJSONObject

中对此进行了描述
  
        
  1. stepback 成为缩进
  2.     
  3. 缩进成为缩进间隙的串联。
  4.         
    • ...
         
          
    1. 缩进成为 stepback
    2.   

如果它不像这样,输出看起来不像格式正确。