详解JavaScript对象序列化


Posted in Javascript onJanuary 19, 2016

一.什么是对象序列化?

对象序列化是指将对象的状态转换为字符串(来自我这菜鸟的理解,好像有些书上也是这么说的,浅显易懂!);

序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程(来自“百度百科—序列化“,学术性强,略显高端);

二.为什么会有对象序列化?

世间万物,都有其存在的原因。为什么会有对象序列化呢?因为程序猿们需要它。既然是对象序列化,那我们就先从一个对象说起:

var obj = {x:1, y:2};

 

当这句代码运行时,对象obj的内容会存储在一块内存中,而obj本身存储的只是这块内存的地址的映射而已。简单的说,对象obj就是我们的程序在电脑通电时在内存中维护的一种东西,如果我们程序停止了或者电脑断电了,对象obj将不复存在。那么如何把对象obj的内容保存在磁盘上呢(也就是说在没电时继续保留着)?这时就需要把对象obj序列化,也就是说把obj的内容转换成一个字符串的形式,然后再保存在磁盘上。另外,我们又怎么通过HTTP协议把对象obj的内容发送到客户端呢?没错,还是需要先把对象obj序列化,然后客户端根据接收到的字符串再反序列化(也就是将字符串还原为对象)解析出相应的对象。这也正是”百度百科—序列化“中描述的两个作用——存储、传输。

三.JavaScript中的对象序列化

JSON的全称是”JavaScript Object Notation“——JavaScript对象表示法。ECMAScript 5中提供了内置函数JSON.stringify()和JSON.parse()用来序列化和还原JavaScript对象。它们使用起来也很简单:

详解JavaScript对象序列化

详解JavaScript对象序列化

可以看到,exampleStr和exampleObj2中并没有 y:undefined 的内容。这说明:JSON的语法是JavaScript语法的子集,它并不能表示JavaScript中的所有值,对于JSON语法不支持的属性,序列化后会将其省略。其详细规则如下:

  • ①对于JavaScript中的五种原始类型,JSON语法支持数字、字符串、布尔值、null四种,不支持undefined;
  • ②NaN、Infinity和-Infinity序列化的结果是null;
  • ③JSON语法不支持函数;
  • ④除了RegExp、Error对象,JSON语法支持其他所有对象;
  • ⑤日期对象序列化的结果是ISO格式的字符串,但JSON.parse()依然保留它们字符串形态,并不会将其还原为日期对象;
  • ⑥JSON.stringify()只能序列化对象的可枚举的自有属性;

从上面的例子也可以看到,在符合以上规则的情况下,还可以通过对象序列化和反序列化完成对象的深拷贝。

以上就是JSON.stringify()和JSON.parse()的常用用法了,但这两个方法并不止这么简单:

四.完整版JSON.stringify()

1.简介

序列化原始值、对象或数组

2.概要

JSON.stringify(o[, filter][, indent])

3.参数

o,要转换成JSON字符串的原始值、对象或数组

filter,可选参数,一个数组或函数

indent,可选参数,一个数值或一个字符串

4.返回

JSON格式的字符串,代表o的值,同时通过了filter的过滤,以及根据indent进行了格式化

5.描述

①当对象o自身带有toJSON()方法时,JSON.stringify()会调用o的toJSON()方法,并使用该方法的返回值而不是该对象本身进行字符串化;

②如果filter存在且是一个函数,那么该函数的返回值将会作为JSON.stringify()方法的返回值。并且该函数接收两个参数,第一个参数是一个空字符串,第二个参数就是对象o。

③如果filter存在且是一个字符串数组(如果数组中包含数字,数字会自动转化为字符串),那么对象o的某些属性名如果不在这个数组中,则序列化时会将这些属性省略,且返回的字符串中属性的顺序会与该数组中属性的顺序一致;

④JSON.stringify()返回的通常是不带任何空格或换行符的字符串。如果想输出可读性更好的字符串,需要指定第三个参数。如果指定的第三个参数是介于1~10之间的值,则JSON.stringify()会在每一“层级”的输出插入换行符和指定个数的空格。如果指定的第三个参数是非空字符串,则JSON.stringify()会插入换行符和该字符串(只取前十个字符)来缩进层级;

五.完整版JSON.parse()

1.简介

解析JSON格式的字符串

2.概要

JSON.parse(s[, reviver])

3.参数

s,要解析的字符串

reviver,可选参数,用来转换解析值的可选函数

4.返回

