详解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 相关文章推荐
js版本A*寻路算法
Dec 22 Javascript
基于jquery的关于动态创建DOM元素的问题
Dec 24 Javascript
关于JS管理作用域的问题
Apr 10 Javascript
javascript中使用new与不使用实例化对象的区别
Jun 22 Javascript
jQuery学习笔记之Ajax用法实例详解
Dec 01 Javascript
JS如何判断浏览器类型和详细区分IE各版本浏览器
Mar 04 Javascript
ES6解构赋值的功能与用途实例分析
Oct 31 Javascript
layer插件select选中默认值的方法
Aug 14 Javascript
微信小程序一周时间表功能实现
Oct 17 Javascript
vue之组件内监控$store中定义变量的变化详解
Nov 08 Javascript
Vue.js watch监视属性知识点总结
Nov 11 Javascript
封装Vue Element的table表格组件的示例详解
Aug 19 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 5.0对象模型深度探索之属性和方法
2008/03/27 PHP
PHP垃圾回收机制简单说明
2010/07/22 PHP
PHP中的多行字符串传递给JavaScript的两种方法
2014/06/19 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
2015/08/28 PHP
Aster vs Newbee BO3 第三场2.18
2021/03/10 DOTA
Javascript实现的分页函数
2007/02/07 Javascript
jquery 1.3.2 IE8中的一点点的小问题解决方法
2009/07/10 Javascript
用jquery ajax获取网站Alexa排名的代码
2009/12/12 Javascript
jquery中使用$(#form).submit()重写提交表单无效原因分析及解决
2013/03/25 Javascript
Knockout text绑定DOM的使用方法
2013/11/15 Javascript
js清理Word格式示例代码
2014/02/13 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
2014/05/08 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
nodejs 图片预览和上传的示例代码
2017/09/30 NodeJs
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
js实现移动端吸顶效果
2020/01/08 Javascript
Python cookbook(字符串与文本)在字符串的开头或结尾处进行文本匹配操作
2018/04/20 Python
django 修改server端口号的方法
2018/05/14 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
Python partial函数原理及用法解析
2019/12/11 Python
TensorFlow实现保存训练模型为pd文件并恢复
2020/02/06 Python
python如何遍历指定路径下所有文件(按按照时间区间检索)
2020/09/14 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
css3的动画特效之动画序列(animation)
2017/12/22 HTML / CSS
Why we need EJB
2016/10/20 面试题
团支书的期末学习总结自我评价
2013/11/01 职场文书
学生喝酒检讨书
2014/02/06 职场文书
企业标语口号
2014/06/10 职场文书
战略性融资合作协议书范本
2014/10/17 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
精神文明建设先进个人事迹材料
2014/12/24 职场文书
导游欢送词
2015/01/31 职场文书
Nginx设置日志打印post请求参数的方法
2021/03/31 Servers
Pandas实现批量拆分与合并Excel的示例代码
2022/05/30 Python