【JavaScript】手写深度比较

腾讯前端手写面试题及答案 执行temp(5),这个函数内执行add(m+n),n是此次传进来的数值5,m值还是上一步中的7,所以add(m+n)=add(7+5)=add(12),此时m=12,并且返回temp函数。执行temp(4),这个函数内执行add(m+n),n是此次传进来的数值4,m值还是上一步中的3,所以add(m+n)=add(3+4)=add(7),此时m=7,并且返回temp函数。需要注意的是,必须通过实例化对象之后再去调用定义的方法,不然找不到该方法。,该方法可以实现浅拷贝,也可以实现一维对象的深拷贝。 阅读详情

代码如下

// 判断是否是对象或者是数组
function isObject(obj) {
  if (typeof obj == 'object' && obj !== null) {
    return true
  }
}
// 全相等
function isEqual(obj1, obj2) {
  // 如果都是值类型 直接进行比较
  if (!isObject(obj1) || !isObject(obj2)) {
    return obj1 === obj2
  }
  // 如果都是同一个对象或数组,直接比较
  if (obj1 === obj2) {
    return true
  }

  // 两个都是对象或数组,而且不相等
  // 1.先取出 obj1 和 obj2 的 keys,比较个数
  const obj1KeyArr = Object.keys(obj1)
  const obj2KeyArr = Object.keys(obj2)
  if (obj1KeyArr.length !== obj2KeyArr.length) {
    return false
  }
  // 2.以 obj1 为基准,和 obj2 依次递归比较
  for (let key in obj1) {
    const res = isEqual(obj1[key], obj2[key])
    if (!res) {
      return false
    }
  }

  // 全相等
  return true
}

测试

