web前端面试-- js深拷贝的一些bug,特殊对象属性(RegExp,Date,Error,Symbol,Function)处理,循环引用weekmap处理

本人是一个web前端开发工程师,主要是vue框架,整理了一些面试题,今后也会一直更新,有好题目的同学欢迎评论区分享 ;-)

web面试题专栏:点击此处


文章目录

  • 深拷贝和浅拷贝的区别
    • 浅拷贝示例
    • 深拷贝示例
  • 特殊对象属性
    • obj对象
    • JSON转换对象
      • obj与JSON转换对象对比
    • 手写深拷贝
      • 封装好deepCopy
      • obj与deepCopy转换对象对比

深拷贝和浅拷贝的区别

在JavaScript中,深拷贝和浅拷贝是两种不同的对象复制方式。

浅拷贝是指将一个对象的引用复制给另一个对象,这意味着两个对象将共享相同的内存地址。当修改其中一个对象时,另一个对象也会受到影响。

深拷贝是指创建一个新的对象,并将原始对象的所有属性逐个复制到新对象中。这意味着两个对象是完全独立的,修改其中一个对象不会影响另一个对象。

浅拷贝示例

let obj1 = { name: "Alice", age: 25 };
let obj2 = obj1; // 浅拷贝obj2.name = "Bob";console.log(obj1.name); // 输出: Bob,因为obj1和obj2共享相同的引用

深拷贝示例

let obj1 = { name: "Alice", age: 25 };
let obj2 = JSON.parse(JSON.stringify(obj1)); // 深拷贝obj2.name = "Bob";console.log(obj1.name); // 输出: Alice,因为obj1和obj2是完全独立的对象

在上面的深拷贝示例中,我们使用 JSON.stringify() 将原始对象转换为字符串,然后使用 JSON.parse() 将字符串转换回对象。这样做可以创建一个新的对象,并将原始对象的属性逐个复制到新对象中,从而实现深拷贝。

需要注意的是,深拷贝有时可能会有性能和内存消耗的问题,尤其是对于包含循环引用或大量嵌套对象的复杂对象。因此,在选择深拷贝或浅拷贝时,需要根据具体情况进行权衡。


特殊对象属性

  • RegExp:不能拷贝
  • Date:时间对象会转换成字符串
  • Error:错误对象会转换成{}
  • Symbol:不能拷贝
  • Function:不能拷贝

测试对象如下:

var obj = {name: "penk",age: 30,boo: true,n: null,un: undefined,sy: Symbol("penk value"),// big: 10n, // 浏览器没这个,nodejs可以child: {name: "penk son",},arr: [1, 2, 3, 4],reg: /^\d+$/,fn: function () {console.log(this.name);},time: new Date(),err: new Error("蛋疼"),
};
JSON.parse(JSON.stringify(obj));

obj对象

在这里插入图片描述

JSON转换对象

虽说是深拷贝,但是有些属性不行。

在这里插入图片描述

obj与JSON转换对象对比

在这里插入图片描述

手写深拷贝

封装好deepCopy

  1. 处理了特殊对象属性的拷贝
  2. 对于循环引用,进行了(WeekMap)去重处理。
// 深拷贝函数
// 避免对象中存在重复应用的优化方案
// 通过set集合的方式,obj不同才会进行操作
function deepCopy(obj, treated = new WeakMap()) {// null 也是一个对象...// 不是对象就返回,数组也是对象~if (obj == null || typeof obj !== "object") return obj;// 对象的类型// console.log =>  '[object Object]'  '[object Array]'let string = Object.prototype.toString.call(obj);// 对象的构造函数let ctor = obj.constructor;// 如果有这个obj这个键名,则直接返回键值if (treated.has(obj)) return treated.get(obj);let newObj = {};// 是个复合数据类型,放的是地址treated.set(obj, newObj);if (string.includes("Object")) {// for of 不能遍历普通对象,只能遍历iterator 对象for (let i in obj) {newObj[i] = deepCopy(obj[i], treated);}return newObj;} else if (string.includes("Array")) {// 是数组for (let i = 0; i < obj.length; i++) {newObj[i] = deepCopy(obj[i], treated);}} else if (string.includes("RegExp")) {// 是正则对象newObj = new ctor(obj);} else if (string.includes("Date")) {// 是日期对象newObj = new ctor(obj);} else if (string.includes("Error")) {// 是Error对象newObj = new ctor(obj.message);} else if (string.includes("Symbol")) {// 是Symbol对象newObj = new ctor(obj.description);} else if (string.includes("Function")) {// 是方法newObj = function (...arg) {target.call(this, ...arg);};}return newObj;
}

