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

  • 相关阅读:
    HDU 1813 Escape from Tetris
    BZOJ 2276 Temperature
    BZOJ 4499 线性函数
    BZOJ 3131 淘金
    HDU 5738 Eureka
    POJ 2409 Let it Bead
    POJ 1286 Necklace of Beads
    POJ 1696 Space Ant
    Fox And Jumping
    Recover the String
  • 原文地址:https://www.cnblogs.com/javascript9527/p/11640062.html
Copyright © 2011-2022 走看看