20

In JavaScript's JSON.stringify() function, I occasionally see the following syntax:

JSON.stringify(obj, null, 4)

However, I can't get what the second argument, null, is supposed to do. As long as I know, the above function takes an object as its first argument, and converts it to a string variable. The third argument, 4 in this case, indents and pretty-prints the resultant string object. But I can't see what the second argument tries to do even after I read the explanation on the official document... So what does the argument do? Or is it just there in order to take in the third argument? (But I think then the function should take both argument name and its parameter, such that for example, JSON.stringify(obj, space=4). I'm not sure whether that sort of syntax is allowed in JavaScript, so forgive me if it's not. But I don't know my expectation is correct in the first place, so would like to throw a question anyway).

Thanks.

4

3 回答 3

19

第二个参数可以是在字符串化时执行替换的函数。

null或未定义的第二个参数意味着您要使用标准字符串化,无需任何自定义。

来自https://developer.mozilla.org/en-US/docs/Using_native_JSON#The_replacer_pa

从 Firefox 3.5.4 开始,JSON.stringify() 通过使用可选参数提供额外的自定义功能。语法是:

jsonString = JSON.stringify(value [, replacer [, space]])

value 要转换为 JSON 字符串的 JavaScript 对象。

replacer 一个改变字符串化过程行为的函数,或一个字符串和数字对象数组,用作选择要包含在 JSON 字符串中的值对象的属性的白名单。如果此值为 null 或未提供,则对象的所有属性都包含在生成的 JSON 字符串中。

space 一个字符串或数字对象,用于将空格插入输出 JSON 字符串以提高可读性。如果这是一个数字,它表示用作空格的空格字符的数量;如果大于此数字,则此数字上限为 10。小于 1 的值表示不应使用空格。如果这是一个字符串,则该字符串(或字符串的前 10 个字符,如果它比那个长)用作空格。如果未提供此参数(或为空),则不使用空格。替换参数

replacer 参数可以是函数或数组。作为一个函数,它有两个参数,键和值被字符串化。找到密钥的对象作为替换器的 this 参数提供。最初,它使用表示正在字符串化的对象的空键调用,然后为正在字符串化的对象或数组上的每个属性调用它。它应该返回应该添加到 JSON 字符串的值,如下所示:

如果您返回一个数字,则与该数字对应的字符串在添加到 JSON 字符串时用作该属性的值。如果您返回一个字符串,则在将其添加到 JSON 字符串时,该字符串将用作属性的值。如果返回布尔值,则在将属性添加到 JSON 字符串时,将酌情使用“true”或“false”作为属性值。如果您返回任何其他对象,则该对象将递归地字符串化为 JSON 字符串,并在每个属性上调用替换函数,除非该对象是一个函数,在这种情况下,不会向 JSON 字符串添加任何内容。如果返回 undefined,则该属性不包含在输出 JSON 字符串中。注意:您不能使用替换函数从数组中删除值。如果您返回 undefined 或函数,则使用 null 代替。

例子

function censor(key, value) {
  if (typeof(value) == "string") {
    return undefined;
  }
  return value;
}

var foo = {foundation: "Mozilla", 
           model: "box", 
           week: 45, 
           transport: "car", 
           month: 7};
var jsonString = JSON.stringify(foo, censor);
The resulting JSON string is {"week":45,"month":7}.

如果 replacer 是一个数组,则该数组的值指示对象中属性的名称,这些属性应包含在生成的 JSON 字符串中。

于 2013-07-08T23:26:26.590 回答
15

在 JavaScript 中不传递第二个参数就无法传递第三个参数。当您需要传递时,函数的占位符也是
如此。nullreplacerspace

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

于 2013-07-08T23:29:03.850 回答
2
   JSON.stringify(value[, replacer[, space]])

replacer一个改变字符串化过程行为的函数,或一个字符串和数字对象数组,用作选择/过滤要包含在 JSON 字符串中的值对象的属性的白名单。如果此值为 null 或未提供,则对象的所有属性都包含在生成的 JSON 字符串中。

replacer 参数可以是函数或数组。

作为一个函数,它有两个参数:键和被字符串化的值。找到密钥的对象作为替换器的 this 参数提供。

最初,replacer 函数使用一个空字符串作为表示被字符串化对象的键来调用。然后为正在字符串化的对象或数组上的每个属性调用它。

于 2020-02-07T21:35:22.300 回答