打印如下:

在这里插入图片描述

obj与deepCopy转换对象对比

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/157214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安全的Sui Move是Web3大规模采用之路的基石

没有信任&#xff0c;就没有Web3的大规模采用。还有其他重要障碍阻碍了首个十亿用户的到来&#xff0c;包括令人困惑的用户体验、复杂的身份验证模式以及不确定的监管体系&#xff0c;但所有障碍中&#xff0c;要数大多数人对区块链技术持怀疑和不信任态度最严重。 对于许多人…

分布式文件服务器——Windows环境MinIO的三种部署模式

上节简单聊到MinIO&#xff1a;分布式文件存储服务——初识MinIO-CSDN博客&#xff0c;但没具化&#xff0c;本节开始展开在Windows环境下 MinIO的三种部署模式&#xff1a;单机单节点、单机纠删码、集群模式。 部署的几种模式简要概括 所谓单机单节点模式&#xff1a;即MinI…

12种发朋友圈黄金模板

随着朋友圈在社交媒体中的日渐重要&#xff0c;越来越多的企业开始将其作为一种有效的营销渠道。但是&#xff0c;在朋友圈中发布内容并不是一件容易的事情&#xff0c;如何创造有吸引力和互动性的内容&#xff0c;成为了所有运营人员所面临的问题。 小编将分享12种发朋友圈黄金…

【深度学习实验】卷积神经网络(八):使用深度残差神经网络ResNet完成图片多分类任务

目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集&#xff08;CIFAR10Dataset&#xff09; a. read_csv_labels&#xff08;&#xff09; b. CIFAR10Dataset 2. 构建模型&#xff08;FeedForward&#x…

计算机视觉(Computer Vision, CV)是什么?

什么是计算机视觉 近年来&#xff0c;计算机视觉 (Computer Vision&#xff0c;简称CV) 不断普及&#xff0c;已成为人工智能 (AI) 增长最快的领域之一。计算机视觉致力于使计算机能够识别和理解图像和视频中的物体和人。 计算机视觉应用程序使用来自传感设备、人工智能、机器…

kafka 开启认证授权

前言 1、前面自己写了一篇关于各个环境各个模式的安装的文章&#xff0c;大家可以去看看 kafka各种环境安装(window,linux,docker,k8s),包含KRaft模式 2、使用版本 kafka_2.13-3.4.1 3、kafka验证方式&#xff0c;有两大类如下&#xff0c;文档内容在 kafka官方文档的 第七节…

WAF绕过-信息收集之反爬虫延时代理池 46

老师用的阿里云的服务器&#xff0c;装了宝塔和安全狗&#xff0c; 演示案例 Safedog-默认拦截机制分析绕过-未开CC 没有打开防止流量攻击的安全狗&#xff0c; 而这里&#xff0c;get请求可以直接看到返回结果&#xff0c;而head就不行。 我们就给工具换成get请求 在没有c…

c++视觉处理----绘制直方图,H—S直方图,二维H—S直方图,RGB三色直方图

直方图&#xff1a;cv::calcHist() cv::calcHist() 是 OpenCV 中用于计算直方图的函数。直方图是一种用于可视化图像亮度或颜色分布的工具。这函数通常应用于灰度图像或彩色图像的各个通道。以下是 cv::calcHist() 函数的基本语法和参数&#xff1a; void cv::calcHist(const…

Docker在边缘计算中的崭露头角:探索容器技术如何驱动边缘计算的新浪潮

文章目录 第一部分&#xff1a;边缘计算和Docker容器边缘计算的定义Docker容器的崭露头角1. 可移植性2. 资源隔离3. 自动化部署和伸缩 第二部分&#xff1a;应用案例1. 边缘分析2. 工业自动化3. 远程办公 第三部分&#xff1a;挑战和解决方案1. 网络延迟2. 安全性3. 管理和部署…

树莓派部署.net core控制台程序

