iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JSON.stringify实例详解以及灵活运用
  • 612
分享到

JSON.stringify实例详解以及灵活运用

2024-04-02 19:04:59 612人浏览 独家记忆
摘要

目录前言语法参数replacer参数space参数特性描述应用localStorage对象深拷贝属性过滤总结前言 工作中经常使用 JSON.stringify 方法存储 localS

前言

工作中经常使用 JSON.stringify 方法存储 localStorage,深拷贝对象,用的最多的就是第一个参数,甚至不知道它还有第二个和第三个参数,所以详细的整理了一下 jsON.stringify 用法和特性,使我们能够真正的能灵活运用这个方法。

语法

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

参数

replacer 参数

replacer 参数可以是一个函数或者一个数组。作为函数,它有两个参数,键(key)和值(value),它们都会被序列化。

值得注意的是,在开始时, replacer 函数会被传入一个空字符串作为 key 值,value代表着要被 stringify 的这个对象。随后每个对象或数组上的属性会被依次传入。

总的来说 replacer 参数就是用来手动忽略一些不想被序列化的属性,有点类似过滤器的作用

var foo = {
  id: 1,
  name: "sf",
  age: 18,
};
//作为函数,函数没有返回值或者返回值为 undefined 时,忽略这个属性值
JSON.stringify(foo, (key, value) => {
  if (typeof value === "string") {
    return undefined;
  }
  return value;
});
//{"id":1,"age":18}

//作为数组,数组的值代表将被序列化成 JSON 字符串的属性名
JSON.stringify(foo, ['id',"name"]);
//{"id":1,"name":"sf"}

space 参数

space 参数用来控制结果字符串里面的间距。如果是一个数字, 则在字符串化时每一级别会比上一级别缩进多这个数字值的空格(最多10个空格);如果是一个字符串,则每一级别会比上一级别多缩进该字符串(或该字符串的前10个字符)。实际使用基本都是用来美化输出。

let a = JSON.stringify({ a: 1, b: 2 }, null, 2);
let b = JSON.stringify({ a: 1, b: 2 }, null, "  ");
console.log(a == b); //true

JSON.stringify({ a: 1, b: 2 }, null, "--");
// {
// --"a": 1,
// --"b": 2
// }

特性描述

1. undefined、Symbol值、函数

  • 出现在对象属性值中: undefined、Symbol值、函数,在序列化过程中将会被忽略
  • 出现在数组中: undefined、Symbol值、函数 会被转化为 null
  • 单独转换时: 会返回 undefined
const obj = {
  a: "a",
  b: undefined,
  c: Symbol(),
  d: function () {},
};
JSON.stringify(obj)
// {"a":"a"}
const arry = [undefined, Symbol("c"), function () {}];
JSON.stringify(arry); 
//[null,null,null]
JSON.stringify(undefined); 
// undefined
JSON.stringify(Symbol(111));
// undefined
JSON.stringify(function () {});
// undefined

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

正如在第一特性所说,JSON.stringify() 序列化时会忽略一些特殊的值,所以不能保证序列化后的字符串还是以特定的顺序出现(数组除外)。

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

JSON.stringify([new Boolean(true), new Number(1), new String("a")]);
// [true,1,"a"]

4. 转换值如果有 toJSON() 方法,该方法定义什么值将被序列化

const obj = {
  a: "aaa",
  toJSON() {
    return "hello world";
  },
};
JSON.stringify(obj);
// "hello world"

5. 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。

const obj = {
  name: "loopObj",
};
const loopObj = {
  obj,
};
// 对象之间形成循环引用,形成闭环
obj.loopObj = loopObj;
JSON.stringify(obj);
//TypeError: Converting circular structure to JSON

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

. 对包含循环引用的对象(对象之间相互引用,形成无限循环)执行此方法,会抛出错误。

const obj = {
  a: "aaa",
  [Symbol("foo")]: "foo",
};
JSON.stringify(obj);
// {"a":"aaa"}
JSON.stringify(obj, function (k, v) {
  if (typeof k === "symbol") {
    return "a symbol";
  }
});
// undefined

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

JSON.stringify({
  date: new Date("2022-02-02"),
})
// {"date":"2022-02-02T00:00:00.000Z"}

8. NaN 和 Infinity 格式的数值及 null 都会被当做 null。

