如题

像浅拷贝、深拷贝这类的知识点我们应该都明白是怎么回事,大部分都是在面试的时候会被问到。大多让你实现一个深拷贝。现实中我们都用比较暴力直接的手段 JSON stringify.

一句话就搞定,管他性能不性能的。不过写了这么多代码,深拷贝用的确实不怎么多。反而浅拷贝用的比较多,尤其是 Object.assign 被大量使用。

当然我并不是想分享他的实现远离。而是想说下我突然感觉到浅拷贝有个亮点。

不知道大家有没有听过,共享结构这个词。

意思是一个新的对象的结构和旧对象的结构一至,是从原始对象直接复制过来的。当然不是说直接负值的,而是使用上面的Object.assign 实现的。

其结果是产生一个新对象。

浅拷贝的作用在于对于简单类型可以直接复制其值,对于复杂类型 复制的是一个对象具柄,也就是两个对象指向的是同一块内存区域。

好了,通过这种方式产生的两对象,有什么用呢?  我们可以很方便的检测到 新旧两个对象的差异,也就是哪个key的值不同,可以通过一层便利就可以对比出来。

这个时候可以脑补下画面,声明一个对象 aaa,里面包含 两个key ,一个是title 表示标题,一个是list 表示列表 一个数组 【1,2,3】,然后使用Object.assign,进行浅拷贝一个新对象。

新对象和原对象做比较 即便是两个对象的内容没有做任何改变,但是两对象是完全不等的。因为是生成了一个新对象。但是当我们比较下两个对象的list的时候,是完全相等的。

第二部。再使用 Object.assign 对愿对象进行生成一个新对象,这个时候 我们增加第三个参数,是一个对象 ,key 是list  【1,2】。

好,得到结果  比较两个对象的list,是完全不等的。因为指向了不同的饮用地址。不知道我们上面这么描述是否清洗,大家脑补的怎样了。

脑补成功了吗,是不是觉得这个特性很6,那么我们自己就可以写一个获取新旧对象的差异方法了。返回差异的key的列表。是吧?

另外说下 脑补,

学技术脑补还是很重要的。没有电脑的时候就要靠脑子进行预演。

应用场景

那这个特性的应用场景有哪些呢?这个我也说不好,大家可以自己想下自己曾做过的项目。  我这里能想到的场景有2个

1. 比如我们要一个小程序的查询列表页面,这个页面包含很多的条件。有的在当前页面,有的需要跳转页面设置条件,这个时候就需要在回到页面后进行判断条件是否有变化,有变化就重新请求数据渲染页面。

2. 我想到了redux里的reducer这个纯函数,reducer获得state和action两个对象,不管state有无变化都会返回一个新对象。这里使用的就是这个特性。

共享结构实现的方法

1.上面说的 object.assgin

2. 扩展运算符

3. 如果大家知道的话可以告诉哈

总结下:

本节就是介绍了下浅拷贝的妙用,以及提到的一个名字 “共享结构”,以及他的使用场景。当然这种主要是对简单对象,层级也就2层把。层级太多的话复杂度就增加了。具体是否能适用就看具体的场景了。

家里电脑卡,错别字较多,还有代码回头补上。

以上也可以在 喜马拉雅 上 订阅 “大前端开发解惑” 进行收听

