摘要:通常在转换不同数据类型时,相等和不相等会遵循以下规则若有一个操作数是布尔值,则比较前会将布尔值转换为数值转为,转为。
本文是 重温基础 系列文章的第十八篇。
今日感受:优化自己的代码,也是很愉快的事情。
系列目录:
【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理)
【重温基础】1-14篇
【重温基础】15.JS对象介绍
【重温基础】16.JSON对象介绍
【重温基础】17.WebAPI介绍
本章节复习的是JS中的关于严格相等和非严格相等的一些知识。
前置知识:
判断两个变量的值是否相等,是编程中非常重要的一个操作。这里我们心里面先有两组对照,思考下:
相等 和 不相等
全等 和 不全等
1.介绍在我们比较字符串、数值和布尔值的相等性,是比较简单的,但是到了比较对象的时候,问题就比较复杂。
早期的时候ECMAScript规范中,在判断相等和不相等时,会先将对象转换成相似的类型,再执行比较。后面有人质疑其合理性,最后ECMAScript提出解决方法:提供两组操作符:
相等和不相等(宽松相等):先转换再比较,使用==
全等和不全等(严格相等):仅比较不转换,使用===
另外还有一类ES6新增的方法:
Object.is (ES6新增)
2.相等和不相等JavaScript中用相等操作符使用==进行比较,若两个操作数相等,则返回true,否则返回false。反之,不相等操作符使用!=。
这两个操作符都会先转换操作数类型,再进行比较。
通常在转换不同数据类型时,相等和不相等会遵循以下规则:
若有一个操作数是布尔值,则比较前会将布尔值转换为数值:false转为0,true转为1。
若一个操作数是字符串,另一个是数值,则比较前会将字符串转换为数值。
若一个操作数是对象,另一个不是,则比较前会调用valueOf()方法,用返回的基本类型值来判断。
两个操作符进行比较时会遵循下面规则:
null和undefined相等。
比较前不能讲null和undefined转换成其他值。
若一个操作数是NaN,则不相同(==时返回false,!=时返回true)。
若两个操作数是NaN,则不相同(==时返回false,!=时返回true)。
若两个操作数都是对象,则比较它们是不是同一个对象。
若两个操作数都指向同一个对象,则相等操作符返回true,否则返回false。
下面列出一些特殊情况的比较 :
表达式 | 值 |
---|---|
null == undefined | true |
"NaN" == NaN | false |
9 == NaN | false |
NaN == NaN | false |
NaN != NaN | true |
false == 0 | true |
true == 1 | true |
true == 2 | false |
undefined == 0 | false |
null == 0 | false |
"9" == 9 | true |
除了比较前不转换操作数歪,全等和不全等与相等和不相等并无区别,但使用的是===,只有当不转换的情况下两个操作数相同,才会返回true。
"99" == 99 ; // true 因为先转换类型 number 和 number "99" === 99 ; // false 因为不转换类型 string 和 number
不全等操作符就相对应的使用!==:
"99" != 99 ; // false 因为先转换类型 number 和 number "99" !== 99 ; // true 因为不转换类型 string 和 number
特殊的:
null == undefined; // true 类似的值 null === undefined; // false 类型不同
由于相等和不相等操作符存在类型转换问题,因此为了保持代码中数据类型的完整性,我们推荐使用去哪等和不全等操作符。
4.同值相等(Object.is)Object.is(value1, value2);,传入两个需要对比的值。
Object.is() 判断两个值是否相同,并且不会对参数进行类型转换。如果下列任何一项成立,则两个值相同:
两个值都是 undefined
两个值都是 null
两个值都是 true 或者都是 false
两个值是由相同个数的字符按照相同的顺序组成的字符串
两个值指向同一个对象
两个值都是数字并且
都是正零 +0
都是负零 -0
都是 NaN
都是除零和 NaN 外的其它同一个数字
Object.is("leo", "leo"); // true Object.is(window, window); // true Object.is("leo", "pingan"); // false Object.is([], []); // false var leo = { a: 1 }; Object.is(leo, leo); // true Object.is(null, null); // true // 特例 Object.is(0, -0); // false Object.is(-0, -0); // true Object.is(NaN, 0/0); // true
另外还有特殊的:
零值相等:
与同值相等类似,不过会认为 +0 与 -0 相等。
5.对比图相等操作符对于不同类型的值,进行的比较如下图所示(来源 MDN):
注意:
ToNumber(A) 表示比较前将参数 A 转换为数字
ToPrimitive(A)通过尝试调用 A 的A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive)。
参考文章:MDN JavaScript 中的相等性判断
JavaScript高级程序设计
本部分内容到这结束
Author | 王平安 |
---|---|
pingan8787@qq.com | |
博 客 | www.pingan8787.com |
微 信 | pingan8787 |
每日文章推荐 | https://github.com/pingan8787... |
JS小册 | js.pingan8787.com |
欢迎关注微信公众号【前端自习课】每天早晨,与您一起学习一篇优秀的前端技术博文 .
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/101316.html
摘要:系列目录复习资料资料整理个人整理重温基础篇重温基础对象介绍重温基础对象介绍重温基础介绍重温基础相等性判断本章节复习的是中的关于闭包,这个小哥哥呀,看看。这里随着闭包函数的结束,执行环境销毁,变量回收。 本文是 重温基础 系列文章的第十九篇。今日感受:将混乱的事情找出之间的联系,也是种能力。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】...
摘要:内存泄露内存泄露概念在计算机科学中,内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。判断内存泄漏,以字段为准。 本文是 重温基础 系列文章的第二十二篇。 今日感受:优化学习方法。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1-14篇 【重温基础】15.JS对象介绍 【重温基础】16.JSON对象介绍 【重温基础】1...
摘要:欢迎您的支持系列目录复习资料资料整理个人整理重温基础篇重温基础对象介绍重温基础对象介绍重温基础介绍重温基础相等性判断重温基础闭包重温基础事件本章节复习的是中的高阶函数,可以提高我们的开发效率。 本文是 重温基础 系列文章的第二十一篇。 今日感受:想家。 本人自己整理的【Cute-JavaScript】资料,包含:【ES6/ES7/ES8/ES9】,【JavaScript基础...
摘要:系列目录复习资料资料整理个人整理重温基础语法和数据类型重温基础流程控制和错误处理重温基础循环和迭代重温基础函数本章节复习的是中的表达式和运算符,用好这些可以大大提高开发效率。 本文是 重温基础 系列文章的第五篇。今日感受:家的意义。 系列目录: 【复习资料】ES6/ES7/ES8/ES9资料整理(个人整理) 【重温基础】1.语法和数据类型 【重温基础】2.流程控制和错误处理 【重温基...
摘要:本文是重温基础系列文章的第二十篇。事件捕获为截获事件提供机会,然后实际的目标接收到事件,最后事件冒泡,对事件作出响应。事件处理事件处理,即响应某个事件。包括导致事件的元素事件类型等其他信息。 本文是 重温基础 系列文章的第二十篇。 这是第三个基础系列的第一篇,欢迎持续关注呀! 重温基础 系列的【初级】和【中级】的文章,已经统一整理到我的【Cute-JavaScript】的Java...
阅读 2426·2021-11-23 09:51
阅读 481·2019-08-30 13:59
阅读 1793·2019-08-29 11:20
阅读 2514·2019-08-26 13:41
阅读 3217·2019-08-26 12:16
阅读 713·2019-08-26 10:59
阅读 3262·2019-08-26 10:14
阅读 575·2019-08-23 17:21