我们在面试的过程中,肯定会被问到与=的区别,常见的误区是==检查值是否相等,===检查值和类型是否相等,这样其实不正确,下面相关知识点介绍。

==:宽松相等

===:严格相等

他们都是用来判断两个值是否相等,区别是在判断条件上,简单的说就是,==允许在想等的比较重进行强制类型转换,===不允许

知道上面这些面试这个知识点是绰绰有余的,下面是更详细的介绍与列子(建议若是有看不懂的点,可以去就看笔者另一篇博客,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

==与===的详细区别相关推荐

  1. 【视频】详解Scala中的类及与Java的详细区别

    详解Scala中的类及与Java的详细区别

  2. vuex中mutation和action的详细区别

    一.vuex中mutation和action的详细区别 const store = new Vuex.Store({state: {count: 0},mutations: {increment (s ...

  3. 图像技术_基础技术(0001)_RGB与CMYK的定义和详细区别

    图像技术_基础技术(0001)_RGB与CMYK的定义和详细区别 基础技术: 本文部分内容来自网络 两者的定义 RGB:显示颜色,通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的 ...

  4. 魅蓝5s的android系统版本,魅蓝5s有几个版本?魅蓝5s标准版和高配版详细区别对比评测...

    魅族在北京召开魅蓝新品发布会,正式发布了全新升级版魅蓝5s新品,这款新品可以说是一款过渡产品,要说要比上一代产品升级也不是很明显,算是小幅度的提升,主要加入了快充和提升了运行内存大小.那么魅蓝5s有几 ...

  5. acer蜂鸟swift1深度linux,宏碁蜂鸟Swift3和Swift1哪个值得买?宏碁蜂鸟Swift1和Swift3详细区别对比评测...

    蜂鸟Swift系列笔记本是宏碁旗下主打轻薄.长续航的产品.今日,宏碁官方宣布,全新蜂鸟Swift系列--Swift 3.Swift 1将于5月25日正式发售,目前已经接受预约.宏碁蜂鸟Swift3和S ...

  6. Java中final、finally、finalize的简单区别,中等区别,详细区别(Lawliet 修改+注释版)

    简单区别:      中等区别:    虽然这三个单词在Java中都存在,但是并没有太多关联:  final:java中的关键字,修饰符. 1.如果一个类被声明为final,就意味着它不能再派生出新的 ...

  7. 小米note2不上Android9吗,小米note2和华为g9哪个好?小米note2和华为G9青春版详细区别对比评测...

    小米note2介绍: 小米note2详细参数,详情如下所示,参数党必看: 小米note2硬件配置参数 屏幕规格 5.7英寸 CPU型号 高通骁龙821 RAM内存 4GB/6GB ROM存储 64GB ...

  8. 荣耀平板2 android go,荣耀平板2和华为M2哪个好?华为荣耀平板2和华为M2详细区别对比评测_硬件教程...

    华为近日刚刚举行了2016新品发布会,不仅发布了荣耀畅玩6X,同时也发布了荣耀手表S1和荣耀平板2,而荣耀平板2拥有8寸的屏幕是千元价格的小屏幕平板,那么荣耀平板2和华为M2哪个好?荣耀平板2和华为M ...

  9. PMSM矢量控制笔记(1.2)——隐机电机与凸极电机的详细区别

    前言: 永磁同步电机的转子包括永磁体.转子铁芯.轴承等机械结构等,其转子可以制成实心的形式,也可以由压片压制而成,其上装有永磁体材料.根据电机转子上永磁材料安装位置的不同,可以将永磁同步电机分为表贴式 ...

  10. 红米2a android5,小米5和红米2A哪个好? 小米5和红米2A详细区别对比评测

    先来看看小米5和红米2A这两款手机的参数配置的区别:MX5综合配置对比 小米5和红米2A综合配置对比 型号 小米5 红米2A 主屏尺寸 5.2英寸 4.7英寸 屏幕分辨率 19201080像素 128 ...

最新文章

  1. 2022-2028年中国游泳健身行业市场研究及前瞻分析报告
  2. 关于二叉树的几个必须掌握的实现
  3. phpcmsv9多表联合查询分页功能实现
  4. Java开源——常见J2EE框架简介
  5. jzoj C组 2017.1.19 比赛
  6. LongestPalindromeSequence
  7. 属于服务器操作系统的是,属于服务器操作系统的是
  8. java里怎么存入数据并进行排序_Java数据结构之排序---插入排序
  9. ebook site
  10. spring boot的gradle整合日志
  11. halcon学习之颜色与纹理
  12. Flutter ListView子项长按浮层菜单实现
  13. 重新安装的keil需要的设置-字体颜色固件库中文显示
  14. Python制作动态桌面壁纸程序-摆脱付费-Mili_Wallpaper
  15. HTML2——图像、超链接
  16. Rasa NLU 示例
  17. 【射影几何01】 射影几何介绍
  18. Android安卓应用发布平台汇总
  19. 移动互联网时代代驾app开发未来走向功能定制化
  20. python把txt导入excel,python如何将txt文件导入Excel?

热门文章

  1. 工作流?BPM?云中的流程?这是个问题
  2. 宝宝生病处理锦囊+儿童常见疾病
  3. php微信支付商户免充值代金券接口升级
  4. java代码如何运用加密狗_如何使用JAVA从加密狗的SIM中读取短信
  5. 教学质量分析系统 php,教学质量分析系统
  6. 阿里资深技术专家推荐:技术人员怎样才能有更多的上升空间?
  7. 中秋节,用华为云AI制作一轮超大的月亮吧!
  8. 【Bash百宝箱】shell内建命令之declare、typeset、local
  9. IDEA本地项目关联远程Git远程仓库
  10. 微信小程序中实现定位以及逆地址解析