==与===的详细区别
我们在面试的过程中,肯定会被问到与=的区别,常见的误区是==检查值是否相等,===检查值和类型是否相等,这样其实不正确,下面相关知识点介绍。
==:宽松相等
===:严格相等
他们都是用来判断两个值是否相等,区别是在判断条件上,简单的说就是,==允许在想等的比较重进行强制类型转换,===不允许
知道上面这些面试这个知识点是绰绰有余的,下面是更详细的介绍与列子(建议若是有看不懂的点,可以去就看笔者另一篇博客,JS中强制转换):
抽象相等
在ES5中 “抽象相等比较算法”定义了==运算符的行为,该算法涵盖了可能出现的类型组合与它们强制类型转换的方式
注意:
NAN不等于NAN
-0等于0
==在比较两个不同的类型的值的时候会发生隐式强制转换,会将 其中的一或两个值变为同一种类型而进行比较
1、字符串与数字之间的比较
<script>var a = "42";var b = 42;console.log(a == b);console.log(a === b);</script>
这里举出简单的列子,我们说会进行隐式的强制类型转换,而=不会,那在a==b的过程中是字符串的a转换为了数字型还是数值型的b转换为了字符型的a?在ES5中是这样定义的:
1、如果type(x)是数字,type(y)是字符串,则返回x==ToNumber(y)的结果
2、如果type(x)是字符串,type(y)是数字,则返回ToNumber(y)==y的结果
也就是把是字符串的操作数隐式转化为数字型在进行比较,这里对值类型的强制转换在我另一篇博客中有详细的介绍
2、其他类型和布尔型之间的比较
<script>var a = "42";var b = true;console.log(a == b);console.log(a === b);</script>
这里的比较规则如下:
1、如果type(x)是布尔型,则返回ToNumber(x)==y的结果
2、如果type(y)是布尔型,则返回x==ToNumber(y)的结果
就是通过隐式的强制类型转换把布尔型转换为数字型
这里的对比的过程中是:
1、布尔型转换为数字型
2、字符串型转换为数字型
3、null和undefined之间的相等比较
<script>var a = null;var b = undefined;console.log(a == b);console.log(a === b);</script>
前面提过的比较过程中会发生隐式强制类型转换,而null的数字型是0,undefined的数字型是NAN,0NAN?肯定是错误的,但是null==undefined返回的是true,原因如下:
1、如果x为null,y为undefined,则返回结果为true
2、如果x为undefined,y为null,则返回结果为true
也就是说,在==中null和undefined其实是一回事,可以互相进行隐式强制类型转换
注意:在==中null和undefined相等,他们自身也与其自身相等,除此之外其他值都不和他们想等,如下:
<script>var a = null;var b = false;console.log(a == b);console.log(a === b);</script>
这里 我们应该遵循的是null和undefined之间的相等比较规则,而不是把false转化为0,null转化为0,再去比较,null只与自身相等或undefined,而非其他值!
4、对象和非对象之间的比较
首先先了解一下规则:
1、如果type(x)是字符串或是数字,type(y)是对象,则返回x==ToPrimitive(y)的结果
2、如果type(x)是对象,type(y)是字符串或是数字,则返回ToPrimitive(y)==y的结果
ToPrimitive不了解的可以去百度下,这里简单的做下解释,这个方法中有一个valueOf()方法,返回的就是这里面的值
简单的理解就是,那个操作数是对象就转换对应的操作数
如下列:
<script>var a = 42;var b = [42];console.log(a == b);console.log(a === b);</script>
<script>var a = "42";var b = Object(a);console.log(a == b);console.log(a === b);</script>
注意的是null、undefined、NAN并没有遵循这个规则,因为null、undefined并没有对应的封装对象,所以不能够被封装,NAN能够被封装为数字封装对象,但是NAN!==NAN,下面简单用列:
<script>var a = undefined;var b = Object(a);console.log(a == b);console.log(a === b);</script>
5、假值得相等比较
我们知道,假值如下:
null、undefined、+0、-0、NAN、false、“”
这里 简单举出一些列子:
<script>"0" == null; //false"0" == undefined; //false"0" == false; //true"0" == NAN; //false"0" == 0; //true"0" == ""; //falsefalse == null; //falsefalse == undefined; //falsefalse == NAN; //falsefalse == 0; //truefalse == ""; //truefalse == []; //truefalse == {}; //false"" == null; //false"" == undefined; //false"" == NAN; //false"" == 0; //true"" == []; //true"" == {}; //false0 == null; //false0 == undefined; //false0 == NAN; //false0 == []; //true0 == {}; //false</script>
上面就是一些简单得列子,我们可以通过之前得知识点来进行判断它们是否相等
当然还有一些其他的情况比如:
[]==![]
这里是不是觉得返回的是false?
其实返回的是true,原因如下
1、!表示进行隐式强制转换为布尔型,再取反,而[]的布尔值为true,!true的话就是false
2、所以就是[]==false
3、这里[]类型转换为Number就是0,false也是0,0==0,自然返回的就是true
2==[2] //true
""==[null] //true
0 == "\n" //true
["0"] == ["0"] //false
var a ={b:1}
var b={b:1}
a == b // false
var a =function(){}
var b =function(){}
a == b // false
上面是一些对引用类型的列子,也就是object、Array、function的,引用类型的存储方式是堆存储,所以变量a、b存放的只是他们的地址而已,自然是不想等的。而js中的基本类型就不会出现这种情况。
总结
上面简单的探讨了一下在使用==会发生上面,以及不同类型的规则,JS中的知识点就是一个连接着一个,==在判断相等的过程中会发生隐式的强制类型转换,对于JS中的强制类型转换可以看我这篇博客https://blog.csdn.net/qq_43376559/article/details/121872771?spm=1001.2014.3001.5501
==与===的详细区别相关推荐
- 【视频】详解Scala中的类及与Java的详细区别
详解Scala中的类及与Java的详细区别
- vuex中mutation和action的详细区别
一.vuex中mutation和action的详细区别 const store = new Vuex.Store({state: {count: 0},mutations: {increment (s ...
- 图像技术_基础技术(0001)_RGB与CMYK的定义和详细区别
图像技术_基础技术(0001)_RGB与CMYK的定义和详细区别 基础技术: 本文部分内容来自网络 两者的定义 RGB:显示颜色,通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的 ...
- 魅蓝5s的android系统版本,魅蓝5s有几个版本?魅蓝5s标准版和高配版详细区别对比评测...
魅族在北京召开魅蓝新品发布会,正式发布了全新升级版魅蓝5s新品,这款新品可以说是一款过渡产品,要说要比上一代产品升级也不是很明显,算是小幅度的提升,主要加入了快充和提升了运行内存大小.那么魅蓝5s有几 ...
- acer蜂鸟swift1深度linux,宏碁蜂鸟Swift3和Swift1哪个值得买?宏碁蜂鸟Swift1和Swift3详细区别对比评测...
蜂鸟Swift系列笔记本是宏碁旗下主打轻薄.长续航的产品.今日,宏碁官方宣布,全新蜂鸟Swift系列--Swift 3.Swift 1将于5月25日正式发售,目前已经接受预约.宏碁蜂鸟Swift3和S ...
- Java中final、finally、finalize的简单区别,中等区别,详细区别(Lawliet 修改+注释版)
简单区别: 中等区别: 虽然这三个单词在Java中都存在,但是并没有太多关联: final:java中的关键字,修饰符. 1.如果一个类被声明为final,就意味着它不能再派生出新的 ...
- 小米note2不上Android9吗,小米note2和华为g9哪个好?小米note2和华为G9青春版详细区别对比评测...
小米note2介绍: 小米note2详细参数,详情如下所示,参数党必看: 小米note2硬件配置参数 屏幕规格 5.7英寸 CPU型号 高通骁龙821 RAM内存 4GB/6GB ROM存储 64GB ...
- 荣耀平板2 android go,荣耀平板2和华为M2哪个好?华为荣耀平板2和华为M2详细区别对比评测_硬件教程...
华为近日刚刚举行了2016新品发布会,不仅发布了荣耀畅玩6X,同时也发布了荣耀手表S1和荣耀平板2,而荣耀平板2拥有8寸的屏幕是千元价格的小屏幕平板,那么荣耀平板2和华为M2哪个好?荣耀平板2和华为M ...
- PMSM矢量控制笔记(1.2)——隐机电机与凸极电机的详细区别
前言: 永磁同步电机的转子包括永磁体.转子铁芯.轴承等机械结构等,其转子可以制成实心的形式,也可以由压片压制而成,其上装有永磁体材料.根据电机转子上永磁材料安装位置的不同,可以将永磁同步电机分为表贴式 ...
- 红米2a android5,小米5和红米2A哪个好? 小米5和红米2A详细区别对比评测
先来看看小米5和红米2A这两款手机的参数配置的区别:MX5综合配置对比 小米5和红米2A综合配置对比 型号 小米5 红米2A 主屏尺寸 5.2英寸 4.7英寸 屏幕分辨率 19201080像素 128 ...
最新文章
- 2022-2028年中国游泳健身行业市场研究及前瞻分析报告
- 关于二叉树的几个必须掌握的实现
- phpcmsv9多表联合查询分页功能实现
- Java开源——常见J2EE框架简介
- jzoj C组 2017.1.19 比赛
- LongestPalindromeSequence
- 属于服务器操作系统的是,属于服务器操作系统的是
- java里怎么存入数据并进行排序_Java数据结构之排序---插入排序
- ebook site
- spring boot的gradle整合日志
- halcon学习之颜色与纹理
- Flutter ListView子项长按浮层菜单实现
- 重新安装的keil需要的设置-字体颜色固件库中文显示
- Python制作动态桌面壁纸程序-摆脱付费-Mili_Wallpaper
- HTML2——图像、超链接
- Rasa NLU 示例
- 【射影几何01】 射影几何介绍
- Android安卓应用发布平台汇总
- 移动互联网时代代驾app开发未来走向功能定制化
- python把txt导入excel,python如何将txt文件导入Excel?