[]==![](true)、{}==!{}(false)

简介: []==![](true)、{}==!{}(false)

对于Javacript中的等于操作符用两个等于号(==)表示,如果操作数相等,则会返回true。不等于操作符用叹号和等于号(!=)表示,如果两个操作符不想等,则会返回true。这两个操作符都会先进行类型转换(通常称为强制类型转换)再确定操作符是否相等。

在转换操作数的类型时,相等和不相等操作服遵循以下规则:

  • 如果任一操作数是布尔值,则将其转换为数值再比较是否相等。false转换为0,true转换为1。
  • 如果一个操作数是字符串,另一个操作符是数值,则尝试将字符串转换为数值,再比较是否相等。
  • 如果一个操作数是对象,另一个操作数不变,则调用对象的valueOf()方法取得其原始值,再根据前面的规则进行比较。

在进行比较时,这两个操作符会遵循如下规则:

  • null和undefined相等
  • null和undefined不能转换为其他类型的值再进行比较
  • 如果有任一操作数是NaN,则相等操作符返回false,不相等操作符返回true。记住:即使两个操作数都是NaN,相等操作符也返回false,因为按照规则,NaN不等于NaN
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回true。否则,两者不相等。

下表总结了一些特殊情况及比较的结果:

表达式 结果
null==undefined true
"NaN"==NaN false
5==NaN false
NaN==NaN false
NaN!=NaN true
false==0 true
true==1 true
true==2 false
undefined==0 false
null==0 false
"5"==5 true

[]==![]的转换过程

[]==![] -> []==false -> []==0 -> ''==0 -> 0==0 -> true

注意:对象没有valueOf方法时就调用toString方法,[].toString()=''

{}==!{}的转换过程

{}==!{} -> {}==false -> {}==0 -> NaN==0 -> false

注意:{}.toString()=[object object],Number({}.toString())=NaN



相关文章
|
前端开发
return false得使用
return false得使用
50 0
|
缓存 算法 JavaScript
为什么[null] === [null]输出为false❓
有人问,为什么null === null 输出值true,但是[ null ] === [ null ]输出值却是false?
167 0
|
Python
a is b 为 True,a == b 一定为 True 吗?
a is b 为 True,a == b 一定为 True 吗?
123 0
|
存储 Java
今天我们来解决0.1d+0.2d==0.3d是false的问题!
今天我们来解决0.1d+0.2d==0.3d是false的问题!
今天我们来解决0.1d+0.2d==0.3d是false的问题!
a==b,b==c都为true,那a==c一定为true吗???
a==b,b==c都为true,那a==c一定为true吗???
a==b,b==c都为true,那a==c一定为true吗???
|
Java 程序员
for(;;)和while(true)的区别
for(;;)和while(true)的区别
141 0
for(;;)和while(true)的区别
|
Java 编译器 C语言
for(;;)和while(true)的区别
for(;;)和while(true)的区别
148 0
for(;;)和while(true)的区别
|
编译器
for( ; ; )和while(true)的区别
喜欢看源码的同学可能都会发现,很多组件的作者在做死循环时,都喜欢用for( ; ; ),while(true)或者while(1)也能实现死循环,为啥大佬们都用for( ; ; )呢
4392 0
for( ; ; )和while(true)的区别