当前位置: 首页 > news >正文

JavaScript高阶面试题:(第三天)

目录

 

11.浅拷贝与深拷贝

12.赋值(地址传递)和浅拷贝的区别

13.构造函数 和 class的区别

14.栈内存和堆内存的区别?

 


 

11.浅拷贝与深拷贝

深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。

 

浅拷贝: 只复制指向某个对象的指针而不复制对象本身,新旧对象还是共享同一块内存。

Object.assign() 方法可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。但是 Object.assign()进行的是浅拷贝,拷贝的是对象的属性的引用,而不是对象本身。

 

深拷贝:会另外创建一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。

深拷贝的实现方式

1.JSON.parse(JSON.stringify())

原理: 用JSON.stringify将对象转成JSON字符串,再用JSON.parse()把字符串解析成对象,一去一来,新的对象产生了,而且对象会开辟新的栈,实现深拷贝。

 

2.手写递归方法

递归方法实现深度克隆原理:遍历对象、数组直到里边都是基本数据类型,然后再去复制,就是深度拷贝;

12.赋值(地址传递)和浅拷贝的区别

  • 当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
  • 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。即:默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),即只复制对象空间而不复制资源。

13.构造函数 和 class的区别

构造函数:

  1. 在 JavaScript 中,用 new 关键字来调用的函数,称为构造函数。构造函数首字母一般大写
  2. 功能类似对象模板,一个构造函数可以生成任意多个实例,实例对象具有相同的属性、行为特征,但不相等。
  3. 函数体内使用 this,引用将要生成的实例对象。
  4. 必需使用 new 命令调用函数,生成实例对象。

class类:

  1. 类不存在变量提升(hoist),
  2. 类的方法内部如果含有this,它默认指向类的实例,
  3. 类使用extends来继承,
  4. 类的数据类型就是函数,类本身就指向构造函数;使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致;

14.栈内存和堆内存的区别?

栈(stack):由编译器自动分配释放,存放函数的参数值,局部变量等;

堆(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由操作系统释放。

 

了解以下内容-不背诵

1、栈:基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。
优点:相比于堆来说存取速度会快,并且栈内存中的数据是可以共享的,例如同时声明了var a = 1和var b = 1,会先处理a,然后在栈中查找有没有值为1的地址,如果没有就开辟一个值为1的地址,然后a指向这个地址,当处理b时,因为值为1的地址已经开辟好了,所以b也会同样指向同一个地址。
缺点:相比于堆来说的缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。

2、堆:堆内存中的对象不会随方法的结束而销毁,就算方法结束了,这个对象也可能会被其他引用变量所引用(参数传递)。创建对象是为了反复利用(因为对象的创建成本通常较大),这个对象将被保存到运行时数据区(也就是堆内存)。只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

 

 

 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【HTML】元素的分类(块元素、行内元素、行内块元素)
  • WTL580-电子锁微波雷达应用解决方案,5.8GHz精准人体感知,触发高效交互新体验
  • SysML图例-电动牙刷
  • 多线程面试题-28问
  • keep-alive缓存不了iframe
  • 计算机网络408考研 2022
  • C++ | Leetcode C++题解之第401题二进制手表
  • ‘“node“‘ �����ڲ����ⲿ���Ҳ���ǿ����еij��� ���������ļ���
  • CSS基本布局理解(测试)——WEB开发系列38
  • 基于Qt的串口调试工具
  • 静态和动态类型语言
  • Django笔记一:搭建Django环境与URL路径访问
  • mysql组合键唯一
  • Unreal游戏初始化流程
  • 将 Parallels Desktop(PD虚拟机)安装在移动硬盘上,有影响吗?
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 07.Android之多媒体问题
  • 4个实用的微服务测试策略
  • Android开发 - 掌握ConstraintLayout(四)创建基本约束
  • ES2017异步函数现已正式可用
  • hadoop集群管理系统搭建规划说明
  • iOS | NSProxy
  • JavaScript设计模式之工厂模式
  • leetcode388. Longest Absolute File Path
  • nodejs调试方法
  • python_bomb----数据类型总结
  • 记一次用 NodeJs 实现模拟登录的思路
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • nb
  • 阿里云ACE认证学习知识点梳理
  • 函数计算新功能-----支持C#函数
  • 好程序员大数据教程Hadoop全分布安装(非HA)
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (二) 初入MySQL 【数据库管理】
  • (二十三)Flask之高频面试点
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (论文阅读11/100)Fast R-CNN
  • (七)Java对象在Hibernate持久化层的状态
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)硬件制作--从零开始自制linux掌上电脑(F1C200S) <嵌入式项目>
  • (已解决)什么是vue导航守卫
  • (原創) 博客園正式支援VHDL語法著色功能 (SOC) (VHDL)
  • (转)使用VMware vSphere标准交换机设置网络连接
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Framework 3.5安装教程
  • .net FrameWork简介,数组,枚举
  • .net打印*三角形
  • :中兴通讯为何成功
  • @ModelAttribute注解使用
  • @Slf4j idea标红Cannot resolve symbol ‘log‘
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...