JS基础语法(07)-比较运算符隐式类型转换

Posted 坤小

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JS基础语法(07)-比较运算符隐式类型转换相关的知识,希望对你有一定的参考价值。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        /*1.隐式类型转换:
             1.转string : + 字符串连接符
             2.转number: 自增自减 算术运算符 关系运算符(> < >= <= == != === !==)
             3.转boolean: ! 逻辑非

          2.面试题的一些坑:重新认识比较运算符 x==y
            a. 当x与y都为null或者undefined,   返回true
            b. 当x或y为NaN,返回false
            c. 当x或y都为:string,number,boolean。且数据类型不一致的时候,此时会隐式转换成number后比较
            d. 如果x或y存在对象类型,则会转为原始值后比较
                * 对象转原始值 : 先调用valueOf()方法获取原始值,然后调用toString()方法转为字符串
                    * valueOf() 默认返回自身
            e. x与y都为对象类型,则比较它们的引用地址。如果同一个地址则为true,不同地址则为false
        */

        //1.===: 全等运算符
        //严格匹配:值与数据类型必须要同时相等
        console.log(undefined === null);//false
        console.log("1" === 1);//false
        console.log([] === );//false

        //2. x == y :相等运算符
        //不严格匹配:当左右两边数据类型不一致的时候允许进行隐式数据类型转换(有前提条件)

        //例如
        console.log(Number(null));//0
        console.log(Number(undefined));//NaN
        console.log(undefined == null);//true  此时没有进行数据类型转换

        //2.1  当x与y都为null或者undefined,   返回true
        console.log(null == null);//true
        console.log(undefined == undefined);//true
        console.log(null == undefined);//true

        //2.2  当x或y为NaN,返回false
        /* NaN与任何数字都不等 */
        console.log(NaN == undefined);//false
        console.log(NaN == null);//false
        console.log(NaN == NaN);//false

        //2.3   当x或y都为:string,number,boolean。且数据类型不一致的时候,此时会隐式转换成number后比较

        console.log(1 == "1");//true   1 == Number('1')
        console.log("0" == false);//true   Number('0') == Number(false)

        //2.4 如果x或y存在对象类型,则会转为原始值后比较
        //对象转原始值 : 先调用valueOf()方法获取原始值,然后调用toString()方法转为字符串

        console.log([1, 2, 3].valueOf());//[1, 2, 3]       默认情况下valueOf方法返回自身
        console.log([1, 2, 3].valueOf().toString());// 1,2,3
        console.log([1, 2, 3] == "1,2,3");//true

        //关于空对象与空数组的原始值
        console.log([].valueOf().toString());//''   空字符串
        console.log(.valueOf().toString());//[object Object]   空字符串

        console.log([] == "");//true
        console.log( == '[object Object]');//true

        /*以下是常见的面试坑*/
        console.log([] == 0);//true
        /*分析过程
        (1)  [].valueOf ().toString ()  == ''
        (2) '' == 0
         */
        console.log(![] == 0);//true
        /*分析过程:一元运算符优先级高于二元运算符
       ![] = false
       false == 0
         */

        console.log( == 0);//false
        /*分析过程
       (1)  .valueOf ().toString ()  == '[object Object]'
       (2)  '[object Object]' == 0
        */
        console.log(! == 0);//true
        /*分析过程:一元运算符优先级高于二元运算符
       ! = false
       false == 0
         */

        //2.5 x与y都为对象类型,则比较它们的引用地址。如果同一个地址则为true,不同地址则为false

        var arr1 = [1, 2, 3];
        var arr2 = arr1;
        console.log(arr2 == arr1);//true  地址一致
        var arr3 = [1, 2, 3];
        console.log(arr1 == arr3);//false  地址不一致

        /*以下为面试题的一些坑*/
        console.log( == );//false   同时声明两个空对象,堆中地址不同
        console.log([] == []);//false   同时声明两个空数组,堆中地址不同
        console.log(null == 0);//false    相等比较  null不会转number,代表的是堆中的一个空地址(可以理解为堆地址的起点0x0000)
        console.log(null >= 0);//true   大小比较  null会转成number类型0
        console.log(null <= 0);//true    
    </script>
</body>

</html>

以上是关于JS基础语法(07)-比较运算符隐式类型转换的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript基础知识

JS隐式转换

js隐式转换

隐式类型转换

秋招快要开始了,前端笔试中的坑位-JS隐式转换问题

js 中的不同的数据类型之间作比较时的“隐式转换规则”(详细!!!)