JS中的indexOf与Set(其实是引用类型比较的问题)

起因是想在一个二维数组中查找是否包含一个一维数组

indexOf

先看个例子:

const arr = [[1, 1], [2, 2]]
if(arr.indexOf([1, 1]) === -1){console.log("无法查到该数组") 
}else{console.log("已找到")
}const arr2 = [1,2,3,4,5]
if(arr2.indexOf(2) === -1){console.log("无法查到该值")
}else{console.log("已找到")
}// 输出
//无法查到该数组
//已找到

为啥2在一维数组中能找到,而[1,1]在原二维数组中中找不到?

其实不是indexOf的问题,而是因为js比较number, string, boolean的时候,比较的是数值,而比较数组或对象时,比较的是他们的引用

引用就是js给这个数组在内存中分配的地址,arr中的[1,1]和被拿来查找的[1,1]内存地址是不同的,所以indexOf自然会返回-1.

这是个更简单的例子:

const arr1 = [1,1]
const arr2 = [1,1]
console.log(arr1 === arr2) // false
console.log(arr1 == arr2) // false

如果想要比较两个数组中的每一个下标的数值都是否相同,可以用下面的方法

/* 如果要比较一个一维数组A与二维数组B的某一个元素B[i]值相等 */
// 方法一 逐一比较A与B[i]的值
const fatherArr = [[1, 1], [2, 2], [3, 3]];
const sonArr = [1, 1];const containsTarget = fatherArr.some(subArray => subArray.length === sonArr.length && subArray.every((value, index) => value === sonArr[index])
);if (containsTarget) {console.log("已找到");
} else {console.log("无法查到该数组");
}//方法二 JSON.stringfy()
const containsTarget2 = fatherArr.some(subArr => JSON.stringify(subArr) === JSON.stringify(sonArr))if (containsTarget2) {console.log("已找到");
} else {console.log("无法查到该数组");
}

Set()

来看看set中的问题,类似

const set = new Set()
set.add([1, 2])
set.add([1, 3])console.log(set.has([1, 2])) //false 同理,比较的是两个数组的引用

解决办法:

// 如果要向set中存储数组可以先转换为字符串
const set2 = new Set()
set2.add(JSON.stringify([1, 2]))
set2.add(JSON.stringify([1, 3]))
set2.add(JSON.stringify([1, 2]))console.log(set2.has(JSON.stringify([1, 2]))) // true

我有个习惯,每次调试js程序看看数组和对象的值都用JSON.stringify

但是看一下JSON.stringify一个Set会发生什么

const set = new Set()
set.add([1, 2])
set.add([1, 3])console.log(JSON.stringify(set)) // {} 

为啥是{}? 因为JSON.stringify只会序列化对象的可枚举属性,set是集合,它是一种特殊的对象,没有传统对象的属性,因此会输出{}

所以要查看set的值可以用Array.from转换为数组

const set = new Set()
set.add([1, 2])
set.add([1, 3])console.log(set.has([1, 2])) //false 
console.log(JSON.stringify(Array.from(set))) // 正确做法

并且值相同的两个set直接比较也是false,和数组的原因相同 

const set1 = new Set([1,1])
const set2 = new Set([1,1])
console.log(set1 === set2) // false
console.log(set1 == set2) // false

总结

基本数据类型(Number、String、BigInt、Boolean)会直接拿数值相互比较,引用数据类型(Object(Array\Set\Map都是特殊的Object)) 比较的是它们内存中分配的地址.

特殊情况:

const sym1 = Symbol('description');
const sym2 = Symbol('description');console.log(sym1 === sym2); // false 
//虽然Symbol是基本数据类型 但它表示每个Symbol都是唯一 
//不是简单的字符串 没有两个Symbol是完全相等的// 还有老生常谈的null与undefined
console.log(null == undefined); // true
console.log(null === undefined); // false

来自一个笔试踩了大坑的渣渣TT

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

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

相关文章

安装FTP服务器教程

一。安装vsftpd yum install vsftpd 二。修改配置文件,匿名账户具有访问,上传和创建目录的权限 vim /etc/vsftpd/vsftpd.conf (红色进行设置放开YES) local_enable:本地登陆控制,no表示禁止,ye…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveAbsolute

机器自动化控制器——第三章 轴指令 4 MC_MoveAbsolute变量▶输入变量▶输入输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 示例程序1▶参数设定▶动作示例▶梯形图▶结构文本(ST) 示例程序2▶参数设定▶动作示例▶梯形图▶结构文…

Python 从入门到实战16(正则表达式语法)

我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了字符串一些操作说明。今天讨论一下正…

RDMA应用场景及效果

GPU Direct 参考:网络架构如何支持超万卡的大规模 AI 训练?| AICon_芯片与网络_InfoQ精选文章 GPU 网络的情况已经发生了很大变化。每个 GPU 都有自己的内部互联,例如 NVIDIA 的 A100 或 H800,它们内部的 NVLink 互联可以达到 6…

【Kubernetes】常见面试题汇总(六)