js 浅拷贝有大用的更多相关文章

  1. 关于js浅拷贝与深拷贝的理解

    前端开发中,一般情况下,很少会去在意深拷贝与浅拷贝的关系. 大家知道,js变量有2种数据类型:基本类型和引用类型.基本类型的拷贝是将整个值完全拷贝一份的,也就是深拷贝.就是开辟了新的堆内存.所以基本类 ...

  2. 关于JS浅拷贝和深拷贝

    在 JS 中有一些基本类型像是Number.String.Boolean,而对象就是像这样的东西{ name: 'Larry', skill: 'Node.js' },对象跟基本类型最大的不同就在于他 ...

  3. JS - 浅拷贝与深拷贝的理解以及简单实现方法

    前几天撸项目代码时, 由一个技术点间接牵扯出了这东西. 所以就来总结一下. 深拷贝 拷贝对象每个层级的属性. 作用的对象是 js中引用类型的对象,基本类型没有涉及. 本质上将引用类型的对象在堆上重新开 ...

  4. 理解js浅拷贝和深拷贝

    理解深拷贝和浅拷贝之前先了解下js中的基本类型和引用类型 1.基本类型: 在js中,数据的基本类型undefined,null,string,number,boolean,在变量中赋的实际值,基本类型 ...

  5. js浅拷贝(地址引用)和深拷贝(克隆)

    浅拷贝和深拷贝相对于引用类型而言的. js有两大类型值类型(基本数据类型)和引用类型(object,function,array): 值类型保存在栈上,引用类型保存在堆上. 浅拷贝只是单纯的拷贝对象的 ...

  6. js 浅拷贝和深拷贝

    传值与传址 了解了基本数据类型与引用类型的区别之后,我们就应该能明白传值与传址的区别了.在我们进行赋值操作的时候,基本数据类型的赋值(=)是在内存中新开辟一段栈内存,然后再把再将值赋值到新的栈中.例如 ...

  7. 老生常谈之js深拷贝与浅拷贝

    前言 经常会在一些网站或博客看到"深克隆","浅克隆"这两个名词,其实这个很好理解,今天我们就在这里分析一下js深拷贝和浅拷贝. 浅拷贝 我们先以一个例子来说明 ...

  8. 开发过程中遇到的js知识点总结,面试题等,持续更新

     1.Object.freeze() 方法用于冻结一个对象,即将对象设置为不可扩展.将对象的所有自有的属性和方法(包括Symbol值的属性和方法)配置为不可配置,不可写. Object.freeze( ...

  9. 深入理解jQuery框架-框架结构

    这是本人结合资料视频总结出来的jQuery大体框架结构,如果大家都熟悉了之后,相信你们也会写出看似高档的js框架: jquery框架的总体结构 (function(w, undefined){ //定 ...

随机推荐

  1. APP的功能分类及打包与发布的分类方式

    智能手机的出现改变了我们的生活,同时各种各样的APP充斥在我们的手机当中.那么我先现在在来熟悉一下APP的分类及其用途:工具类.社交类.信息类.娱乐类.生活类等几大类.我么了解了APP的用途分类,那么 ...

  2. linux下VI模式中上下左右键和回退键出现字母

    1.编辑/etc/vim/vimrc.tiny 由于/etc/vim/vimrc.tiny的拥有者是root用户,所以要在root的权限下对这个文件进行修改.很简单,这个文件里面的倒数第二句话是“se ...

  3. 转 功能强大的shell:if条件语句

    原文 http://blog.zol.com.cn/2322/article_2321767.html 功能强大的shell:if条件语句 if语句测试条件,测试条件返回真(0)或假(1)后,可相应执 ...

  4. css3 appearance在iphone上面的问题

    最近在做项目的时候,发现iphone上中 <input type="button">在修改了css样式之后还是保留自带的一些属性,然后在安卓手机上不会出现这样的问题, ...

  5. hadoop包含哪些技术?

    1.Hadoop包含哪些技术?Common, Avro, MapReduce, HDFS, Pig, Hive, Hbase, ZooKeeper, Sqoop, Oozie. 2.简介Common: ...

  6. lighttpd 与 gitweb 搭建服务器

    搭建 Git 仓库服务器 下载 gitweb 如果是用 debian 系的 Linux 发行版,可以使用 apt 下载安装可执行的 gitweb sudo apt-get install gitweb ...

  7. java启动线程时 extends与implements的一个差异

    java extends与implements在使用时的一个差异: Implements: public class ThreadImplementsTest implements Runnable{ ...

  8. 三年从前端小工到架构-知乎 Live 学习整理

    最近在知乎上学习了vczero (王利华,簋谣)的知乎Live「三年从前端小工到架构」,感觉受益匪浅,现将本次Live学习笔记记录如下. 本次 Live 主要包括以下内容   • 0-3 年的前端工程 ...

  9. 朝圣Java(问题集锦)之:The Apache Tomcat installation at this directory is version 8.5.32. A Tomcat 8.0 inst

    最近开始学Java了.有C#底子,但是学起来Java还是很吃力,感觉别人架好了各种包,自己只要调用就行了,结果还有各种bug出现.掩面中. 启动Tomcat的时候,报错The Apache Tomca ...

  10. 使用OpenSSL(Windows x64版)将pem格式证书转换为p12格式

    今天同事遇到一个问题,他获得的证书只有pem格式,而服务器要求提交p12格式,一时搞不定,来找我帮忙. 我之前也从未接触过证书类型的转换,所以上网大致搜索了一下,又亲自动手试了试,现将有关心得经验记录 ...