问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

javascript什么是序列化

发布网友 发布时间:2022-04-26 20:42

我来回答

1个回答

热心网友 时间:2022-04-22 12:27

一.什么是对象序列化?

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

序列化(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对象。它们使用起来也很简单:

可以看到,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()只能序列化对象的可枚举的自有属性;

从上面的例子也可以看到,在符合以上规则的情况下,还可以通过对象序列化和反序列化完成对象的深拷贝(什么是对象的深拷贝?可以去看:https://www.hu.com/question/23031215,邹润阳的答案)。

以上就是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。这里,大家也可以参考Douglas Crockford为 ES3 环境使用JSON写的json2:https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L427。看看JSON.stringify和str的实现应该就明白我这里所说的这两个参数的具体含义了;

③如果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时带有两个参数,第一个参数是属性名——对象的属性名或转换成字符串的数组序号,第二个参数是对象属性或数组元素的原始值(如果对于这里说的两个参数有疑惑,还是可以参考:https://github.com/douglascrockford/JSON-js/blob/master/json2.js#L460)。并且,reviver函数的返回值将作为JSON.parse()的返回值;

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
招商银行的美元天添金怎么样? 天添美蒸馒头为什么开裂呢 上海食堂送菜 邮政跨地区取款手续费多? 谁能告诉我邮政储蓄卡跨省取钱要不要收费啊? 自贡市龙盛世纪仿真模型制造有限公司公司简介 学PS真的很难吗 红烧萝卜牛筋 微信怎么转发公众号部分内容 转发公众号部分内容方法 微信公众号内的视频如何下载?一个F12搞定 求JS解析 Date.parse()的问题(js) js解析json数据 JS解析json数据(如何将json字符串转化为数 如何用JS解析HTML字符串 js解析与序列化json数据(一)json.stringify()的基本用法 js怎么解析json格式字符串 求问getTime()和parse()的区别 JS使用JSON.parse(),JSON.stringify()实现对对象的深拷贝功能分析_百度... 物联卡和手机卡的区别是什么? 智能手机的网络连接如何发现和关闭 侠盗飞车罪恶都市的所有换衣服的地方在哪? 侠盗猎车手罪恶都市里摩托车任务中一塌糊涂怎么完成? 求侠盗猎车罪恶都市车子详细出现地点(要附图) 如何对idc机房实现智能管控? 谁是做IDC机房监控的啊,告诉我一下IDC机房监控人员都做些什么,都需要些什么只是啊,谢谢啦! 侠盗猎车手罪恶都市所有任务做完了该干什么? 如何正确使用idc数据中心动环监控系统 gta中的《侠盗猎车手:罪恶都市》基本剧情是什么? 如何监视我托管在IDC的服务器的网络流量 js如何解析后台传过来的json字符串 js中eval和$parseJSON的区别和联系以及JSON.stringify js咋样把一个字符串解析成double 刷机包下载了以后怎么用? 手机刷机需要在电脑里安装什么软件 刷机之后手机耗电特别快怎么办 连着电脑的手机想刷机,怎么在电脑上下载刷机包,或者一键刷机啊?下载哪个有用啊,手机开不开机,连着电 手机怎么刷机 刷机需要下载什么 手机怎样下载刷机软件 手机刷机要下载哪些软件 手机刷机是不是把刷机软件下载到手机上,然后用手机刷,知道的告诉下我啊 刷机后,怎么下软件安装? 苹果5控制中心的图标可以用,就是看不见怎么办 一键刷机软件刷机为什么要取下电池 刷机后耗电快 浴缸龙头高度一般多高 卫生间的浴缸龙头一般预留多高? 浴缸水龙头高度的选择 浴缸水龙头安装的注意事项 浴缸用水龙头安装什么高度合适?有什么分类? 浴缸安装高度一般为多少