JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )

2023-05-16

一、前言(比较规则)

JS中的相等操作符由 ( == )表示,如果两个操作数相等,则返回true。
原理:相等操作符会先转换操作数(通常称为强制转型),然后比较它们的相等性。

二、基本规则

如果相等操作符两边的操作数,不包含 null 或者 undefined,且两个操作数不全是对象,在执行相等比较之前,会先调用 Number() 将两个操作数强制转为 Number 类型,然后进行比较。

基本数据类型:
1.如果有一个操作数是(number,string,Boolean),则在比较相等性之前,将其转换为数值;
2.在比较相等性之前,不能将 null 和 undefined 转成其他值,且null 和 undefined 是相等的。
3.如果有一个操作数是 NaN,则都返回 false;(NaN不与任何相等,包括NaN)

'55' == 55;       //true   ( Number('55') -> 55 )
'1.232'==1.232;   //true
false == 0;       //true   ( Number(false ) -> 0 )
"wise" == 3;      //false ( Number("wise") -> NaN )
[] == 0;          //true  ( Number([]) -> 0 )

复杂数据类型
1 如果一个操作数是对象,另一个操作数不是,则调用对象的 valueOf() 方法,用得到的基本类型值按照前面的规则进行比较;
2 如果两个操作数都是对象,则比较它们是不是同一个对象。如果指向同一个对象,则相等操作符返回 true;

NaN == NaN;  //false (参考第4条规则)
[] == [];    //false
[] == ![];   //true
{} == {};    //false
{} == !{};   //false

三、[] == [] 和 {} == {}

在 JavaScript 中,Object、Array、Function、RegExp、Date 都是引用类型。
声明引用类型的时候,变量名保存在 js 的栈内存里面,而对应的值保存在堆内存里面。而这个变量在栈内存中实际保存的是:这个值在堆内存中的地址,也就是指针

var a = {};
var b = {};
var c = b;
a == b;   //false(变量a,b保存的分别是a,b的指针,它们指向不同的对象)
b == c;   //true(变量c保存的是b的指针,它们指向同一个对象)

注意:如果两个对象指向同一个对象,相等操作符返回 true,否则则为false

四、[] == ![] 和 {} == !{}

逻辑非 (!) 的优先级高于相等操作符 ( == )。参考链接:JavaScript 运算符优先级

[] == ![]  //![] == false  ->Number([]) == Number(false)  ->  0 == 0  ->  true
{} == !{}  //!{} == false  ->  Number({}) == Number(false)  ->  NaN == 0 ->  false

注意:转布尔值==》Boolean() 代表空、否定的值会被转换为 false  ,如 ''0NaNnullundefined
转数字类型:
Number(false) // 0;
Number(true) // 1;

Number('') // 0;
Number('12') // 12;
Number('sda') // NaN;
Number([1,2]) //  NaN;
Number({}) // NaN; 转换对象都是NaN
Number(NaN) // NaN;
Number(!NaN) // 1;
Number(null) // 0;
Number(!null) // 1;
Number(!undefined) // 1;
Number(undefined) // NaN;

五、数组与数值

数组会先通过调用toString()转换为字符串后再转换为数值,比如[true]转换为字符串后为"true",然后再转换为数值是NaN,所以[true]==1返回false。

console.log([]==0);   // true
console.log([1]==1);   // true
console.log(["1"]==1);   // true
console.log([1,2]==1);   // false
console.log([true]==1);   // false
Number(['a']) //  NaN;
['1'] == 1 // true;

事实上,数组、对象和函数在与其他基本数据类型进行比较时都会先转换为字符串,然后再转换为相应的数据类型。

六、null == 0 、null >= 0 、null > 0

1.关系运算符知 和 相等运算符 并不是一个类别的.
2.关系运算符,在设计上总是需要运算元道尝试转为一个number,而相等运算符在设计上,则没有这方面的考虑.

