首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

JavaScript中的浅拷贝与深拷贝

JS中有两种数据类型,值类型和引用类型,当我们需要把一个变量赋给另一个变量时,对于值类型很简单: let a = 1; let b = a; b = 10; console.log(a, b); //...newObj的属性时,原对象的属性并没有受影响,但是如果我们改变newObj.friend呢?...的属性的时候,原对象的newObj.friend的属性也改变了,这是因为target.friend本身也是一个对象,我们拷贝的时候只拷贝了他的引用地址,所以我们通过newObj操作他的时候也改变了原来的...[] : {}; // 用 Reflect.ownKeys可以获取Symbol属性,用for...of来循环数组 for(let key of Reflect.ownKeys(obj)) {...,如果是老浏览器不支持WeakMap,我们可以用两个数组来模拟,一个数组存键,一个数组存值,每次都只在两个数组末尾新增值,这样键和值在数组中的索引就是一样的,我们可以通过这个索引来进行键和值的匹配。

73761
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    HashMap的工作原理

    当我们给put()方法传递键和值时,我们先对键调用 hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。 我们可以使用CocurrentHashMap来代替Hashtable吗?...当我们将键值对传递给put()方法时,它调用键对象 的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。...当获取对象时,通过键对象的equals()方法找到正确的 键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

    55810

    HashMap的工作原理

    当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。     我们可以使用CocurrentHashMap来代替Hashtable吗?...当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。...当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

    60630

    HashMap的工作原理

    当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。 我们可以使用CocurrentHashMap来代替Hashtable吗?...当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。...当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

    77780

    HashMap的工作原理

    当我们给put()方法传递键和值时,我们先对键调用 hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。 我们可以使用CocurrentHashMap来代替Hashtable吗?...当我们将键值对传递给put()方法时,它调用键对象 的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。...当获取对象时,通过键对象的equals()方法找到正确的 键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。

    44420

    经常被问到的有深度有内涵的数据结构面试题

    3.它们都是通过数组实现的,本质上都是动态数组。 4.它们的默认数组容量是10。 5.它们都支持Iterator和listIterator遍历。...当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...这个时候,你可以质问面试官,为什么这么奇怪,要在多线程的环境下使用HashMap呢?:) 为什么String、 Interger这样的wrapper类适合作为键?...如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。 我们可以使用CocurrentHashMap来代替Hashtable吗?

    95290

    JAVA中hashMap原理解析

    注意:当链表长度超过阈值(默认为8)时,链表会转换为红黑树,以减少搜索时间为什么使用数组+链表?使用数组+链表来存储hashMap最主要的原因是解决哈希冲突问题。...通过数组的时效及链表的空间完成hashmap在时间和空间上的平衡。...处理哈希冲突我们知道,一个键增加到hashmap中时,会先使用hash算法进行计算应该会存在数组的哪个索引上,当两个或多个键计算出来的索引是一致时,这时候就会存在数据冲突的问题了。...1、如果未初始化数组,则 直接初始化扩容2、通过 hash 算法,计算出对应key 所在的数组 如果所在数组为null, 则 newNode()如果不为null,说明是链表:2.1 获取索引上的链表,判断...目的是为了保持哈希表的扩展性,同时减少哈希冲突的概率。所有现有的键值对都需要重新计算在新数组中的位置,并重新插入到新数组中。这是因为数组的容量变了,哈希值的计算方式也会相应改变(通常是通过取模运算)。

    7911

    Go语言核心36讲(Go语言进阶技术三)--学习笔记

    我们也沿用这个看起来更加清晰的词来讲解。 知识前导:为什么字典的键类型会受到约束?...如果要探究限制的原因,我们就先要了解哈希表中最重要的一个过程:映射。 你可以把键理解为元素的一个索引,我们可以在哈希表中通过键查找与它成对的那个元素。...键和元素的这种对应关系,在数学里就被称为“映射”,这也是“map”这个词的本意,哈希表的映射过程就存在于对键 - 元素对的增、删、改、查的操作之中。...那么在这些值支持判等的类型当中,哪些更适合作为字典的键类型呢? 这里先抛开我们使用字典时的上下文,只从性能的角度看。...由于字典是引用类型,所以当我们仅声明而不初始化一个字典类型的变量的时候,它的值会是nil。 在这样一个变量上试图通过键值获取对应的元素值,或者添加键 - 元素对,会成功吗?

    74901

    剖析面试最常见问题之Java集合框架(1)

    、可重复的,每个键最多映射到一个值。...主要根据集合的特点来选用,比如我们需要根据键值获取到元素值时就选用 Map 接口下的集合,需要排序时选择 TreeMap,不需要排序时就选择 HashMap,需要保证线程安全就选用 ConcurrentHashMap...当我们只需要存放元素值时,就选择实现Collection 接口的集合,需要保证元素唯一时选择实现 Set 接口的集合比如 TreeSet 或 HashSet,不需要就选择实现 List 接口的比如 ArrayList...为什么要使用集合?...数组的缺点是一旦声明之后,长度就不可变了;同时,声明数组时的数据类型也决定了该数组存储的数据的类型;而且,数组存储的数据是有序的、可重复的,特点单一。

    51740

    面试必备:HashMap、Hashtable、ConcurrentHashMap的原理与区别

    当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到bucket位置来存储值对象。...当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞时,对象将会储存在链表的下一个节点中。...当两个不同的键对象的hashcode相同时,它们会储存在同一个bucket位置的链表中,可通过键对象的equals()方法来找到键值对。...相同点: 底层数组 + 链表实现 都可以用来存储 key-value 的数据 区别: HashTable 无论key还是value都不能为null,线程安全 HashMap 可以存储null键和null...使用 ConcurrentHashMap,其底层采用分段的数组+链表实现,线程安全,通过把 Map 分为 N 个 Segment(部分),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

    83410

    hashmap的实现原理面试_jvm面试题总结及答案

    当我们将键值对传递给put()方法时,它调用键对象的hashCode()方法来计算hashcode,让后找到bucket位置来储存值对象。...当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回值对象。HashMap使用链表来解决碰撞问题,当发生碰撞了,对象将会储存在链表的下一个节点中。...当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。”...面试者会回答:当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,然后获取值对象。...如果这个自定义对象时不可变的,那么它已经满足了作为键的条件,因为当它创建之后就已经不能改变了。 我们可以使用CocurrentHashMap来代替Hashtable吗?

    48010

    【实战】我是如何在输入框实现@ At功能的

    ) 当前需求的拆解 按住shift + @ 的时候,弹出通知列表 选择时 @的用户标签插入当前的光标位置中 生成@的用户标签的规则是:高亮、携带用户ID、一键删除信息、不可以编辑。...(不要问我为什么知道这个问题!!!)。 wangeditor的配置只支持固定高度,如果我们想支持文本框最小高度、文字随内容到最大高度xx时自适应滑动怎么做呢? 通过$event 可以获取键盘的keyCode 达到监听的目的 e.preventDefault 可以阻止我输入的@字符的默认事件 getSelection 可以获取光标的位置、给插入标签一个坐标。...Event.returnValue 兼容IE取消默认事件 到现在我们的核心功能已经完成了。通过@人的监听事件,通过我们自定义的标签插入,通过getSelection获取到的光标位置。...现在采取的方案是通过解析富文本内容生成评论数组列表。 通过各端解析数组列表、生成富文本... 兼容换行字符...

    2.7K20

    Java之集合初探(一)

    一、集合概述、区别 集合是一种容器,数组也是一种容器 在Java编程中,装各种各样的对象(引用类型)的叫做容器。 为什么出现集合类?...)     *ArrayList(基于数组)---(改慢,查快)   Set---(没有顺序, 不可以重复)     *HashSet(基于hash码表)(必须重写hashCode()方法)...Map没有继承于Collection接口 从Map集合中检索元素时,只要给出键对象,就会返回对应的值对象。  Map的执行效率相对低下。 ...Map包含: Map : 维护“键值对”的关联性,使你可以通过“键”查找“值” HashMap:Map基于散列表的实现。插入和查询“键值对”的开销是固定的。...而在迭代访问时发而更快,因为它使用链表维护内部次序。  TreeMap : 基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。

    97270

    【实用调试技巧】总是找不到Bug?手把手教你在vs2022中调试程序

    VS中常用的快捷键大全 3.调试时查看程序相关信息 查看临时变量的值 查看单一变量 当我们需要观察临时变量的值时,可以先按下F10/F11进入调试,然后在调试中选择:调试-窗口-监视-监视1,就可以打开监视窗口了...然后在监视窗口输入想观察的变量,敲下回车就可以观察这个变量了. 查看数组成员 当我们需要观察数组中的成员时,可以输入"数组名,大小",然后点击旁边的小三角就可以一次性查看全部的数组成员了....查看结构体成员 当我们需要观察结构体中的成员时,可以输入结构体名,然后点击旁边的小三角就可以一次性查看全部的结构体成员了. 查看内存信息 在调试开始之后(按下F10/F11)后,用于观察内存信息....通过调用堆栈,可以清晰的反应函数的调用关系以及当前调用所处的位置....在调试中我希望大家可以搞清楚:为什么会这样?哪一步出了问题?如何解决?

    31810

    java集合概念_java多线程

    请注意,使用具有相同hashCode()的多个键肯定会降低任何哈希表的性能。为了改善影响,当键是可比较的时,这个类可以使用键之间的比较顺序来帮助打破联系。 请注意,此实现不是同步的。...简而言之,哈希表就是一种结合数组与链表的一种数据结构,借助哈希算法快速获取元素下标以实现高效查找。...当我们存储一个键值对的时候,会通过哈希算法获得key对应的哈希值,通过哈希值去找到在桶中要存放的位置的下标,而有时候不同的key会计算出相同的哈希值,也就是哈希碰撞,那么节点就会接在第一个节点的身后形成一条链表...2.计算桶容器下标 桶容器下标通过三个步骤来计算:获取哈希值,异或运算混合高低位得到新哈希,新哈希和长度与运算获取下标。...我们知道,如果桶数组扩容了,那么数组长度也就变了,那么put和get的时候根据长度与哈希进行与运算的时候计算出来的下标就不一样。

    30320

    Java 集合框架体系总览

    为什么要使用集合 当我们在学习一个东西的时候,最好是明白为什么要使用这个东西,不要为了用而用,知其然而知其所以然。...2)数组拥有 length 属性,可以通过这个属性查到数组的存储能力也就是数组的长度,但是无法通过一个属性直接获取到数组中实际存储的元素数量。...比如我们在数组下标为 2 的位置存入了某个学生的学号 111,那显然,直接通过下标 2 就能获取学号 111。但是「如果反过来我们想要查找学号 111 的下标呢」?...List)和不可以通过整数索引(Set) 这样当我们声明单列集合时能够更准确的继承相应的接口。...JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树,以减少搜索时间(注意:将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容

    1.5K21

    哈希表

    可以说,如果没有数组,就没有哈希表。 哈希表通过散列函数把元素的键值映射为下标,然后将数据存储在数组中对应下标的位置。...更确切地说, 当我们插入一个新的键时,哈希函数将决定该键应该分配到哪个桶中,并将该键存储在相应的桶中; 当我们想要搜索一个键时,哈希表将使用相同的哈希函数来查找对应的桶,并只在特定的桶中进行搜索。...针对数组的扩容,数据搬移操作比较简单。但是,针对哈希表的扩容,数据搬移操作要复杂很多。因为哈希表的大小变了,数据的存储位置也变了,所以我们需要通过散列函数重新计算每个数据的存储位置。...对于使用线性探测法解决冲突的哈希表,删除操作稍微有些特别。我们不能单纯地把要删除的元素设置为空。这是为什么呢?...当查找、删除一个元素时,我们同样通过散列函数计算出对应的槽,然后遍历链表查找或者删除。那查找或删除操作的时间复杂度是多少呢?

    1.1K20

    HashMap 实现及原理

    当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,计算并返回的hashCode是用于找到Map数组的bucket位置来储存Node 对象。...当我们调用get()方法,HashMap会使用键对象的hashcode找到bucket位置,找到bucket位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象。...不可变性使得能够缓存不同键的hashcode,这将提高整个获取对象的速度,使用String,Interger这样的wrapper类作为键是非常好的选择。...为什么String, Interger这样的wrapper类适合作为键?因为String是final的,而且已经重写了equals()和hashCode()方法了。...不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。

    88120

    Knowledge_SPA——精研查找算法

    修改config.xml中的类名为当前实现类,客户端代码不用改,可以直接执行测试结果。 关于数据结构: 我们发现上面的架构代码中并未出现具体的实现符号表的数据结构,例如数组、链表等。...代码阶段: 经过上面的分析,我们发现代码阶段的第一个难点其实在于动态调整数组大小,我们都知道数组的大小在创建时就被限定,无法改变其大小,这也是为什么实际工作中我们愿意使用List来替代数组的原因之一。...如果要测试有序表二分查找BinarySearchST的符号表基础API方法,依然先改config,然后在testST方法上执行。...通过这些内容,毋庸置疑的是,在实现基于拉链法的散列表时,我们的目标是选择适当的数组大小M,既不会因为空链表而浪费大量内存,也不会因为链表太长而在查找上浪费太多时间。...探测:查找到数组结尾时折回数组开头继续查找,直到遇到空键或者找到该键为止。这种操作被称为探测。与比较些许不同之处在于探测有时只是在测试键是否为空。

    2.3K50
    领券