“==”和“===”,难道不是多一个的区别吗?
一个 区别 不是 难道
2023-09-14 09:05:54 时间
本文分享自华为云社区《JavaScript/TypeScript里 == 和 === 的区别》,作者: gentle_zhou。
在JS/TS项目里,除了能看到==操作符来判断两个变量是否相等外,我们还会看到===操作符,这两者有什么区别吗?
先上结论,
- 对于String, number这些基础类型,==操作符会先把两边的变量进行类型强制转换成相同的类型再比较是否相等;===操作符则不会进行类型转换,而是直接进行比较。
- 对于array, object这些高级类型,==和 ===是没有区别的,因为它们比较的是 “指针地址” 。
- 对于基础类型和高级类型,== 和 ===是有区别的;==操作符会先把高级类型转换为基础类型之后,进行值的比较;===操作符则不会进行转换,类型不同,直接返回false
也就是说,`==`操作符只要求比较两个变量的值是否相等,`===`操作符则是要求两个变量的值和类型都要相同;类似地,`!=`操作符会去做类型强制转换,`!==`操作符则不会转换类型。
我们写个基础类型变量的代码示例一下:
66 == '66'; // 返回true
66 === '66' // 返回false
==操作符会把第一行里的字符串转换成数字,与66再进行比较,值相等,于是返回true;===操作符则不会做类型转换,因为左边数字,右边字符串,两者类型不同,就会返回false。
注意
对于特殊值NaN(Not a Number),表示非数字,NaN和任何数(包括它自己)做相等比较,都会返回false,所以判断NaN最好用isNaN()函数;
而对于undefined和null,两者的值相比较,会返回true。
代码示例如下:
NaN == 6; // 返回false
NaN === NaN; // 返回false
null == undefined; // 返回true
null === undefined; // 返回false
最后, 由于==和!=操作符带来的类型隐式转换规则非常繁琐,还有为了避免数据类型混淆导致出现bug,还是推荐使用===操作符和!==操作符。
相关文章
- 让我为你介绍一个神器:Chimee,一套可扩展的 H5 视频播放器解决方案
- SpringBoot:同一个类中调用另一个方法没有触发 Spring AOP
- 3分钟创建一个游戏类容器应用【华为云分享】
- windows中添加一个网络位置与映射网络驱动器的区别
- mysql通过sql语句如何批量去掉某一个表中某一个字段的下面的相同部分字符串
- SAP UI5 Diagnostics工具里一个使用面向切片编程(AOP)的一个例子
- 自己实现一个SAP WebClient UI Repository Information System
- 一个具体的例子学习Java volatile关键字
- 查看某个github commit属于哪一个github pull request
- 致物理学家的一个实验
- 想减少代码量,快设置一个有感知的 Aware Spring Bean
- asp.net发布到IIS中出现错误:处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
- 判别式模型和生成式模型区别——生成式是直接对数据本身的概率分布建模,判别式就是学习一个分类边界将不同类别区分开,前者是单刀直入、后者是曲线救国
- 文件包含和目录遍历区别——目标都是信息泄露,但手段一个是利用函数来包含web目录以外的文件,另外一个是对web路径访问权限设置不严格导致
- 反弹木马——本质上就是一个开80端口的CS程序,伪造自己在浏览网页
- 大数据DDos检测——DDos攻击本质上是时间序列数据,t+1时刻的数据特点和t时刻强相关,因此用HMM或者CRF来做检测是必然! 和一个句子的分词算法CRF没有区别!