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 

  • 相关阅读:
    PAT (Basic Level) Practise 1013 数素数
    PAT (Basic Level) Practise 1014 福尔摩斯的约会
    codeforces 814B.An express train to reveries 解题报告
    KMP算法
    rsync工具
    codeforces 777C.Alyona and Spreadsheet 解题报告
    codeforces 798C.Mike and gcd problem 解题报告
    nginx + tomcat多实例
    MongoDB副本集
    指针的艺术(转载)
  • 原文地址:https://www.cnblogs.com/stephenykk/p/3860308.html
Copyright © 2011-2022 走看看