JS之“==“强制转换规则

[] == ![] 为什么是true?

== 在进行比较的时候会进行强制转换,转换规则如下:

在这里插入图片描述
流程:
1、首先会判断两者类型是否相同,相同的话就比较两者的大小
2、类型不相同的话,就会进行类型转换
3、会先判断是否在对比 null 和 undefined ,是的话就返回true
4、判断两者类型是否为 string 和 number,是的话就会将字符串转换为number
5、判断其中一方是否为boolean,是的话就会把 boolean 转为 number 再进行判断
6、判断其中一方是否为object 且另一方为 string、number、或者symbol,是的话就会把 object 转为原始类型再进行判断
Object类型转为原始类型之前,会先转为基础类型,再转换为number类型,这个过程称为ToPrimitive。
ToPrimitive过程先回检查对象是否存在valueOf方法,如果存在并且valueOf返回基本类型的值,则使用该值进行强制类型转换,如果没有,则使用toString方法返回的值进行强制类型转换。
我们来看一道今天做的题

(function () {
    console.log('10' == 10);  //true  “10”转换为10 10==10 为true
    console.log(['10'] == 10); //true  ['1', '0'].toString()为"10" 字符串"10"转换为number为10 10==10 为true
    console.log(['1', '0'] == 10);//false
     //['1', '0'].valueOf()的值不是基础类型,所以我们使用['1', '0'].toString()的值 
     //['1', '0'].toString()为"1,0" 字符串"1,0"转换为number为NaN,所以NaN == 10为false。

    console.log(null == 0); // false  null和number 不会进行转换,直接为false
    console.log('null' == 0);   //  false  //字符串'null'转化为number为NaN, NaN == 1 为false
    console.log(['null'] == 0); // false  
    // ['null'].valueOf()的值不是基础类型,所以我们使用['null'].toString()的值 
    // 然后变成"null",字符串"null"再转化为number为NaN,所以NaN == 1 为false。

    console.log(true == 1);  //true   true布尔类型转化为1  1==1 为true
    console.log('true' == 1); // false 字符串'true'转化为number为NaN, NaN == 1 为false
    console.log(['true'] == 1); //false 
    // ['true'].valueOf()的值不是基础类型,所以我们使用['true'].toString()的值 
    // 然后变成"true",字符串"true"再转化为number为NaN,所以NaN == 1 为false。

    //==遇到对象怎么比较?
    //判断其中一方是否为object 且另一方为 string、number、或者symbol,
    //是的话就会把 object 转为原始类型再进行判断,Object类型转化为原始类型之前会先转为基础类型
    // 然后再转换为number类型,这个过程叫ToPrimitive
    // ToPrimitive过程先回检查对象是否存在valueOf方法,如果存在并且valueOf返回基本类型的值,则使用该值进行强制类型转换,
    // 如果没有,则使用toString方法返回的值进行强制类型转换
})()

上面弄懂了我们来看[] == ![] 为什么是true

  console.log([] == ![]) //true
    //![]先对[]进行强制boolean转换,等价于
    //=> [] == false  fasle再进行强制转换为0
    //=> [] == 0  [].toString()后为 "" 空字符串
    //=> "" == 0  ""空字符串转换为number为0
    //=>  0 == 0
    //所以为 true
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值