null==0         //false
//解释:null在设计上,对比等于的时候不尝试转型. null和0不转型的话,是不会相等的, 所以null == 0结果为false.(在JavaScript旧版源代码中,没有相匹配的项,最后返回末尾的false。)

null > 0 // false
// 对比大于或小于的时候, null 会尝试转型为number , 转化之后null为0, 0>0是错误的,所以结果为 false.

null>=0 // true
null<=0 // true
//对比 大于等于 或 小于等于 的时候, 会先判断大于或小于,转型为number,0>0是错误的,但是0=0是正确的, 这是 “或” 的判断, 所以结果为 true

小结:

1.比较两个操作数相等时,有运算符根据运算符优先级,要先算==两侧的,然后再去强制转换类型,最后再去比较;
2.数组(对象,函数)会先通过调用toString()转换为字符串后再转换为数值
3.注意在比较时出现NaN,null,undefined时,不强制转换为数字类型
4.在关系运算符中,null,undefined会被Number()强制转换成数字类型;

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} ) 的相关文章

  • Angular - 如何从 DOM 中删除我使用过 $compile 的元素?

    我需要的是两个 ng views 的功能 因为我不能 我想更改某些内容的innerHTML 并编译它 我遇到的问题是 当我再次更改内容时 我可以编译 但是 Angular 是否会自行删除绑定 或者我必须手动执行此操作 如果是这样 怎么办 编
  • 如何使用 JavaScript 创建链接?

    我有一个标题字符串和一个链接字符串 我不知道如何将两者放在一起以使用 JavaScript 在页面上创建链接 任何帮助表示赞赏 我试图解决这个问题的原因是因为我有一个 RSS 源并且有一个标题和 URL 列表 我想将标题链接到 URL 以使
  • Javascript 函数查找数字的倍数

    创建一个名为的函数multiplesOf 它将接受两个参数 第一个参数是数字数组 第二个参数是数字 该函数应返回一个新数组 该数组由参数数组中的每个数字组成 该数字是参数数字的倍数 So multiplesOf 5 6 7 8 9 10 3
  • socket.io 的良好初学者教程? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • IE从哪个版本开始支持Object.create(null)?

    您可以通过多种方式在 JavaScript 中创建对象 creates an object which makes the Object prototype of data var data1 new Object Object liter
  • Chrome 中的性能问题

    我目前正在从事一个相对较大的项目 使用 AngularJs 构建 应用程序的一部分是一个表单 您可以向其中添加任意数量的页面 不幸的是 添加了很多不必要的垃圾 即表示表单模型的对象可能会变得非常大 在某些时候 Chrome 基本上无法处理它
  • 使用 JavaScript 禁用第三方 cookie

    我正在努力根据所有在欧盟运营的公司的数据保护规则实施新的 Cookie 政策合规性 根据该规则 用户在使用任何网站时必须能够拒绝 接受除必需的 Cookie 之外的所有内容 在我客户的网站中 我可以看到正在存储以下第三方 cookie ga
  • 如何将内联 JavaScript 与 Express/Node.js 中动态生成的内容分开?

    对于具有几年 Web 开发经验但没有找到答案的人来说 这是一个有点菜鸟的问题程序员堆栈交换 or Google 我决定在这里问一下 我在用Express网络框架Node js 但这个问题并不特定于任何 Web 框架或编程语言 以下是从数据库
  • 图像无法在带有 DOM 的 IE 中加载:控制台中的 7009 错误(无法解码)

    当在 IE 中的单个页面上加载许多图像时 在 IE11 中重现 其中一些图像开始加载失败 并在控制台中出现类似以下警告的内容 DOM7009 无法解码 URL 处的图像 某些唯一的 url 当我查看网络流量时 似乎确实从服务器收到了每个图像
  • 可以在初始 DOM 解析期间/之前修改 DOM 吗?

    是否可以在初始 DOM 解析期间或之前修改 DOM 或者我是否必须等到 DOM 被解析和构建之后才能与其交互 更具体地说 是否有可能阻止 DOM 中的脚本元素使用用户脚本 内容脚本或 Chrome 或 Firefox 中的类似脚本运行 在解
  • 隐藏 Div 的父级

    我只是想隐藏父divcomments section div class content content green div div div 我试过这个 document getElementById comments section pa
  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 调整图像大小并将画布旋转 90 度

    这里有很多关于在 js 上使用画布旋转图像的主题 我阅读了其中的大部分内容 但无法找到解决我的问题的方法 我正在接收任何分辨率的图像 来自上传组件 我将其大小调整为 1024x768 如下所示 var canvas document cre
  • 如何制作没有 ng-repeat 的模板并使用 Angular-drag-and-drop-lists 将数据传递到 $scope?

    我想用角度拖放列表 https github com marceljuenemann angular drag and drop lists使用我自己的网格模板到所见即所得编辑器 如何构建我自己的 HTML 模板而不需要ng repeat因
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • 有没有办法在 onclick 触发时禁用 iPad/iPhone 上的闪烁/闪烁?

    所以我有一个有 onclick 事件的区域 在常规浏览器上单击时 它不会显示任何视觉变化 但在 iPad iPhone 上单击时 它会闪烁 闪烁 有什么办法可以阻止它在 iPad iPhone 上执行此操作吗 这是一个与我正在做的类似的示例
  • Three.js 各种大小的粒子

    我是 Three js 的新手 正在尝试找出添加 1000 个粒子的最佳方法 每个粒子都有不同的大小和颜色 每个粒子的纹理是通过绘制画布创建的 通过使用粒子系统 所有粒子都具有相同的颜色和大小 为每个粒子创建一个粒子系统是非常低效的 有没有
  • 使用 Vue 的多模式组件

    我在 Vue 中实现动态模式组件时遇到问题 A common approach I follow to display a set of data fetched from the db is I dump each of the rows
  • Vue 和 Vuex:处理依赖的计算属性

    我的应用程序是一个使用 Vuex 在 Vue 中构建的精简电子表格 关键组件是TableCollection Table and Row The TableCollection有一个包含多个的数组Table对象 每个Table有一个包含多个
  • 在 JavaScript 循环之外声明变量可以提高速度和内存?

    C 也有类似的问题 但我们没有看到 JavaScript 的任何问题 在循环内声明变量是否可以接受 假设循环有 200 次迭代 使用样本 2 相对于样本 1 是否有性能要求 内存和速度 我们使用 jQuery 来循环 它提高了我们将 var