1、在自己的电脑上使用VS写一个Net6.0的控制台程序&#xff0c;我假设我就写个Helloworld。 发布项目 使用mobaxterm上传程序 就传三个文件就行 回到在mobaxterm中&#xff0c;进入目录输入&#xff1a;cd consolepublish,运行程序&#xff1a; dotnet ConsoleApp1.dll 输出h…

入行CSGO游戏搬砖项目前,这些问题一定要了解

最近咨询的人也不少&#xff0c;针对大家平时问到的问题&#xff0c;在这里做一个统一汇总和解答。 1、什么是国外steam游戏装备汇率差项目&#xff1f; 通俗易懂的理解就是&#xff0c;从国外steam游戏平台购买装备&#xff0c;再挂到国内网易buff平台上进行售卖。充值汇率差…

MyCat管理及监控

MyCat原理 在 MyCat 中&#xff0c;当执行一条 SQL 语句时&#xff0c; MyCat 需要进行 SQL 解析、分片分析、路由分析、读写分离分析等操作&#xff0c;最终经过一系列的分析决定将当前的SQL 语句到底路由到那几个 ( 或哪一个 ) 节点数据库&#xff0c;数据库将数据执行完毕后…

WSL+vscode配置miniob环境

1.配置WSL Windows Subsystem for Linux入门&#xff1a;安装配置图形界面中文环境vscode wu-kan 2.获取源码 找个位置Git Bash然后拉取代码 git clone https://github.com/oceanbase/miniob.git 3.安装相关依赖 https://gitee.com/liangcha-xyy/source/blob/master/how…

软件设计之工厂方法模式

工厂方法模式指定义一个创建对象的接口&#xff0c;让子类决定实例化哪一个类。 结构关系如下&#xff1a; 可以看到&#xff0c;客户端创建了两个接口&#xff0c;一个AbstractFactory&#xff0c;负责创建产品&#xff0c;一个Product&#xff0c;负责产品的实现。ConcreteF…

如何生成SSH服务器的ed25519公钥SHA256指纹

最近搭建ubuntu服务器&#xff0c;远程登录让确认指纹&#xff0c;研究一番搞懂了&#xff0c;记录一下。 1、putty 第一次登录服务器&#xff0c;出现提示&#xff1a; 让确认服务器指纹是否正确。 其中&#xff1a;箭头指向的 ed25519 :是一种非对称加密的签名方法&#xf…

【智能家居项目】裸机版本——网卡设备接入输入子系统 | 业务子系统 | 整体效果展示

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《智能家居项目》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f95e;网卡设备接入输入子系统&#x1f354;测试 &#x1f95e;业务子系统&#…

PostGIS导入shp文件报错:dbf file (.dbf) can not be opened.

一、报错 刚开始以为是SRID输入错误&#xff0c;反复尝试SRID的输入&#xff0c;还是报错&#xff01; 后来看到了这篇博客&#xff0c;解决了&#xff01;https://blog.csdn.net/Fama_Q/article/details/117381378 二、导致报错的原因 导入的shp文件路径太深&#xff0c;换…

Jackson+Feign反序列化问题排查

概述 本文记录在使用Spring Cloud微服务开发时遇到的一个反序列化问题&#xff0c;RPC/HTTP框架使用的是Feign&#xff0c;JSON序列化反序列化工具是Jackson。 问题 测试环境的ELK告警日志如下&#xff1a; - [43f42bf7] 500 Server Error for HTTP POST "/api/open/d…

洗地机哪款最好用?口碑最好的家用洗地机推荐

洗地机方便快捷的清洁方式&#xff0c;如今融入到我们的日常生活需求中来了&#xff0c;然而&#xff0c;在市面上琳琅满目的洗地机品牌中&#xff0c;究竟哪款洗地机比较好用呢&#xff1f;今天&#xff0c;笔者将向大家推荐四款口碑最好的家用洗地机&#xff0c;让你在挑选时…

Java实现防重复提交,使用自定义注解的方式

目录 1.背景 2.思路 3.实现 创建自定义注解 编写拦截器 4.使用 5.验证 6.总结 1.背景 在进行添加操作时&#xff0c;防止恶意点击&#xff0c;后端进行请求接口的防重复提交 2.思路 通过拦截器搭配自定义注解的方式进行实现&#xff0c;拦截器拦截请求&#xff0c;使…