发表于: 2020-06-11 20:43:08
1 2230
一,今天的任务,
1学习了一下深拷贝与浅拷贝
用js处理数据的时候经常遇到需要保留原数据的情况,
有时把数据赋给新的变量并不能解决问题, 原因是
内存中仅保留一份数据。 这时候需要制作一份数据的
副本。 只有复杂类型变量(引用类型)存在深拷贝与
浅拷贝的问题,而基本类型没有深拷贝的概念。
要弄明白拷贝,首先要明白js中对象的组成。在js中一
切实例皆是对象, 具体分为原始类型和合成类型。原始
类型对象指的是number、string、boolean等, 合成
类型对象指的是array、object以及function。
1浅拷贝
浅拷贝可以理解为就是复制一份来引用,所有引用对象都
指向一份数据, 并且都可以修改这份数据。 对于字符串类
型,浅拷贝是对值的拷贝, 对于对象来说,浅拷贝是对对
象地址的拷贝,也就是复制 的结果是两个对象指向同一个
内存地址,修改其中一个对象的属性, 则另一个对象的属
性也会改变
学习了一下Object.assign()
Object.assign进行的拷贝是浅拷贝。也就是说,如果拷贝过
来的属性的值是对象等复合属性,那么只能拷贝过来一个引用
Object.assign进行合并的时候,一旦碰到同名属性,就会出
现覆盖现象。所以使用时务必小心Object.assign是针对Object
开发的API,一旦在源对象的参数未知接收到了其他类型的参数
,会尝试类型转换。如果是数组类型的话,类型转换的结果是将
每个数组成员的值作为属性键值,将数组成员在数组中的位置作为
属性键名。多个数组组成参数一同传入的话还会造成覆盖
2深拷贝
深拷贝则是复制变量值,对于非基本类型的变量,则递归至
基本类型变量后, 再复制。 深复制不同于浅复制,它会开辟
新的内存地址,两个对象对应两个 不同的地址,修改 一个对
象的属性,不会改变另一个对象的属性
深拷贝方法 JSON.parse()JSON.stringify()
JSON.parse(JSON.stringify(obj)实现数组的深拷贝
利用JSON.stringify 将js对象序列化(JSON字符串),
再使用JSON.parse来反序列化(还原)js对象
JSON.parse(JSON.stringify(obj))
我们一般用来深拷贝,
其过程说白了 就是利用JSON.stringify 将js对象序列化
(JSON字符串),再使用JSON.parse来反序列化(还原)
js对象;序列化的作用是存储(对象本身存储的只是一个地址
映射,如果断电,对象将不复存在,因此需将对象的内容转换
成字符串的形式再保存在磁盘上 )和传输(
例如 如果请求的Content-Type
是 application/x-www-form-urlencoded
,
则前端这边需要使用qs.stringify(data)
来序列化参数
再传给后端,否则后端接受不到。
评论