跳到主要内容

stringify

2024年02月05日
柏拉文
越努力,越幸运

一、认识


JSON.stringify() 方法将一个 JavaScript 对象或值转换为 JSON 字符串,如果指定了一个 replacer 函数,则可以选择性地替换值,或者指定的 replacer 是数组,则可选择性地仅包含数组指定的属性。

二、语法


JSON.stringify(value[, replacer [, space]])
  • value:

  • replacer: 可以是一个函数或者一个数组。作为函数,它有两个参数,键(key)和值(value),它们都会被序列化。在开始时,replacer 函数会被传入一个空字符串作为 key 值,代表着要被 stringify 的这个对象。随后每个对象或数组上的属性会被依次传入。函数应当返回 JSON 字符串中的 value, 如下所示

    • 如果返回一个 Number, 转换成相应的字符串作为属性值被添加入 JSON 字符串。

    • 如果返回一个 String, 该字符串作为属性值被添加入 JSON 字符串

    • 如果返回一个 Boolean, "true" 或者 "false" 作为属性值被添加入 JSON 字符串

    • 如果返回任何其他对象,该对象递归地序列化成 JSON 字符串,对每个属性调用 replacer 方法。除非该对象是一个函数,这种情况将不会被序列化成 JSON 字符串

    • 如果返回 undefined,该属性值不会在 JSON 字符串中输出

    注意: 不能用 replacer 方法,从数组中移除值(values),如若返回 undefined 或者一个函数,将会被 null 取代。

  • space: 用来控制结果字符串里面的间距

三、特点


  • 特性一: 转换值如果有 toJSON() 方法,该方法定义什么值将被序列化

  • 特性二: 非数组对象的属性不能保证以特定的顺序出现在序列化后的字符串中

  • 特性三: 布尔值、数字、字符串的包装对象在序列化过程中会自动转换成对应的原始值

  • 特性三: undefined、任意的函数以及 symbol 值,在序列化过程中会被忽略(出现在非数组对象的属性值中时)或者被转换成 null(出现在数组中时)。函数、undefined 被单独转换时,会返回 undefined,如JSON.stringify(function()) or JSON.stringify(undefined)

    • 作为对象中的属性时,直接被忽略

      const symbol = Symbol("symbol");
      const foo = function () {};
      const un = undefined;

      const object = {
      symbol,
      foo,
      un,
      };
      console.log(JSON.stringify(object)); // {}
    • 作为数组中的元素时,转化为null

      const symbol = Symbol("symbol");
      const foo = function(){}
      const un = undefined;

      const array = [symbol,foo,un]
      console.log(JSON.stringify(array)) // [null,null,null]
    • 单独转换时,返回undefined

      const symbol = Symbol("symbol");
      console.log(JSON.stringify(symbol)) // undefined

      const foo = function(){}
      console.log(JSON.stringify(foo)) // undefined

      const un = undefined;
      console.log(JSON.stringify(un)); // undefined
  • 特性四: 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误

  • 特性五: 所有以 symbol 为属性键的属性都会被完全忽略掉,即便 replacer 参数中强制指定包含了它们

  • 特性六: Date 日期调用了 toJSON() 将其转换为了 string 字符串(同 Date.toISOString()),因此会被当做字符串处理

  • 特性七: NaNInfinity 格式的数值及 null 都会被当做 null

  • 特性八: 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性