资讯专栏INFORMATION COLUMN

宽松相等和严格相等(==和===)

MkkHou / 343人阅读

摘要:正确的解释是允许在相等比较中进行强制类型转换,而不允许。特殊情况不等于等于对象的宽松相等,两个对象指向同一个值时,即视为相等,不发生强制类型转换。也就是说,在中和是一回事,可以相互进行隐式强制类型转换。

在JS书籍和博客中常见的一个误区是:“==检查值是否相等,===检查值和类型是否相等”。
正确的解释是:“==允许在相等比较中进行强制类型转换,而===不允许”。==和===都会检查操作数的类型。区别在于操作数类型不同时它们的处理方式不同。
如果进行比较的两个值类型相同,则==和===使用相同的算法,所以除了JavaScript引擎实现上的细微差别之外,它们之间并没有什么不同。
如果两个值的类型不同,我们就需要考虑有没有强制类型转化的必要,有就用==,没有就用===,不用在乎性能。

如果2个值的类型相同,就仅比较它们是否相等。
特殊情况:

   NaN不等于NaN
   +0等于-0

对象的宽松相等==,两个对象指向同一个值时,即视为相等,不发生强制类型转换。

==在比较两个不同类型的值时会发生隐式强制类型转换,会将其中之一或两者都转换为相同的类型后在进行比较。
a) 字符串和数字之间的相等比较
如果x是数字,y是字符串,则返回x == ToNumber(y)
如果x是字符串,y是数字,则返回ToNumber(x) == y

b) 其他类型和布尔类型之间的相等比较
如果x是布尔类型,则返回ToNumber(x) == y
如果y是布尔类型,则返回x == ToNumber(y)
建议无论什么情况下都不要使用 ==true 和 ==false

c) undefined和null之间的相等比较
如果x是null,y是undefined,则结果为true
如果x是undefined,y是null,则结果为true
在==中undefined和null相等(它们也与其自身相等),除此之外其他值都不存在这种情况。也就是说,在==中null和undefined是一回事,可以相互进行隐式强制类型转换。

d) 对象(对象/函数/数组)和非对象(数字/字符串/布尔值)之间的相等比较
如果x是基本类型,y是对象,则先把y.toString(),然后在比较

e)比较少见的情况

[]==![] //true ![]=>false =>false == []=> true

以下两个原则可以让我们有效地避免出错:

如果两边的值中有true或者false,千万不要使用==
如果两边的值中有[]、’’或者0,尽量不要使用==
最好使用===来避免不经意的强制类型转换。这两个原则可以让我们避免几乎所有强制类型转换的坑。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/100843.html

相关文章

  • 【前端工程师手册】说清楚JavaScript中的相等性判断

    摘要:如果没有传入的话如果是类型,则取否则,取这个方法大致和一样,除了以下返回返回参考知乎中和区别是什么全面解析中的数据类型与类型转换规范 有哪些判断相等性的方法 JavaScript现在提供了三种方法来判断相等性: ===,三个等号即严格相等 ==,两个等号即宽松相等 Object.is(),ES6中用来判断相等的方法 判断相等性的细节 ===(严格相等) 被比较的两个数不会进行类型转...

    crossoverJie 评论0 收藏0
  • 魔幻语言 JavaScript 系列之类型转换、宽松相等以及原始值

    摘要:通过使用其构造函数,可以将一个值的类型转换为另一种类型。如果使用两次,可用于将该值转换为相应的布尔值。 编译自:[1] + [2] – [3] === 9!? Looking into assembly code of coercion.全文从两个题目来介绍类型转换、宽松相等以及原始值的概念: [1] + [2] – [3] === 9 如果让 a == true && a == fa...

    li21 评论0 收藏0
  • 重学JS: 隐式强制类型转换

    摘要:隐式强制类型转换指的是那些隐藏的强制类型转换,副作用也不是很明显,事实上,只要自己觉得不够明显的强制类型转换都可以算作隐式强制类型转换,接下来,此文将会介绍几种常见的隐式类型转换。 隐式强制类型转换指的是那些隐藏的强制类型转换,副作用也不是很明显,事实上,只要自己觉得不够明显的强制类型转换都可以算作隐式强制类型转换,接下来,此文将会介绍几种常见的隐式类型转换。 加法操作符 转换规则: ...

    Fourierr 评论0 收藏0
  • JavaScript疑难杂症系列-相等性判断

    摘要:同一类的复合类型值两个复合类型对象数组函数的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。宽松相等双等号将执行类型转换原始类型的值原始类型的数据会转换成数值类型再进行比较。 事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找)参考:https://dev...

    Flink_China 评论0 收藏0
  • JavaScript疑难杂症系列-相等性判断

    摘要:同一类的复合类型值两个复合类型对象数组函数的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个对象。宽松相等双等号将执行类型转换原始类型的值原始类型的数据会转换成数值类型再进行比较。 事件这块知识点虽然是老生长谈的,但对于我来说多多整理,多多感悟,温故知新,每次看看这块都有不同的收获.(在这里我不会长篇大论,只会挑重点;具体的小伙伴们自行查找)参考:https://dev...

    2bdenny 评论0 收藏0

发表评论

0条评论

MkkHou

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<