js [] == ![]返回true,而{} == !{}返回false

console.log([] == ![]);        //true
console.log({} == !{});        //false

一、双等和三等的区别

双等:先隐式转换再进行比较

三等:直接进行比较(包括数据类型)

二、隐式转换规则

对象→字符串→数值

布尔→数值

ECMAScript 等性运算符中写到:

在比较时,该运算符还遵守下列规则:

  • 值 null 和 undefined 相等。
  • 在检查相等性时,不能把 null 和 undefined 转换成其他值。
  • 如果某个运算数是 NaN,等号将返回 false,非等号将返回 true。
  • 如果两个运算数都是对象,那么比较的是它们的引用值。如果两个运算数指向同一对象,那么等号返回 true,否则两个运算数不等。

重要提示:即使两个数都是 NaN,等号仍然返回 false,因为根据规则,NaN 不等于 NaN。

三、执行顺序  [] == ![]

1.运算符优先级  ! 大于 ==,so执行![]

  ![] ==   false                              (此时为布尔值,继续转换为数值)  →  false 结果为 0 

  false == 0                                 //由此可知,右侧结果为0

  此时表达式为:[] == 0          

2.运算 [] == 0

  根据上方ECMAScript 等性运算符中第四条进行运算

  执行 [].valueOf() == []                //返回[]

  继续执行 [].toString() == ''         //返回空串''

  因==右边为数值,so继续转换  '' == 0     //由此可知,左侧结果为0

  此时表达式为:0 == 0     

四、执行顺序  {} == !{}

  前面步骤同上,但 {}.toString() 运算结果为[object Object]

  继续转换数值  Number("[object Object]") 为 NaN

 

  
 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值