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

behavior of third argument for 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 个破折号?

有 10 个破折号,因为它在每个嵌套级别嵌套 2 倍,例如 { -> 直接在此处的所有内容都是 1 倍嵌套,因此得到“-----”。 { "-----" 然后 b: { "-----"b: [ "-----" 获得额外的 5 嵌套级别。

换句话说,每个键的值都是 typeof value == 'array' || typeof value == 'object' 并且也不像 [1][{}] 那样为空,尽管字符数很少,这将决定打破它直到下一行,每一行都会得到你在 运行 stringify 时选择的 "spacer" * degree that it is nested 在这种情况下 "-----" 该值内的任何内容都必须有额外的嵌套。决定 JSON 外观的人认为这是嵌套对象的功能,我同意他们的看法,这看起来不错。

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

来自 MDN (see here):

A String or Number object that's used to insert white space into the output JSON string for readability purposes. If this is a Number, it indicates the number of space characters to use as white space; this number is capped at 10 if it's larger than that. Values less than 1 indicate that no space should be used. If this is a String, the string (or the first 10 characters of the string, if it's longer than that) is used as white space. If this parameter is not provided (or is null), no white space is used.

所以它有效地替换了空格。我假设与不带可选参数的调用的区别不使用任何空格来格式化数组,但是给定可选参数它尝试使用它来格式化带有缩进的数组,在这种情况下是破折号。它在数组元素上使用参数两次以进一步缩进它们以提高可读性。

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

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

这在SerializeJSONObject中有描述:

  1. Let stepback be indent.
  2. Let indent be the concatenation of indent and gap.
  • ...
  1. Let indent be stepback.

如果它的行为不是这样的,输出的格式就不会正确。