typeof数据类型检测/等号比较的数据转换/任意数求和

421 阅读4分钟

typeof数据类型检测

typeof [value]

  • 返回结果都是一个“字符串”,字符串中包含对应的数据类型.
  • "number"/"string"/"boolean"/"undefined"/"symbol"/"bigint"/"object"/"function".
  • 局限性(缺陷):
    • typeof null => "object"
    • typeof 对象/数组/正则/日期... => "object" 基于typeof不能细分对象类型.
  • 检测原理:
    • 所有的数据类型值在计算机中,都是按照“二进制(0/1)”的值来进行存储的.

    • 对象数据类型的二进制值都是以 000 开头的(不论是普通对象还是数组正则对象都是如此).

    • null在计算中存储的二进制值:000.

    • typeof检测数据类型就是根据它的二进制值检测的,只要检测到是以000开始的,都认为是对象, 所以检测null时,也会认为是对象,则会返回 "object" .

         console.log(typeof typeof [10, 20]); // =>"string"
         // typeof [10, 20] -> "object"
         // typeof "object" -> "string" 
         function fn(x) {
            //x=undefined/null 都成立  改写=> x===undefined
            if (x == undefined) //检测x的值是不是undefined,当x=undefined或null都成立,可以改写=> x===undefined
            { 
                x = 0;
            }
            // 这种方案更好一些,因为“==”再比较的时候会进行数据类型的转换
            if (typeof x == "undefined") //检测x的类型是不是undefined
            {
                x = 0;
            }
        }
        fn(); 

"==" 与"==="

  • ==:相等,相对于“绝对相等”来说,浏览器如果发现两边类型不一样,默认会进行“隐式转换”,转换为相同的类型再进行比较

    • NaN==NaN 不相等
    • null==undefined 相等 null===undefined 不相等 null/undefined和其他任何值都不会相等
    • 若是字符串==对象,则把对象转换为字符串再进行比较.
    • 剩下的两边数据类型不一样的情况,都是按照“转换为数字然后再比较”的规则处理再进行比较.
  • ===:绝对相等(推荐),要求两边的数据类型和值都要相等,只要有一个不相等,结果都是false(不存在数据类型的隐式转换)

        console.log(10 == "10"); //true  会把"10"转化为数字10再进行比较.
        console.log(10 === "10"); //false 
        console.log("10"==[10]); //true  会把[10]转化为字符串"10"再进行比较.
        console.log("1"==true); //true  会把true转化为数字1,把"1"也转化为数字1再进行比较.
        console.log(0==[]); //true  先把[]转化为字符串"",再转化为数字0进行比较.

需求:验证obj是否为一个对象

        var obj = {};
        //这样写不行,因为 typeof null的值也是"object",而null不是对象,所以不能通过这个方法来判断obj是否为一个对象.
        if (typeof obj === "object") 
        {
            console.log('obj is an object~~');
        } 
        //这样写才可以,
        // !==:属于绝对不相等,==对应!=(不等于), ===对应!==(绝对不相等).
        if (obj !== null && typeof obj === "object") 
        {
            console.log('obj is an object~~');
        } 

需求:任意数求和

            var args = arguments;
            //思路:依次循环(遍历/迭代)集合中的每一项,把取出来的每一项进行累加
            var total = 0;
            for (var i = 0; i < args.length; i++) 
            {
                // i=0 第一轮循环  args[0]集合中的第一项  i++
                // i=1 第二轮循环  args[1]集合中的第二项  i++
                // i=2 循环结束(第一次只传递了两个值).
                // 循环的变量i从零开始,args这个集合中的每一项也是从索引零开始 ,
                  => 每一轮循环的时候,i存储的值正好是我们需要获取集合中当前项的索引 
                  => 每一轮循环 args[i] 获取的就是当前这一轮循环,从集合中取出来的当前项,i等价于当前项的索引
                var item = Number(args[i]);// item是每一轮循环拿到的值即当前值.
                if (!isNaN(item))  //当item是有效数字时才进行累加.
                //if(isNaN(item) === false)  //isNaN(item) === false 有效数字
                { 
                    total += item;
                }
            }
            return total;
        } 
        var res = sum(10, 20);
        console.log(res); 

        res = sum(10, 20, '30');
        console.log(res); 

        res = sum(10, 20, '30', 'AA');
        console.log(res); 
        
        //改为箭头函数
        var sum = (...args) => 
        {
            var total = 0;
            for (var i = 0; i < args.length; i++) 
            {
                var item = Number(args[i]);
                if (!isNaN(item)) 
                {
                    total += item;
                }
            }
            return total;
        };
        var res = sum(10, 20);
        console.log(res); 

        res = sum(10, 20, '30');
        console.log(res); 

        res = sum(10, 20, '30', 'AA');
        console.log(res); 

任意数求和

第一种方法:

         function sum() {
            var args = arguments;
            //思路:依次循环(遍历/迭代)集合中的每一项,把取出来的每一项进行累加
            var total = 0;
            for (var i = 0; i < args.length; i++) 
            {
                // i=0 第一轮循环  args[0]集合中的第一项  i++
                // i=1 第二轮循环  args[1]集合中的第二项  i++
                // i=2 循环结束(第一次只传递了两个值).
                // 循环的变量i从零开始,args这个集合中的每一项也是从索引零开始 ,
                  => 每一轮循环的时候,i存储的值正好是我们需要获取集合中当前项的索引 
                  => 每一轮循环 args[i] 获取的就是当前这一轮循环,从集合中取出来的当前项,i等价于当前项的索引
                var item = Number(args[i]);// item是每一轮循环拿到的值即当前值.
                if (!isNaN(item))  //当item是有效数字时才进行累加.
                //if(isNaN(item) === false)  //isNaN(item) === false 有效数字
                { 
                    total += item;
                }
            }
            return total;
        } 
        var res = sum(10, 20);
        console.log(res); 

        res = sum(10, 20, '30');
        console.log(res); 

        res = sum(10, 20, '30', 'AA');
        console.log(res); 


结果为:

image.png

第二种:改为箭头函数

      var sum = (...args) => 
        {
            var total = 0;
            for (var i = 0; i < args.length; i++) 
            {
                var item = Number(args[i]);
                if (!isNaN(item)) 
                {
                    total += item;
                }
            }
            return total;
        };
        var res = sum(10, 20);
        console.log(res); 

        res = sum(10, 20, '30');
        console.log(res); 

        res = sum(10, 20, '30', 'AA');
        console.log(res); 

结果为:

image.png

第三种:利用数组的方法实现求和

      var sum = (...args) => 
        {
            // 利用数组的方法实现求和
            var total = 0;
            args.forEach(item => 
            {
                item = Number(item);
                if (!isNaN(item)) 
                {
                    total += item;
                }
            });
            return total;
        }; 
        var res = sum(10, 20);
        console.log(res); 

        res = sum(10, 20, '30');
        console.log(res); 

        res = sum(10, 20, '30', 'AA');
        console.log(res); 


结果为:

image.png

第四种:基于reduce来求和

      var sum = (...args) => 
         {
            return args.reduce((total, item) => 
            {
                item = Number(item);
                isNaN(item) ? item = 0 : null; //当item满足isNaN(item)条件(即不是有效数字)时item = 0,
                                                不满足条件时,item =null相当于啥都不做.
                return total + item;
            }, 0);
        }; 
        var res = sum(10, 20);
        console.log(res); 

        res = sum(10, 20, '30');
        console.log(res); 

        res = sum(10, 20, '30', 'AA');
        console.log(res); 

   

结果为

image.png