一个对象、数组或原始值。该返回值是从s中解析的(还有可能被reviver修改过);

5.描述

①如果指定了reviver函数,该函数会为从s中解析的每一个原始值(不是包含这些原始值的对象或数组)调用一次。调用reviver时带有两个参数,第一个参数是属性名——对象的属性名或转换成字符串的数组序号,第二个参数是对象属性或数组元素的原始值。并且,reviver函数的返回值将作为JSON.parse()的返回值;

以上就是关于JavaScript对象序列化的相关内容,希望对大家的学习有所帮助。

Javascript 相关文章推荐
javascript中SetInterval与setTimeout的定时器用法
Aug 24 Javascript
angularjs创建弹出框实现拖动效果
Aug 25 Javascript
js判断登陆用户名及密码是否为空的简单实例
May 16 Javascript
vue.js指令v-model实现方法
Dec 05 Javascript
使用bootstrap-paginator.js 分页来进行ajax 异步分页请求示例
Mar 09 Javascript
详解从angular-cli:1.0.0-beta.28.3升级到@angular/cli:1.0.0
May 22 Javascript
对于防止按钮重复点击的尝试详解
Apr 22 Javascript
async/await让异步操作同步执行的方法详解
Nov 01 Javascript
JavaScript实现指定数量的并发限制的示例代码
Mar 10 Javascript
基于Vue sessionStorage实现保留搜索框搜索内容
Jun 01 Javascript
JavaScript获取时区实现过程解析
Sep 24 Javascript
OpenLayers3实现地图显示功能
Sep 25 Javascript
学习JavaScript设计模式之单例模式
Jan 19 #Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
Jan 19 #Javascript
学习JavaScript设计模式之装饰者模式
Jan 19 #Javascript
jQuery事件绑定用法详解(附bind和live的区别)
Jan 19 #Javascript
浏览器环境下JavaScript脚本加载与执行探析之动态脚本与Ajax脚本注入
Jan 19 #Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
Jan 19 #Javascript
jquery 重写 ajax提交并判断权限后 使用load方法报错解决方法
Jan 19 #Javascript
You might like
php的计数器程序
2006/10/09 PHP
解析php时间戳与日期的转换
2013/06/06 PHP
PHP实现的QQ空间g_tk加密算法
2015/07/09 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
多种方法实现JS动态添加事件
2013/11/01 Javascript
JavaScript在for循环中绑定事件解决事件参数不同的情况
2014/01/20 Javascript
js,jquery滚动/跳转页面到指定位置的实现思路
2014/06/03 Javascript
Javascript 数组排序详解
2014/10/22 Javascript
浅谈JavaScript中运算符的优先级
2015/07/07 Javascript
Bootstrap 填充Json数据的实例代码
2017/01/11 Javascript
ng-options和ng-checked在表单中的高级运用(推荐)
2017/01/21 Javascript
vue2.0实现分页组件的实例代码
2017/06/22 Javascript
AngularJS中ng-class用法实例分析
2017/07/06 Javascript
前端主流框架vue学习笔记第二篇
2017/07/26 Javascript
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
js继承的这6种方式!(上)
2019/04/23 Javascript
Python中使用glob和rmtree删除目录子目录及所有文件的例子
2014/11/21 Python
用Python实现一个简单的能够上传下载的HTTP服务器
2015/05/05 Python
Python编程实现生成特定范围内不重复多个随机数的2种方法
2017/04/14 Python
python使用正则表达式的search()函数实现指定位置搜索功能
2017/11/10 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
python复制文件到指定目录的实例
2018/04/27 Python
python五子棋游戏的设计与实现
2019/06/18 Python
解析python实现Lasso回归
2019/09/11 Python
python的scipy实现插值的示例代码
2019/11/12 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
python pandas利用fillna方法实现部分自动填充功能
2020/03/16 Python
python编写一个会算账的脚本的示例代码
2020/06/02 Python
Python爬虫与反爬虫大战
2020/07/30 Python
租租车:国际租车、美国租车、欧洲租车、特价预订国外租车(中文服务)
2018/03/28 全球购物
校长就职演讲稿
2014/01/06 职场文书
大学生职业规划范文:象牙塔生活的四年计划
2014/01/14 职场文书
网络技术专业推荐信
2014/02/20 职场文书
大专应届毕业生求职信
2014/07/15 职场文书
Django+Celery实现定时任务的示例
2021/06/23 Python
面试分析分布式架构Redis热点key大Value解决方案
2022/03/13 Redis