JSON.stringify([NaN, Infinity, 1 / 0, Number("a")]);
// [null,null,null,null]

9. 其他类型的对象,包括 Map/Set/WeakMap/WeakSet,仅会序列化可枚举的属性。

// 不可枚举的属性默认会被忽略:
JSON.stringify(
  Object.create(null, {
    x: { value: "x", enumerable: false },
    y: { value: "y", enumerable: true },
  })
);
// "{"y":"y"}"

应用

localStorage

localStorage 中的键值对总是以字符串的形式存储,所以当我们需要把一个对象存在 localStorage 中时,只能用 JSON.stringify 将其转化成字符串存储,使用的时候用 JSON.parse 方法去取

const userInfo = { user: "admin" };
localStorage.setItem("userInfo", JSON.stringify(userInfo));
JSON.parse(localStorage.getItem("userInfo"));
// {user: 'admin'}

对象深拷贝

使用 JSON.parse(JSON.stringify) 是实现对象的深拷贝最简单粗暴的方法。但是由于 JSON.stringify 的一些特性,会产生问题,例如:

  • undefined、Symbol、 函数, 对象中会被忽略,数组中会被序列化成 null。
  • NaN、Infinity 和 -Infinity 会被序列化成 null。
  • 循环引用问题,stringify 会报错。

当确定不存在以上情况时,才考虑使用 JSON.parse(JSON.stringify) 进行深拷贝。

属性过滤

当接口返回一大堆数据,我们只想存某几个属性的时候,通过 replacer 函数过滤属性是一个不错的小技巧。

var foo = {
  id: 1,
  name: "sf",
  age: 18,
};
localStorage.setItem("user", JSON.stringify(foo, ["id", "name"]));
localStorage.getItem("user");
//{"id":1,"name":"sf"}

总结

到此这篇关于JSON.stringify实例详解以及灵活运用的文章就介绍到这了,更多相关JSON.stringify运用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JSON.stringify实例详解以及灵活运用