随机推荐

  • LVS_Director + KeepAlived 部署

    1 xff0c 准备四台net机器 其中两台做主 备调度 别外两台做web机器 主 备调度器安装软件 root 64 lvs keepalived master yum y install ipvsadm keepalived 主 root
  • tomcat 详情介绍与部署

    1 xff0c 部署tomcat 安装JDK JDK下载面页 xff1a http www oracle com technetwork java javase downloads index html 下载jdk1 8到服务器 安装jdk
  • Redis 部署及介绍

    1 安装单机版redis root 64 redis master mkdir p data application 创建工作目录 root 64 redis master wget http download redis io relea
  • shenyu中logback替换成log4j2

    一 背景 shenyu框架默认使用的是logback处理日志 xff0c 压测发现写入日志存在瓶颈 基于log4j2优秀的性能 xff0c 使用log4j2替换logback 二 如何替换logback 1 删除logback的依赖项 sp
  • 图片项目部署

    1 xff0c 准备 mysql 主从 43 读写分离 3台 nginx 43 uwsgi 43 python3 6 1台 redis 哨兵 3台 A nginx uwsgi python3 上传代码包 xff0c 调试 B mysql r
  • Git 构建分布式版本控制系统详解

    安装git要4G以上内存 安装和配置必要的依赖关系 root 64 localhost yum install curl policycoreutils openssh server openssh clients 安装邮件程序 root
  • jenkins 详细部署

    部署jenkins需要以下的步骤 环境需要4G内存 1 xff0c 部署git 安装依赖环境 root 64 localhos yum install curl devel expat devel gettext devel openssl
  • RabbitMQ消息队列的部署

    RabbitMQ消息队列的用处 对于一个大型的软件系统来说 xff0c 它会有很多的组件或者说模块或者说子系统 xff08 subsystem or Component or submodule xff09 那么这些模块的如何通信 xff1
  • Docker 基础使用命令

    Docker下载 配置阿里云Docker Yum源 root 64 xingdian yum install y yum utils device mapper persistent data lvm2 git root 64 xingdi
  • docker部署mysql AB复制-详细步骤

    docker部署mysql AB复制 详细步骤 1 安装docker 参考链接 xff1a https blog csdn net qq 50263172 article details 109640641 spm 61 1001 2014
  • mysql 查询特定时间内的操作数量

    查询某几个月中每天的操作量 命令格式 Select DATE FORMAT 字段 39 Y m d 39 AS 34 时间 34 COUNT 1 AS 34 数量 34 FROM 表名 WHERE 字段 gt 39 2021 01 01 0
  • zabbix 邮箱,钉钉报警详解

    1 zabbix部署环境说明 zabbix监控服务器 xff1a mastsc zabbix被监控服务器 xff1a slave 两台机器关闭 34 selinux 34 xff1a setenforce 0 两台机器关闭防火墙 xff1a
  • Centos7离线安装redis

    Centos7离线安装redis 参考文档 xff1a https www cnblogs com yy3b2007com p 10513752 html 1 下载redis安装包 在 opt redis 如没有这个目录需要手动建立 roo
  • zabbix监控使用ping来判断主机是否存活,向邮箱发送邮件报警

    1 安装zabbix监控服务 server 和被监控服务器 slave 安装zabbix参考文档 https blog csdn net qq 50263172 article details 115519613 spm 61 1001 2
  • Feign调用错误no suitable HttpMessageConverter found for response type

    Feign接口 span class token annotation punctuation 64 PostMapping span span class token punctuation span value span class t
  • ubuntu WPS字体缺失 解决方法

    前言 请保证您还有一台windows 文章目录 前言一 在windows复制字体二 复制到ubuntu三 重启WPS总结 一 在windows复制字体 首先在windows下载好WPS xff0c 然后找到字体 xff0c 复制 二 复制到
  • 将IMG等镜像文件转换VMware虚拟机

    先下载好qemu这个转换软件 然后这个软件是用鼠标点不开的 xff0c 先到软件的文件路径然后在路径栏打cmd 或者另一种打开方法 xff0c 在文件所在位置 xff0c 按shift 43 鼠标右键 我这里用第一种 xff0c 接下来两条
  • VNC访问阿里云服务器

    最近阿里云年终特惠 xff0c 新用户服务器只要38一年 xff0c 爱住了呀 xff01 xff01 xff01 果断下单 xff01 买它个一年 xff01 接下来介绍如何通过vnc访问阿里云服务器 一 先要对端口进行开放 在服务器的防
  • ISCSI的部署与安装

    iSCSI xff08 Internet Small Computer System Interface xff0c Internet小型计算机系统接口 xff09 是一种由IBM公司研究开发的IP SAN技术 该技术是将现有SCSI接口与
  • JavaScript 中的相等操作符 ( 详解 [] == []、[] == ![]、{} == !{} )

    一 前言 xff08 比较规则 xff09 JS中的相等操作符由 61 61 表示 xff0c 如果两个操作数相等 xff0c 则返回true 原理 xff1a 相等操作符会先转换操作数 xff08 通常称为强制转型 xff09 xff0c