zoukankan      html  css  js  c++  java
  • 转:js不同类型对象的比较规则

    Type(x)Type(y)Result
    type(x)==type(y) x===y
    otherwise... false
    null undefined true
    undefined null true
    Number String x==toNumber(y)
    String Number toNumber(x)==y
    Boolean (any) toNumber(x)==y
    (any) Boolean x==toNumber(y)
    String or Number Object x==toPrimitive(y)
    Object String or Number toPrimitive(x)==y

    ~~~1.总是转换为相同的原始类型再做判断,2.逻辑值总是转换为数值类型,3.数值类型和字符串类型比较,总是把字符串转为数值,4.对象(引用类型)总是转换为原始类型再比较( obj.valueOf(), arr.toString() )。

    ~~~这就是通常说的js复杂的隐式类型转换! 经过这样一整理,似乎也不是很复杂

    例子一: 

    [0]==ture;

    首先会把ture进行toNumber,结果为1,式子及转化为 [0]==1

    然后[0]会被toString(),结果为“0”,式子转化为“0”==1

    接着“0”会被toNumber(),结果为0,式子转化为0==1

    最后根据type(x)==type(y),式子转化为0===1

    所以[0]==true会得到false 


     例子二:

    “potato”==true;

    首先true会被toNumber,结果为1,式子转化为“potato”==1

    然后“potato”会被toNumber,结果为NaN,式子转化为NaN==1

    根据typeof(x)==typeof(y),式子转化为NaN===1

    所以“potato”==true会得到false


    例子三:

     object with valueOf

    str = new Number(1);

    str.toString = function(){return "2"};

    str==1; 

    这里typeof str == "object",所以对str进行toPrimitive,这里会对str进行valueOf取值得到1

    所以式子转化为1==1

    所以str==1得到true


    例子四:

    object with toString

    var obj = {

    toString : function(){return "2"} 

    }; 

     obj==1

    这里typeof obj == "object",对obj进行toPrimitive,首先进行valueOf得到object,继续进行toString()得到“2”,式子专为"2"==1

    对“2”进行toNumber得到2,式子转为2==1

    所以obj==1得到false 


    例子5:

    []==[]

    左右是不同的对象,所以false

    ![]==[]

    首先![]==false,这里[]是一个即存在的对象,若将其强制专为bool类型,通过!![]得到ture,所以![]==false,此时式子专为false==[] 

    然后false专为0,式子专为0==[]

    然后[]专为"",式子专为0==“”

    然后""转为0,式子专为0==0

    所以![]==[]得到true


    例子6:

    !{}=={}

    首先!{}专为false,规则和5一样,式子转为false=={}

    false专为0,式子转为0=={}

    对{}进行toPrimitive得到"[object Object]",式子专为0=="[object Object]"

    对"[object Object]"进行toNumber得到NaN,式子专为0==NaN

    所以!{}=={}得到 false 

  • 相关阅读:
    linkedLoop
    loopqueue
    expect 切换用户
    二叉树的实现
    栈的链表实现, 底层使用链表
    栈的数组实现
    RSA加密算法
    输入一个链表,反转链表后,输出链表的所有元素
    输入一个链表,输出该链表中倒数第k个结点
    ansible中include_tasks和import_tasks
  • 原文地址:https://www.cnblogs.com/stephenykk/p/3860308.html
Copyright © 2011-2022 走看看