目录 17.简述 kube-proxy ipvs 和 iptables 的异同? 18.简述 Kubernetes 中什么是静态 Pod? 19.简述Kubernetes中 Pod 可能位于的状态? 17.简述 kube-proxy ipvs 和 iptables 的异同? (1)iptables 与 IP…

单个 java 虚拟机 生产者消费者

一、通过 java.lang.Object#wait(),java.lang.Object#notify,java.lang.Object#notifyAll来实现 生产者,消费者 public abstract class Goods {protected String type;protected String goodName;protected int number;public abstract …

【Authing身份云-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

EP10 全局渐变背景色

文件路径: E:/homework/uniappv3tswallpaper/common/style/common-style.scss view,swiper,swiper-item{box-sizing: border-box; } .pageBg{background: linear-gradient(to bottom,rgba(0,0,0,0.2),white 35%),linear-gradient(to right,#A6E3D7 30%,#FFE1F2);mi…

香港打工人√三天通过微软mos认证

在繁忙的香港,时间就是金钱,效率就是生命。作为一名香港的打工人,在这座竞争激烈的城市中,不断提升自我是保持竞争力的关键。最近,我完成了一项挑战:在短短三天内通过微软MOS认证大师。以下是我备考的经验分…

微调大模型:提高其代码修复能力的尝试

目录 一、作品背景: 二、作品目标: 三、作品技术方案: (1)标记化 (2)量化 (3) LoRA(低秩自适应)配置 (4)训练配置 (6)模型保存 四、作品效果: 一、作品背景: 随着大型模型技术的日益成…

c#语言写一个数组排序函数

在C#中,有多种方式可以编写一个数组排序函数。最直接和常用的方式之一是利用.NET Framework内置的Array.Sort()方法,但如果你想要自己实现排序算法来加深理解,下面我将提供一个简单的冒泡排序算法示例。 冒泡排序是一种简单的排序算法&#…

SOMEIP_ETS_107: SD_Consider_Entries_Order

测试目的: 验证DUT在接收到包含两个条目的消息时,能够按照正确的顺序处理:首先是带有TTL 0的SubscribeEventgroup以删除订阅,然后是常规的SubscribeEventgroup以重新订阅。 描述 本测试用例旨在确保DUT能够正确处理订阅消息的顺…

Frida0C - Module相关API

亲爱的读者你们好啊,今天主要分享一下 frida 相关的学习文档,见文章最后一节。 Module var module Process.findModuleByAddress(Module.findBaseAddress("libc.so")) module.enumerateSymbols()enumerateSymbols 返回该 so 的符号表。 还…

Java项目: 基于SpringBoot+mybatis+maven医院管理系统(含源码+数据库+任务书+开题报告+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven医院管理系统 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格调试,eclipse或者idea 确保可以运行! 该系统功能完善、界面美观、操作简单、…

ffmpeg安装测试(支持cuda支持SRT)

文章目录 背景安装ffmpeg直接下载可执行文件选择版本选择对应系统版本下载测试Linux下安装 查看支持协议以及编码格式 常见错误缺少 libmvec.so.1LD_LIBRARY_PATH 错误 GPU加速测试SRT服务器搭建下载srs5.0源码解压安装配置启动 SRT推流测试SRT播放测试 背景 在音视频开发测试中…

视频监控管理平台LntonAIServer视频智能分析抖动检测算法应用场景

在视频监控系统中,视频画面的稳定性对于确保监控效果至关重要。抖动现象是指视频画面中存在不稳定或频繁晃动的情况,这可能会影响视频的清晰度和可读性。LntonAIServer通过引入抖动检测功能,帮助用户及时发现并解决视频流中的抖动问题&#x…

如何在Oracle中实现数据的加密

在Oracle数据库中实现数据加密是一项重要的安全措施,它可以保护存储在数据库中的敏感信息不被未授权访问。Oracle提供了多种数据加密方法,包括透明数据加密(TDE)、列级加密和使用内置加密函数等。以下是一些在Oracle中实现数据加密…

【Python】从基础到进阶(七):深入理解Python中的异常处理与调试技巧

🔥 个人主页:空白诗 文章目录 一、引言二、异常处理概述1. 什么是异常?2. 异常的捕获与处理 三、常见的异常类型四、自定义异常五、调试与日志记录1. 使用assert进行调试2. 使用日志记录 六、案例:文件操作与异常处理1. 需求分析2…

最新kubernetes的安装填坑之旅(新手篇)

Kubernetes(常简称为 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序,lz也不知道哪根脑经秀逗了,竟然妄挑战学习一下,结果折戟沉沙,被折腾的欲仙欲死,不过…

写的一致性问题之双删模式

文章目录 1、双删模式1.1、同步双删1.2、异步双删1.3、延时双删1.4、定时双删 在事务提交前后删除两次redis,会有性能问题 企业开发常用:延时双删、异步双删 1、双删模式 1.1、同步双删 实现思路:AOP 1.2、异步双删 在事务提交之后异步删除r…