[] == ! [] 为什么返回 true ?

== 的隐式转换规则

类型相同的比较:

  1. 如果类型是 Undefined 或 Null,返回 true
null == null; // true
  1. 如果一个是 +0,另一个是 -0,返回 true
+0 == -0; // true
  1. 如果类型是对象,二者引用同一个对象,返回 true,反之返回 false
{} == {}; // false

null 和 undefined 比较: 仅当它们之间的比较时,返回 true

null == undefined; // true

NaN 比较: NaN 与任何值比较都返回 false,包括NaN自己。

NaN == NaN;   // false

字符串与数字比较: 如果其中一个操作数是字符串,另一个是数字,将字符串转换为数字,然后进行比较

'5' == 5;   // true,将字符串 '5' 转换为数字 5 进行比较

布尔值与非布尔值比较: 布尔值无法直接比较,需先将布尔值转换为数字(true 转换为 1false 转换为 0),非布尔值也需要转换成数字再比较

true == 1;  // true,将布尔值 true 转换为数字 1 进行比较
false == '123'; // false,将布尔值 false 转换为数字 0 ,将字符串 '123' 转换为数字 123 进行比较

对象与原始类型比较: 如果其中一个是对象,另一个是原始类型,将对象通过 ToPrimitive 转换为原始类型,然后进行比较。(即如果原始类型为字符串,则对象转换成字符串再比较;如果原始类为布尔值,则将布尔值与对象都转换成数字进行比较;如果原始类为数字,则将对象转换成数字进行比较。)

{} == 1;  //false

ToPrimitive

ToPrimitive(obj, Number) ==> Number({})

  1. 如果 obj 是基本类型,直接返回
  2. 否则,调用 valueOf 方法,如果得到原始值,则返回
  3. 否则,调用 toString 方法,如果得到原始值,则返回
  4. 否则,报错

首先{}先被ToPrimitive转换成字符串"[object Object]",就相当于直接判断 "[object Object]" == 1,字符串与数字的比较中,又要将字符串转换成数字,"[object Object]"转换成数字为 NaN,而NaN 与任何值比较都为 false
所以 {} == 1 返回 false

[] == ![]怎么比较

!的优先级大于==的,所以先进行非运算
! 运算符会进行两步操作:

  1. !后面的操作数转换成布尔值
  2. 将这个布尔值取反

任何对象转换成布尔值都得到ture,然后在取反,得到![]为false

实际在进行[] == ! []判断时,在JS引擎内部,会将这行代码执行成这个样子:

[] == ![]

[] == !true // 将空数组这个对象类型转换成布尔值

[] == false // ! 运算符对 true 进行取反

'' == false // 对 [] 进行 ToPrimitive 操作,返回一个空对象 

0 == 0 // 将等号两边都转换成数字类型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值