JavaScript中三个等号和两个等号你了解多少
发布时间 - 2026-01-11 02:10:41 点击率:次引子

众所周知,用在if条件判断语句中,js有六种假值:false, null, undefined, '', NAN, 0。先来看几个例子:
[] === []
NaN === NaN
NaN == NaN
0 == []
'' == []
'' == {}
[] == undefined
{} == []
null == undefined
以上这些判断结果是什么,大家能否一看就知道结果呢?笔者以前对==和===都只有大概的印象,相信大家也都知道,== 判断如果两边变量的类型不同,会将其先做类型转换再作判断,而 === 则不做类型转换,如果类型不同,就一定返回 false。但是笔者最近看到了一个题目,感觉很有意思,贴出来给大家看看:
var x = 1;
var obj = {
valueOf: function(){
x = 2;
return 0
}
}
console.log(obj == 0, x)
恩,这段代码输出的结果是 true, 2,是不是不可思议?还有~
var x = 1;
var obj = {
valueOf: function(){
return {}
},
toString: function(){
return {}
}
}
console.log(obj == 0)
这段代码直接抛出了异常: Uncaught TypeError: Cannot convert object to primitive value。
如果你和我一样觉得很奇怪,那就继续往下看吧~
=== 的规则
这个比较简单,我把规则罗列一下
- 如果类型不同,就不相等
- 如果两个都是数值,并且是同一个值,那么相等,例外的是,如果其中至少一个是NaN,那么不相等。(判断一个值是否是 NaN,只能用isNaN() 来判断)
- 如果两个都是字符串,每个位置的字符都一样,那么相等;否则不相等。
- 如果两个值都是true,或者都是false,那么相等。
- 如果两个值都引用同一个对象或函数,那么相等;否则不相等。
- 如果两个值都是null,或者都是undefined,那么相等。
这里不难发现,复合类型的数据(比如对象、数组、函数等)之间的比较不是比较他们的值是否相等,而是比较他们引用的对象是否一样,因此也不难明白,为什么 [] === [] 判断为false了。
比如:
== 探究
看下 == 的规则
- 如果两个值类型相同,进行 === 比较。
- 如果两个值类型不同,他们可能相等。根据下面规则进行类型转换再比较:
- 如果一个是null、一个是undefined,那么相等。
- 如果一个是字符串,一个是数值,把字符串转换成数值再进行比较。
- 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
- 如果一个是对象,另一个是数值或字符串,把对象转换成基础类型的值再比较。对象转换成基础类型,利用它的toString或者valueOf方法。 js核心内置类,会尝试valueOf先于toString。例外的是Date,Date利用的是toString转换。非js核心的对象,会比较麻烦,有兴趣的同学可以研究一下
- 任何其他组合,都不相等。
看到这里,第六条,我们就可以明白,为什么上面的代码会输出意想不到的结果甚至抛出错误了。
再来看一题:
if (x == 10) x += 5
根据上面的规则,试想一下,如果我们输入的x是字符串20,那么x的结果会变成什么样?没错,就是205,而往往这种情况我们的目的是想计算20+5的值。
综合上面的例子,不难看出,== 的比较看似会比较方便,比如 1 == '1' ,但是会埋下隐患,比如可能对类型做出错误的假设。因此大多数人建议我们少用== 而尽量使用 ===,事实上我也推荐如果明确知道类型,还是最好用===。
再举个简单的例子:团队协作中你肯定需要读别人的代码。而当你看到==时,要判断清楚作者的代码意图是确实需要转型,还是无所谓要不要转型只是随手写了,还是不应该转型但是写错了……所花费的脑力和时间比明确的===(加上可能需要的明确转型)要多得多。这样一想,===不要好太多。
明白了==的机制,那么判断这6个假值,就变得容易了。
简单看看几个例子,大家看看是真是假~
false == ''
false == []
0 == []
'' == []
[] == []
[] == {}
null == undefined
false == undefined
总结
可以用一张图来表达 == 返回true的几个假值:
一、首先看双等号前后有没有NaN,如果存在NaN,一律返回false。
二、再看双等号前后有没有布尔,有布尔就将布尔转换为数字。(false是0,true是1)
三、接着看双等号前后有没有字符串, 有三种情况:
- 对方是对象,对象使用toString()或者valueOf()进行转换;
- 对方是数字,字符串转数字;
- 对方是字符串,直接比较;
- 其他返回false
- 如果是数字,对方是对象,对象取valueOf()或者toString()进行比较, 其他一律返回false
- null, undefined不会进行类型转换, 但它们俩相等
后记
我的建议是:如果你的的确确知道你在做什么(了解类型转换的结果),可以用==;否则还是用===吧。
在网上无意中看到的图,大家可以参考看看:
==号
===号
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# JavaScript
# 三个等号
# JavaScript两个等号
# javascript中三个等号
# 浅析Javascript中双等号(==)隐性转换机制
# 细数JavaScript 一个等号
# 两个等号
# 三个等号的区别
# JavaScript中三个等号和两个等号的区别(== 和 ===)浅析
# 详解JavaScript中双等号引起的隐性类型转换
# javascript等号运算符使用详解
# javascript中的=等号个数问题两个跟三个有什么区别
# 浅析js中2个等号与3个等号的区别
# javascript 全等号运算符使用说明
# 浅谈JavaScript中等号、双等号、 三等号的区别
# 都是
# 转换成
# 的是
# 几个
# 布尔
# 可以用
# 把它
# 这段
# 其先
# 不相等
# 抛出
# 我也
# 他们的
# 如果你
# 都不
# 太多
# 那就
# 就不
# 你在
# 做什么
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在IIS服务器上快速部署高效网站?
如何在建站之星绑定自定义域名?
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
详解Android图表 MPAndroidChart折线图
实例解析Array和String方法
如何在搬瓦工VPS快速搭建网站?
Bootstrap CSS布局之列表
北京企业网站设计制作公司,北京铁路集团官方网站?
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
微信小程序 配置文件详细介绍
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
Laravel如何实现事件和监听器?(Event & Listener实战)
如何在阿里云服务器自主搭建网站?
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制
Laravel怎么生成URL_Laravel路由命名与URL生成函数详解
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
原生JS实现图片轮播切换效果
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
网站制作软件有哪些,制图软件有哪些?
PHP正则匹配日期和时间(时间戳转换)的实例代码
Laravel Session怎么存储_Laravel Session驱动配置详解
详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)
Laravel中的Facade(门面)到底是什么原理
Android自定义listview布局实现上拉加载下拉刷新功能
如何撰写建站申请书?关键要点有哪些?
如何解决hover在ie6中的兼容性问题
Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID
北京网站制作的公司有哪些,北京白云观官方网站?
Laravel项目结构怎么组织_大型Laravel应用的最佳目录结构实践
Laravel安装步骤详细教程_Laravel环境搭建指南
Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
如何在 React 中条件性地遍历数组并渲染元素
Laravel如何集成Inertia.js与Vue/React?(安装配置)
如何快速选择适合个人网站的云服务器配置?
网页制作模板网站推荐,网页设计海报之类的素材哪里好?
php485函数参数是什么意思_php485各参数详细说明【介绍】
Laravel如何实现数据库事务?(DB Facade示例)
如何在 Pandas 中基于一列条件计算另一列的分组均值
JS实现鼠标移上去显示图片或微信二维码
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程
html5源代码发行怎么设置权限_访问权限控制方法与实践【指南】
新三国志曹操传主线渭水交兵攻略
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何用y主机助手快速搭建网站?
JS中页面与页面之间超链接跳转中文乱码问题的解决办法

