当前位置 主页 > 网站技术 > 代码类 >

    实例分析JS中的相等性判断===、 ==和Object.is()

    栏目:代码类 时间:2019-11-17 18:08

    相信刚接触JS的人都会被他的想等性判断给整糊涂,看看下面代码,你能答对几个?

    NaN === NaN // false
    NaN == NaN // false
    Object.is(NaN, NaN) // true
    0 == false // true
    1 == true // true
    Number(null) === 0 // true
    null == 0 // false

    Javascript提供了三种不同的值比较操作,分别是严格相等、宽松相等、以及Object.is,希望看完下面的内容,能够彻底弄清楚他的判断逻辑。

    1. 严格相等 x === y判断逻辑

    1、如果x的数据类型和y的数据类型不相同,返回false;

    2、如果x是Number类型

    x是NaN,返回false y是NaN,返回false x的值和y的值相等,返回true x是+0,y是-0,返回true x是-0,y是+0,返回true 否则返回false

    3、其他类型参照SameValueNonNumber(x, y)

    断言:x,y不是Number类型; 断言: x,y的数据类型相同; x是undefined, y是undefined return true; x是null, y是null,return true; x是字符串类型,当且仅当x,y字符序列完全相同时(长度相同,每个位置上的字符也相同)返回true, 否则返回false; 如果x是布尔类型,当x,y都为true或者都为false时返回true,否则返回false; 如果x是symbol类型,当x,y是相同的symbol值,返回true,否则返回false; 如果x,y是同一个对象值,返回true,否则返回false;
    NaN === NaN // false
    undefined === undefined // true
    null === null // true
    undefined === null // false
    

    2. 宽松相等 x == y

    如果x,y的类型相同,返回x===y的结果; 如果x是null, y是undefined, 返回true; 如果x是undefined, y是null, 返回true; 如果x是数值,y是字符串, 返回x == ToNumber(y); 如果x是字符串,y是数值, 返回ToNumber(x) == y; 如果x是布尔类型, 返回ToNumber(x)==y 的结果; 如果y是布尔类型,返回 x==ToNumber(y) 的结果; 如果x是String或Number或Symbol中的一种并且Type(y)是Object,返回 x==ToPrimitive(y) 的结果 如果Type(x)是Object并且Type(y)是String或Number或Symbol中的一种,返回 ToPrimitive(x)==y 的结果 其他返回false
    12 == '0xc' // true, 0xc是16进制
    12 == '12' // true
    12 == '12c' // false, 说明ToNumber转换是用的Number()方法

    注意:

    Number(null) === 0
    但是
    null == 0 // false,

    2.1 ToNumber将一个值转换为数值类型

    详情参考数值类型转换

    如果是boolean类型, true返回1,false返回0; 如果是数值,只是简单的传入返回; 如果是null,返回0 如果是undefined, 返回NaN; 如果是字符串,字符串如果只包含数字,则将其转换成十进制数;如果是有效的浮点格式,将其转换成对应的浮点数值;如果是二进制或十六进制将其转换成对应的十进制数值; 如果是对象,调用对象的valueOf()方法,然后依照前面规则转换,如果valueOf返回值是NaN,则调用toString()方法,再依照前面的规则转换返回的字符串

    2.2 ToPrimitive

    toPrimitive(A)通过尝试调用 A 的A.toString() 和 A.valueOf() 方法,将参数 A 转换为原始值(Primitive);
    JS中原始类型有:Number、String、Boolean、Null、Undefined;

    不同类型对象的valueOf()方法的返回值:

    对象 返回值
    Array 返回数组对象本身。
    Boolean 布尔值
    Date 存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC
    Function 函数本身
    Number 数字值
    Object 对象本身。这是默认情况, 可以覆盖自定义对象的valueOf方法
    String 字符串值