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


猜你喜欢

  • 如何在 NodeJS 中分割和修改字符串?

    在前端开发中,字符串是一个非常重要的数据类型。在 NodeJS 中,对于字符串的操作也十分常见。本文将详细讨论如何在 NodeJS 中分割和修改字符串。 1. 字符串分割 在 NodeJS 中,可以使...

    7 年前
  • 如何停止 Lodash.js 的 _.each 循环?

    在前端开发中,我们经常需要遍历一个数组或对象并对其中的每个元素执行一些操作。而 Lodash.js 是一个非常流行的 JavaScript 工具库,其中包含了许多方便的方法用于处理数组和对象。

    7 年前
  • "throw new Warning" in JavaScript?

    在JavaScript中,我们通常使用throw语句来抛出错误。但是你是否听说过throw new Warning这个语法?它与普通的throw有什么不同呢? Warning 对象 在ECMAScri...

    7 年前
  • 在第n次出现某个字符处截取字符串

    在前端开发中,我们经常需要操作字符串。有时候,我们需要从一个字符串中获取一部分内容。例如,我们可能需要从一个 URL 中提取参数或从一个 CSV 文件中提取数据。如果我们知道要截取的字符在字符串中出现...

    7 年前
  • Javascript 垃圾回收

    Javascript 是一种解释型语言,由于其动态类型和自动内存管理的特性,垃圾回收机制成为了其非常重要的一个组成部分。本文将介绍 Javascript 中的垃圾回收机制,并探讨如何编写更可靠、高效的...

    7 年前
  • ES6 对象解构和默认参数

    ES6(ECMAScript 2015)为JavaScript开发人员带来了很多新特性,包括对象解构和默认参数。本文将重点介绍ES6中的对象解构和默认参数,并提供一些示例代码来帮助您理解它们在前端开发...

    7 年前
  • 在 HTML 表单中调用 JavaScript

    HTML 表单是网站中最基本的用户交互组件之一。通过使用 JavaScript,我们可以对表单元素做更多的控制和操作,包括数据验证、动态更新页面内容等。在本文中,我将介绍如何在 HTML 表单中调用 ...

    7 年前
  • Javascript:语句和表达式的区别

    在JavaScript编程中,语句和表达式是两个非常重要的概念。虽然它们看起来类似,但却有着根本性的差异。在本文中,我们将深入研究这两者之间的异同点,以及如何在你的代码中使用它们。

    7 年前
  • 为什么 [object Object] 中会出现两次“object”?

    在前端开发中,我们经常会看到 [object Object] 这样的字符串。这个字符串看上去有些奇怪,特别是其中“object”这个单词出现了两次。那么为什么会出现这种情况呢? 基本概念 在 Java...

    7 年前
  • Backbone.js 和 pushState

    介绍 Backbone.js 是一个轻量级的 JavaScript 框架,用于在客户端构建单页应用程序(SPA)。它提供了一种组织代码的结构和模式,包括模型、视图和控制器的概念。

    7 年前
  • $resource callback (error and success)详解

    在前端开发中,我们经常需要从后端获取数据。为此,AngularJS提供了一个强大的服务 $resource,它可以帮助我们轻松地处理 RESTful API 请求。

    7 年前
  • 向 Angular ng-include 传递参数

    AngularJS 是一个流行的前端框架,其中 ng-include 指令允许我们在模板中包含其他模板。有时,我们需要将参数传递给被包含的模板。本文将介绍如何使用 ng-include 传递参数,并提...

    7 年前
  • 如何测量网页停留时间?

    在前端开发中,我们经常需要知道用户在网站上停留的时间,以便进行数据统计和分析。本文将介绍一些测量网页停留时间的方法。 1. 使用window.performance 可以使用window.perfor...

    7 年前
  • Protractor: element.getText() 返回的是对象而非字符串

    在使用 Protractor 进行前端自动化测试时,我们常常需要获取页面元素的文本信息。其中一个获取文本的方法是 element.getText()。但是,在某些情况下,我们可能会发现该方法返回的并不...

    7 年前
  • 使用 Node.js 将文件系统中的目录结构转换为 JSON

    在开发前端应用程序时,有时需要将文件系统中的目录结构转换为 JSON 格式,以便在应用程序中进行操作。Node.js 是一个流行的工具,可以使用其内置的 fs 模块来访问文件系统,并将目录结构转换为 ...

    7 年前
  • new Number() vs Number()

    在 JavaScript 中,有两种常见的创建数字对象的方式:new Number() 和 Number()。这两种方法看起来很相似,但实际上它们之间有一些重要的区别。

    7 年前
  • 使用 Google Chrome 逐行调试 Javascript

    在前端开发中,我们经常需要对 JavaScript 进行调试以查找代码中的错误。Google Chrome 提供了一套强大的调试工具,可以帮助我们逐行调试 JavaScript 代码并快速找到问题。

    7 年前
  • 使用 AngularJS 和 jQuery Datatable 实现数据表格

    在前端开发中,使用数据表格来展示信息是很常见的需求。而针对数据表格的操作和功能,jQuery Datatable 是一个非常实用且易于扩展的插件库。本文将介绍如何在 AngularJS 中使用 jQu...

    7 年前
  • 在Node.js / Express应用程序中存储数据库配置的最佳方式

    在开发基于Node.js / Express的Web应用程序时,数据库是一个不可或缺的部分。然而,我们通常需要将敏感的数据库凭据(比如用户名、密码、主机名等)与代码分开存储,以提高安全性并避免意外泄露...

    7 年前
  • 为什么这个简单的AngularJS ng-show不起作用?

    当你第一次学习AngularJS时,你可能会遇到ng-show指令。它被用于在应用中显示或隐藏元素,具有非常重要的作用。但是,你可能会遇到一个情况,在你认为这个指令应该工作的时候并没有生效。

    7 年前

相关推荐

    暂无文章