const obj1 = {
  a: 100,
  b: {
    x: 100,
    y: 200,
  },
}
const obj2 = {
  a: 100,
  b: {
    x: 100,
    y: 200,
  },
}
console.log(isEqual(obj1, obj2)) // true
JavaScript 数组比较完全指南:浅比较·深比较·无序比较 在 JavaScript 中,直接使用==或===比较两个数组只能判断它们是否引用同一对象,而无法按“值”比较元素内容。要想判断两个数组内容一致,必须使用值比较的方法,常见方案包括:将数组序列化后比较(手动逐项遍历比较(如for循环、everyincludes或者构建元素计数映射(frequency map)实现 O(n) 复杂度的无序比较。在大型或性能敏感场景,也可借助 Lodash 的_.isEqual进行深度比较。 阅读详情

相关推荐

JavaScript中深度比较JSON数据的技巧与实践

在JavaScript中,经常需要对数据进行比较操作,尤其当涉及到JSON数据结构时,情况就变得复杂。JSON数据通常是由嵌套的对象和数组组成的复杂结构,简单地使用等号==或全等号===可能无法准确判断两个JSON对象是否在逻辑上相等。当我们在应用程序中进行数据同步、状态更新或前后端数据校验时,正确地比较两个JSON对象是否相等就显得尤为重要。在JavaScript中,严格相等运算符===是一个用于比较两个值是否完全相等的运算符。它不仅比较值的相等性,同时也会比较值的类型。

weixin_42613018的博客 996

JS手写判断对象是否相等

Object.is()是js内置的一个api,但是和===基本上没有区别,只是对一些特殊情况做出了特殊处理,所以并不能用来比较两个对象是否相等。所以必须得手写一个判断对象是否相等的方法。

qq_74217055的博客 474

【ESP32-IDF】I2S音频协议实战:从PDM麦克风到PCM扬声器的全链路解析

本文深入解析ESP32-S3的I2S音频协议,从PDM麦克风采集到PCM扬声器输出的全链路实现。详细介绍了硬件PDM转PCM、Standard模式配置及混合模式协同工作,提供实战代码与性能优化建议,助力开发者高效完成嵌入式音频项目开发。

pea55的博客 886

js面试:手写深度比较 (模拟lodash.isEqual)

什么是深度比较 lodash.isEqual : 比较对象的键值对,都一样则为true,反之false; 其中,若对象的属性值是引用类型,比较的是实际值不是地址(当然,若地址是一样的,那么肯定相等,return true); 思路 默认不会比较函数 1.不是对象,直接返回比较结果,return === 2. 地址相等的对象 return true 3. 两个都是对象||数组 (1)比较两对象keys的个数 (2)以obj1的key为基准,和obj2依次递归比较 实现 function isEqual (

qq_43385689的博客 1639

嵌入式接口通识知识之PCIe接口

PCIe x1接口是最常见的一种,插槽的长度是最短的,仅有25mm。PCIe x4接口有四个数据通道,提供比x1接口更高的带宽,插槽的长度为39mm,分为前后两组,一组22根针脚用于供电,剩下的42根针脚是数据针脚。插槽全长89mm,有164根针脚,分为前后两组,较短的插槽有22根针脚,主要用于供电,较长的插槽142根,主要用于数据传输,具有16通道所带来的高带宽。PCIe x8接口有八个数据通道,插槽全长56mm,有98跟针脚,分为前后两组,较短的22根针脚用于供电,剩下的76根针脚是数据针脚。

2301_76587520的博客 1305

计算机视觉——多视图几何

多视图几何1.前言1.1 多视图几何概念2. 基本原理2.1 对极几何2.2 基础矩阵2.2.1 基础矩阵推导2.2.2 求解基础矩阵3. 实验过程3.1 实验数据准备3.2 实验代码3.3 实验结果及分析4. 实验中遇到的问题 1.前言 1.1 多视图几何概念 多视图几何是利用在不同视点所拍摄图像间的关系,来研究照相机之间或者特征之间关系的一门科学。 多视图几何(Multiple View ...

RuiMa的博客 7715

js手写深度比较

// 1.判断是否为对象 // 2.是否同一个对象 // 3.长度是否相等 // 4.递归比较 function isEqual(obj1,obj2){ if(obj1 === obj2){ return true } let obj1Keys = Object.keys(obj1) let obj2Keys = Object.keys(obj2) if(obj1Keys.length !== obj2Keys.length){ re.

Qjw524的博客 570

海思ISP调优实战:从实验室到真实场景的IPC相机图像质量优化指南

本文深入探讨海思ISP调优在IPC相机图像质量优化中的实战应用,从实验室标定到真实场景部署的全链路调优方法。重点解决光照动态范围、色温变化和噪声特性等核心问题,提供AE权重表配置、CCM标定、3DNR时域滤波等关键技术方案,帮助实现从理论到实践的图像质量提升。

s3t4u的博客 749

原生JS手写实现深度比较函数——JS手写系列(二)

原生JS手写实现深度比较函数——JS手写系列(二)前言思路具体实现 前言 在JavaScript中,对于深度比较,如果是基本数据类型,可以通过===便可完成实现。而对于引用数据类型,就要麻烦许多,由于栈空间中仅保存引用数据类型在堆空间中位置的地址指针(此处涉及到栈空间和堆空间,你是否了解该知识点呢?嘻嘻嘻),所以无法使用===进行比较。此时,便只能设计专门的函数进行引用数据类型的深度比较。 思路 核心思想:深度比较两个对象,就是要深度比较对象的每一个元素。=> 递归 具体实现 function is

weixin_44685906的博客 603

模拟IC设计笔记:拆解一个经典的时钟占空比校正(DCC)电路模块,从理论到SPICE仿真

本文深入解析了时钟占空比校正(DCC)电路在模拟IC设计中的关键作用,特别是在高速ADC应用中。通过晶体管级拆解,详细介绍了基于电荷泵和积分器的模拟反馈型DCC电路设计,包括占空比检测、误差放大与校正执行单元的实现。文章还提供了SPICE仿真验证方法,确保电路在100MHz时钟下的稳定性和性能。

weixin_33725722的博客 424

【二 Deepseek+Coze案例】【 2.2 Coze + Deepseek 实现小红书爆款笔记:打造专属Agent智能体】

摘要 本文介绍了如何利用Coze平台和Deepseek模型构建自动化Agent智能体,用于生成和优化小红书爆款笔记。文章首先分析了爆款笔记的核心特征,包括精准定位、吸引标题、实用内容、精美排版和热门标签。随后提出Agent智能体的功能需求,涵盖热点追踪、内容生成与优化、数据分析及自动发布等模块。在技术实现上,详细阐述了从环境配置、数据采集到内容生成与优化的全流程,并提供了Python代码示例,展示如何调用Coze函数获取热点数据及竞品笔记。该方案通过智能化的内容创作与运营策略,帮助用户高效打造高曝光的小红书

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 2265

【JavaScript】手写深度比较,模拟lodash isEqual

// 判断是否是对象或数组 function isObject(obj) { return typeof obj === 'object' && obj !== null } // 全相等(深度) function isEqual(obj1, obj2) { if (!isObject(obj1) || !isObject(obj2)) { // 值类型(注意,参与 equal 的一般不会是函数) return obj1 === obj2 .

dropout的博客 298

第42章:AI代码生成的质量标准——何时用AI、何时自己写

> - AI代码生成的质量分级标准:可用、稳定、安全、优雅 > - 一个决策矩阵:什么场景适合用AI,什么场景必须人工编写 > - 如何评估AI生成的代码质量(复杂度、可读性、安全性) > - 实战对比:同一需求下AI生成代码 vs 人工编写代码 > - 团队落地:将质量标准集成到Code Review和CI流程 > - 我如何将团队AI代码接受率从70%提升到90%

sfishfly的博客 161

【JS基础】通俗易懂的讲清楚去抖/防抖、节流。外加手写深度比较

好,我举个应用的例子你就更加明白了,页面上有个搜索框,用户在上面输入关键词,输入完后触发input事件,这时事件的处理逻辑就是发送异步请求去获取关键词的搜索结果。例如用户连续快速输入“广东省深圳市”,假如没有防抖机制,输入完后一共无规律的发送了6个接口,有了防抖机制,只发送了1次,就是用户输入完"市"停止1s的时候。除了优化【查】的操作,在【增删改】的接口调用时,如果以按钮之类的形式去触发,也一定要考虑到去抖的操作,当然这种情况不一定要使用去抖的写法,用个局部loading也是不错的选择。

庞囧的博客 1199

Unity零基础到进阶 ☀️| Unity中的 GC及优化 超级全面解析 ☆(ゝω・)v 建议收藏!

介绍: 在游戏运行的时候,数据主要存储在内存中,当游戏的数据在不需要的时候,存储当前数据的内存就可以被回收以再次使用。内存垃圾是指当前废弃数据所占用的内存,垃圾回收(GC)是指将废弃的内存重新回收再次使用的过程。 Unity中将垃圾回收当作内存管理的一部分,如果游戏中废弃数据占用内存较大,则游戏的性能会受到极大影响,此时垃圾回收会成为游戏性能的一大障碍点。 本文我们主要学习垃圾回收的机制,垃圾回收如何被触发以及如何提GC收效率来提高游戏的性能。 Unity内存管理机制简介 要想了解垃圾回收如何工作以及何时被

努力前行,总会成为自己心中的那道光 6万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

手写深度比较isEqual

思路:深度比较两个对象,就是深度比较对象中的每个元素。 递归 function isObject (data) { return typeof data === 'object' && data !== null } function isEqual (obj1, obj2) { // 首先判断传入参数类型 if (!isObject(obj1) || !isObject(obj2)) { // 值类型

weixin_39235174的博客 357

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

30 Seconds of Interviews:JavaScript 对象深度比较(isDeepEqual)原理与实战解析

对象相等性判断是 JavaScript 面试中的高频考点。本指南以本仓库 [questions/comparing-objects.md](https://link.gitcode.com/i/474405852980dc6cd331b53cde4586a9) 的面试问答为骨架,讲清"为什么 `==`/`===` 比较对象会失效、如何编写递归的 `isDeepEqual` 深度比较函数",并结合仓

gitblog_00029的博客 1066

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

JavaScript对象比较全解析:==与===、深比较函数及类型转换陷阱

在JavaScript开发中,比较操作看似简单却暗藏深坑:引用类型每次创建都是独立内存地址,即使用严格相等依旧返回false。理解值相等与引用相等是掌握比较机制的第一步,而==与===的区别则涉及隐式类型转换,背后由ToPrimitive与ToNumber驱动。尤其在业务场景中,盲目使用==易引发校验逻辑错误,对象深度比较因此成为高频需求——通过手写深比较函数可准确判断对象内容是否一致,覆盖Date、Map、循环引用及NaN等边界情况。深度比较广泛应用于表单差异检测、状态管理和单元测试,但需警惕大对象比较的

weixin_30536861的博客 120

JavaScript对象数组去重:从引用比较到Map实战方案

在JavaScript数据处理中,数组去重是常见需求,但面对对象数组时,传统的Set或indexOf方法会因引用比较机制而失效。这源于JavaScript中基本类型与引用类型在值比较与引用比较上的根本差异。理解这一原理对于处理复杂数据结构至关重要,它直接影响到前端性能优化和数据展示的准确性。在实际工程实践中,如处理API返回的用户列表、合并表格数据或实现前端缓存时,高效的对象数组去重能显著提升应用性能与用户体验。本文聚焦于基于Map/对象的映射法这一高效方案,通过自定义关键属性比对规则,提供了从单属性到多属

weixin_33739523的博客 476

经常出现的JS笔试题目

1、手写深拷贝函数deepClone 2、手写节流防抖函数throttle和debounce 1、手写深拷贝函数deepClone const deepClone = (params) => { if (typeof params !== 'object') { return params } if (Object.prototype.toString.call(params) === '[object Array]') { const arr =

hs1219462412的博客 292

前端高频手写面试题集锦

循环是比较笨拙的方法,它实现的原理很简单:先定义一个包含原始数组第一个元素的数组,然后遍历原始数组,将原始数组中的每个元素与新数组中的每个元素进行比对,如果不重复则添加到新数组中,最后返回新数组;, 那么我们只需要把 Promise.race 中产生的 Promise 对象的 resolve 方法, 注入到数组中的每一个 Promise 实例中的回调函数中即可.像dom的拖拽,如果用消抖的话,就会出现卡顿的感觉,因为只在停止的时候执行了一次,这个时候就应该用节流,在一定时间内多次执行,会流畅很多。

helloworld1024fd的博客 307

(JS)手写深比较

//深比较 function isObject(obj) { return typeof obj==="object" ? true : false; } function isEqual(obj1,obj2) { if(!isObject(obj1) || !isObject(obj2)) { return obj1 === obj2; } if(obj1 === obj2) { return true; } // 取出obj1和obj2的key const obj1Keys = O

u014572617的博客 248

手写深度比较

思路: 判断对象是否相等,进行深度比较,因为不知道对象层级多深,首先应该是一个递归操作; Step1: 判断两者是否为对象(包括数组、对象),如果不是对象,进行值类型比较;返回两者比较结果; Step2. 两者都是对象,判断【是否是同一个对象】,用===判断对象地址是否一致;一致代表是同一个对象,直接返回true; Step3.两个都是对象或者数组,但是不全等,【比较个数】,如果不相等结束进程,返回结果; Step4.如果两者都是对象,同时个数相等,依次递归调用方法比较两个对象的值,直到返回结果;如果全程没

louShuMei 的博客 231

在JavaScript中如何对两个对象进行深度比较

function recursiveComparison(objA, objB, flag) { for (let key in objA) { // 如果objA的key不存在objB中,比较结果为false if (!objB.hasOwnProperty(key)) flag = false; // 递归调用compareDeeply,进行比较 ...

前路浩浩荡荡,万物皆可期待 2010

js 对象 深度比较 全相等 isEqual

isEqual //js对象深度比较 全相等 function isEqual(obj1,obj2) { //如果传入的不是对象,那就直接比较并且返回 if(!isObject(obj1) || !isObject(obj2)) { return obj1 === obj2 } //如果传入的两个对象为同一个,那直接返回true if(obj1 === obj2) { ...

qq_35603474的博客 3972

【JS】深度学习JavaScript

💓 博客主页:从零开始的-CodeNinja之路⏩ 收录文章:【JS】深度学习JavaScript。

smile_sundays的博客 5843
上一篇: 【JavaScript】本地存储localStorage
下一篇: 【HTML】foundation响应式框架邮箱html编写的使用
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值