zoukankan      html  css  js  c++  java
  • JS中 [] == ![]结果为true,而 {} == !{}却为false

     为什么?

    先转换再比较      (==)

    仅比较而不转换  (===)

    ==转换规则?  

        ==比较运算符会先转换操作数(强制转换),然后再进行比较

    ①如果有一个操作数是布尔值,则在比较相等性之前先将其转换为数值——false转换为0,而true转换为1;

    ②如果一个操作数是字符串,另一个操作数是数值,在比较相等性之前先将字符串转换为数值;

    在双等号 左右两边类型相等时 采用三等号也就是严格运算符的判定规则

     

    [ ] == ![ ]
    解题思路?
    ![] 会变成 false,false会变成0;也就是==右侧 是 0==在进行比较前,如果有一侧是数字,会将另一侧也转化为数字类型,才会进行比较。 
    Number([]) // 0; 先在等号左侧也是0
    两侧都是0 所以是true。
    [] == ![]   ->  [] == false  -> [] == 0;  ==右侧的转换
    因为右侧是数字,所以左侧也要转换为数字类型,才会进行比较
    Number([]) == 0  ->  0 == 0 //true
     [] == [] // false
     在双等号 左右两边类型相等时 采用三等号也就是严格运算符的判定规则
     对于对象(数组也是对象)只看双方地址,地址一样则返回true,所以[]===[]地址不一样,返回fasle。

      {}=={} // false  
       同理,等号两侧类型相同,采用三等号判定,比的是地址,所以是false
    {} == !{} // false
    {} == !{}  -->  {} == false  -->  {} == 0;   等号右侧侧的转化
    因为双等号比较前,会先转化为相同的类型,所以左侧也要转为数字类型
    Number( {} )  == 0  -->   NaN == 0 //false
    NaN和任何数字比都是false,所以{} == !{} // false

  • 相关阅读:
    【题解】1621. 未命名
    【模板】关于vector的lower_bound和upper_bound以及vector基本用法 STL
    【题解】数颜色 STL vector数组
    【题解】斐波拉契 luogu3938
    【题解】天天酷跑
    【题解】Grape luogu1156改 dp
    【题解】逐个击破 luogu2700
    【题解】ball 数论
    【题解】逐个击破 luogu2700
    【题解】平方根
  • 原文地址:https://www.cnblogs.com/javascript9527/p/11640062.html
Copyright © 2011-2022 走看看