toJSON() 和 JSON.stringify() 的区别

当我们需要将 JavaScript 对象转换为字符串时,我们通常会使用 JSON.stringify() 方法。但是,如果对象有一个名为 toJSON() 的方法,JSON.stringify() 将自动调用该方法并使用其返回值来序列化对象。

toJSON() 方法

toJSON() 是一个内置方法,允许对象提供它们自己的序列化形式。这个方法可以被任何对象实现,并且在序列化对象时会优先于默认的序列化方法。例如:

----- ------ - -
  ----- ----- -----
  ---- ---
  ------- -------- -- -
    ------ -
      ----- ------------------------
      ---- --------
    --
  -
--

----- ---- - -----------------------
------------------ -- -- ------------- --------------

在上面的例子中,我们定义了一个 person 对象,并在其中定义了一个 toJSON() 方法。这个方法返回一个新对象,其中 name 属性被转换为大写字母。当我们调用 JSON.stringify() 方法时,它首先检查对象是否有 toJSON() 方法。如果有,则使用该方法的返回值进行序列化。

JSON.stringify() 方法

JSON.stringify() 方法将 JavaScript 对象转换为 JSON 字符串。它有三个参数:要序列化的对象、替换函数和缩进量(可选)。例如:

----- ------ - -
  ----- ----- -----
  ---- --
--

----- ---- - ---------------------- ----- ---
------------------ -- --
--
-
  ------- ----- -----
  ------ --
-
--

在上面的例子中,我们将 person 对象序列化为一个 JSON 字符串,并使用两个空格进行缩进。如果对象有一个 toJSON() 方法,则在序列化对象之前,JSON.stringify() 将自动调用该方法并使用其返回值来序列化对象。

区别和指导

toJSON() 方法允许对象提供自定义的序列化形式,并且优先于默认的序列化方法。这使得我们能够更好地控制对象的序列化结果。然而,当我们处理不同类型的对象时,可能需要在每个对象上实现不同的 toJSON() 方法,这会增加代码的复杂性。

JSON.stringify() 方法是一种通用的序列化方式,适用于大多数情况下。它具有可选的替换函数和缩进参数,使得我们可以更好地控制序列化结果。但是,当我们需要对特定对象进行自定义序列化时,可以通过实现 toJSON() 方法来控制序列化结果。

总之,如果你想要完全控制对象的序列化方式,那么你应该实现 toJSON() 方法。否则,JSON.stringify() 方法是一个通用的、易于使用的选择。

示例代码:

----- --- - -
  ----- --------
  ---- ---
  -------- -
    ------ -
      ----- ------------------------
      ---- -------- - -
    --
  -
--

-- -- --------
----- ----- - --------------------
------------------- -- -- -------------------------

-- --- --------
----- ----- - ------------------- ----- ---
------------------- -- -- -
                     --   ------- --------
                     --   ------ --
                     -- -

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/27430