本文链接: https://www.lsjlt.com/news/142215.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JSON.stringify实例详解以及灵活运用
    目录前言语法参数replacer参数space参数特性描述应用localStorage对象深拷贝属性过滤总结前言 工作中经常使用 JSON.stringify 方法存储 localS...
    99+
    2024-04-02
  • 单例模式在PHP中灵活运用的最佳实践
    在PHP编程中,设计模式是一种被广泛应用的技术,而单例模式是其中一种实用的设计模式。单例模式保证类在整个系统中只能被实例化一次,提供了全局访问的机制,适合在需要保持全局状态或共享资源的情况下使用。在本文中,我们将讨论如何在PHP中灵活地运用...
    99+
    2023-10-21
    PHP 单例模式 (Singleton) 最佳实践 (Best practice)
  • jvm运行原理以及类加载器实例详解
    JVM运行原理 首先从“.java”代码文件,编译成“.class”字节码文件,然后类加载器将“.class”字节码文件中的类给加载带JVM中,最后就是JVM执行写好的代码。执行过...
    99+
    2024-04-02
  • 单例模式在PHP中的灵活运用与封装实践
    引言:单例模式是一种常见的设计模式,用于确保一个类只能创建一个实例并提供全局访问。在PHP中,单例模式是非常实用的,特别是在需要共享资源、数据缓存等情况下。本文将介绍单例模式在PHP中的应用场景,并提供详细的代码示例。一、什么是单例模式单例...
    99+
    2023-10-21
    PHP 单例模式 灵活运用
  • 深入理解Oracle NVL函数的灵活运用
    Oracle数据库中的NVL函数是一种常用的处理空值的函数,它的作用是判断指定的表达式是否为NULL,若为空则返回一个指定的默认值,若不为空则返回原始值。在实际的数据库开发中,灵活运用...
    99+
    2024-03-11
    oracle 灵活运用 nvl函数
  • CountDownLatch详解以及用法示例
    一、什么是countDownlatch CountDownLatch是一个同步工具类,它通过一个计数器来实现的,初始值为线程的数量。每当一个线程完成了自己的任务,计数器的值就相应得减1。当计数器到达0...
    99+
    2023-09-11
    java
  • C++模板以及实现vector实例详解
    目录函数模板类模板Vector实现简单的类模板实现代码及测试:win msvc编译器的实现:容器的空间配置器运算符重载与迭代器实现最终vector的实现代码总结函数模板 函数模板:是...
    99+
    2024-04-02
  • Java选择排序法以及实例详解
    选择排序技术是一种选择数组中最小的元素并与数组的第一个元素交换的方法。接下来,数组中第二小的元素与第二个元素交换,反之亦然。 这样,数组中的最小元素会被重复选择并放在适当的位置,直到...
    99+
    2022-11-13
    Java 排序法
  • css栅格系统在项目中灵活运用的示例分析
    这篇文章主要介绍了css栅格系统在项目中灵活运用的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言css栅格通常捆绑在各种框架中,但有时你需要自己去定制一个css栅...
    99+
    2023-06-08
  • 深入理解Go语言range关键字的灵活运用
    标题:深入理解Go语言range关键字的灵活运用 Go语言是一种高效、简洁的编程语言,其内置的range关键字在处理数组、切片、映射和通道等数据结构时非常灵活,并且能提高代码的可读性和...
    99+
    2024-03-12
    go语言 灵活运用 range关键字 键值对
  • AJAX原理以及axios、fetch区别实例详解
    目录AJAX原理Promise封装AjaxJQ Ajax、Axios、Fetch的核心区别JQuery AjaxAxiosFetch补充:为什么要用axios总结AJAX原理 Aja...
    99+
    2024-04-02
  • Java异常类型以及处理实例详解
    目录一、异常的描述二、异常的体系三、异常的分类:四、异常处理的捕捉形式五、异常处理的原则六、finally七、异常的应用八、异常的注意事项:总结一、异常的描述 程序运行时,发生的不被...
    99+
    2024-04-02
  • 简易版本JSON.stringify的实现及其六大特性详解
    目录前言JSON.stringify六大特性特性一特性二特性三特性四特性五特性六手动实现stringify总结前言 JSON.stringify是一个使用非常高频的API,但是其却存...
    99+
    2024-04-02
  • 阿里云服务器可以拆分吗?详解云服务器的灵活使用
    在互联网时代,云计算已经成为企业IT的重要组成部分。阿里云作为国内领先的云计算服务商,提供了各种类型的云服务器,让用户可以根据自己的需求灵活选择。但是,有些用户可能会有疑问,阿里云服务器可以拆分吗?拆分后有哪些优势呢?本文将对此进行详细说明...
    99+
    2023-11-20
    服务器 阿里 详解
  • mysql(5.6及以下)解析json的方法实例详解
    mysql(5.6及以下)解析json #json解析函数 DELIMITER $$ DROP FUNCTION IF EXISTS `json_extract_c`$$ CREATE ...
    99+
    2024-04-02
  • python中matplotlib的颜色以及形状实例详解
    目录绘制折线图绘制柱形图簇状柱形图堆积柱形图散点图附:matplotlib实现区域颜色填充总结 绘制折线图 命令形如: # 常用 plt.plot(x, y, linewi...
    99+
    2024-04-02
  • SQL注入的实现以及防范示例详解
    什么是SQL注入 SQL注入是指通过构建特殊的输入篡改原来的SQL语句达到攻击者所需的操作。 Sql 注入产生原因 我们访问动态网页时往往会向服务器发送请求,服务器向数据访问层发...
    99+
    2024-04-02
  • C语言goto的应用举例以及详解
    目录一、goto语句的简单解释二、goto语句简单引用举例三、goto语句的实际引用场景总结一、goto语句的简单解释   goto语句其实就是一个跳转语句。C语言中提供了...
    99+
    2022-11-13
    c语言goto用法举例 c语言goto语句怎么用 C语言中的goto
  • 灵活运用Python 枚举类来实现设计状态码信息
    引言 在 web 项目中,我们经常使用自定义状态码来告知请求方请求结果以及请求状态;在 Python 中该如何设计自定义的状态码信息呢? 普通类加字典设计状态码 #!/usr/b...
    99+
    2024-04-02
  • MYSQL 多实例安装以及常见运维点
    重点:配置GNR时需要所有的GNR以[ mysqld xxx]的格式命名,否则会报找到GNR的错误 准备Mysqld_multi配置文件加入多实例的配置信息 指定GNR启动实例(不要指定MYS...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作