• js类型转换、检测笔记


    转换函数

    //普通强制类型转换
    Number('1');//1
    //toNumber规则:true -> 1; undefined -> NaN; null -> 0; {} -> NaN; 对字符串遵循整值转换的规则,处理失败返回NaN
    //注意Number会将''、' '、' '等空字符串或其他空字符串的组合转换为0
     
    String(1);//"1"
    //toString规则:null -> "null";  undefined -> "undefined";  true -> "true"; 1 -> "1";   普通对象除非自行定义,否则使用内部的toString()(Object.prototype.toString())方法返回内部属性[[Class]]的值
     
    [1,2,3].toString();    //"1,2,3"
    var a = 1.07 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000 * 1000;
    a.toString();    //"1.07e+21"
     
    数字转各种进制
    var t = 60;
    t.toString(8); //74
    t.toString(16); //3c
     
     
    Boolean(1);//true
    //toBoolean规则:规定了假值包括:undefined,null,false, +0, -0, NaN, ""。其他的都是真值(这里面有例外,后面的假值对象就是特例)。
     
    //封装了假值的对象,说到底还是对象,对象转bool都应该为true
    var a = new Boolean(false);
    var b = new Number(0);
    var c = new String('');
    var d = Boolean( a && b && c);//true
    //但是和false做值比较时却和false相等
    a == false;//true
    a === false;//false
     
    //假值对象,转为bool时值为false
    Boolean(document.all);//false
     
     

    隐式强制转换

    var a = '20';
    var b = 10;
    var c  = [1,2];
    var d = [3,4];
     
    a+b;//"2010"
    c+d;//"1,23,4"
     
    +(加法运算符)只能用于数字和字符串(或者说可以转化为数字和字符串的值),如果有一方是字符串,则得到的结果就是字符串(执行字符串拼接)。否则应该为数字或者NaN(执行数字加法)
    c对象通过调用其valueOf()无法得到简单的基本类型,于是他转而调用toString()得到了“1,2”
    String(c)显式的转换为字符串实际上直接调用toString()方法
    例:
    var a = {
        valueOf: function(){ return 42;},
        toString: function(){return 4;}
    }
    a + "";//"42"
    String(a);//'4'
     
    []+{};//"[object Object]"
    解释:{}出现在+运算符中,被作为一个值(空对象来处理),[]和{}都最终调用toString来处理
    {}+[];//0
    解释:{}被认为是独立代码块(不执行任何操作),代码块结尾不需要分号,没有语法错误。后面的“+[]”被认为是显式的强制类型转换了。
    ({}+[]);//"[object Object]"
     
    [1,[2,3], {name:'1'}].toString();
    //"1,2,3,[object Object]"  数组的toString是对每一个数组元素做toString后的都好拼接
     
    - 是数字运算符,和*与/一样,只能适用于数字,最终都需要转换成数字再运算。
    "3.14" - 0;// 3.14
    [2] - [1];//1
     
    //隐式转换为布尔值
    if/for/while/do while/?:/(||与&&左边的操作数)
     
    //符号的强制转换
    var s1 = Symbol();
    Boolean(s1);//true
    s1 && 1;//1
    Number(s1);//语法报错
    s1 + 1;//语法报错
    String(s1);//"Symbol()"
    s1 + '';//语法报错
     

    ==表示值相等 ===表示全等(值和类型)

    基本类型的==和===结果会有差异
    数值、布尔、字符串可以做== ,类型不同时都是转换为数字再做比较   特殊的是数值类型值为NaN不与任何值相等(包括自己) NaN == NaN;//false
    null和undefined可以做==
    符号类型的值不与其他任何类型的值相等,并且具有唯一性(Symbol() == Symbol();//false)
     
    对象类型(引用类型)==和===比较方式相同
     
    对象和字符串、数字(这里没有说boolean,因为boolean会先转换为数字)的==比较,会先将对象调用toPrimitive抽象操作(先看valueOf看能否得到基本类型,如果不行则使用toString)
    42 == [42];//true
    var a = {
        valueOf: function(){ return 42;},
        toString: function(){return 4;}
    }
    a == 42;//true;
    new String('abc') == 'abc';//true, 对象会调用toPrimitive获得基本类型,new String('abc').valueOf();//'abc'
    new String('abc') === 'abc';//false
     
    //看一下让人头晕的情况
    "0" == false;
    false == 0;
    "0" == "";
    false == "";
    false == [];
    '' == 0;
    '' == [];
    '' == {};
    0 == [];
    "" == [null];
    0 == ' ';
     
    //怪异现象
    var a = {b:42};
    var b = {b:43};
    a < b;//false
    a == b;//false
    a > b;//false
     
    a <= b;//true; 会先判断简单的比较 a > b;然后将结果反转
    a >= b;//true 会先判断简单的比较 a < b;然后将结果反转
     
     

    比较大小

    字符串于数字比较,先转换成数字然后再比较,如果不能转换成数字(NaN),则进行字符串比较
    '1000' > 300 //true
    1000 > '300' //true
    '1000' > '300' //false
    '1000d' > 300 //false
    1000 > '30d' //false
     
     

    数字检测和转换

    isNaN是“检查参数是NaN或不是数字”就返回true,结果是基于Number的转化结果,Number转换是“整体值”转换。parseFloat的转换是“句首有效”转换
    'f'/1; //NaN
    isNaN('f');//true
    isNaN('f'/1);//true 
     
    isNaN('1');//false            Number('1');//1               parseFloat('1');//1         
    isNaN("0xf");//false          Number("0xf");//15            parseFloat("0xf");//0
    isNaN('1f');//true            Number('1f');//NaN            parseFloat('1f');//1
    isNaN('d1');//true            Number('d1');//NaN            parseFloat('d1');//NaN
    isNaN('');//false             Number('');//0                parseFloat('');//NaN
    isNaN(true);//false           Number(true);//1              parseFloat(true);//NaN
    isNaN(null);//false           Number(null);//0              parseFloat(null);//NaN
    isNaN(undefined);//true;      Number(undefined);//NaN       parseFloat(undefined);//NaN
    isNaN({});// true;            Number({});//NaN              parseFloat({});//NaN
    isNaN(Symbol());//语法报错     Number(Symbol());//语法报错    parseFloat(Symbol());//语法报错
     
     
    //parseFloat只解析10进制,parseInt可以由第二个参数控制进制。
    //解析过程是“参数先转换成字符串,然后解析字符串中的数字”
    parseInt(1/0, 18);//NaN
    parseInt(1/0, 19);//18    过程为:parseInt((1/0).toString(), 19) -> parseInt("Infinity", 19) -> 18;//"I"可以用19进制解析,但是“n”不行
    parseInt(new String('42')) -> parseInt(new String('42').toString()) -> parseInt('42') -> 42
    parseInt(0.00008) -> parseInt((0.00008).toString()) -> parseInt('0.00008') -> 0
    parseInt(parseInt, 16) -> parseInt(parseInt.toString(), 16) -> parseInt("function parseInt() { [native code] }", 16) -> 15
    parseInt(false, 16) -> parseInt(false.toString(), 16) -> parseInt("false", 16) -> 250  
    parseInt('0x10') -> ... -> 16;   //没有设置进制的时候默认都是10进制,只有当有“0x”时被识别为16进制,不识别8进制的“0”;这块和Number中字符串转数字一样
    parseInt('010') -> ... -> 10;
    parseInt(010) -> parseInt((010).toString()) -> parseInt((8).toString()) ->  parseInt('8') -> 8
    //总结:对字符串的解析,默认只能识别10进制和“0x”的16进制
     
    Number('0x10');//16
    Number(0x10);//16
    Number('010');//10
    Number(010);//8
    //js数值
    010;//8
    0x10;//16
    10;//10
     
    Number.isNaN只检测是否是NaN
    Number.isNaN('f');//false
    Number.isNaN('f'/1);//true;
     
    if(!Number.isNaN){
        Number.isNaN = function(n){
            return n != n;
        }
    }
     

    其他

    一元运算符 +强制转换为数字
    +new Date();    //1545891424614       不推荐使用,使用Date.now()
    +"02";               //2
    +"-2";                //-2
     
     
    var a = {b:42, c:"42",d:[1, 2, 3]}
    JSON.stringify(a, ['b']);//"{"b":42}"
    JSON.stringify(a, function(k, v){if(k !== 'c') return v;});//"{"b":42,"d":[1,2,3]}"
    JSON.stringify(a, null, 4);
    //缩进4个字符
    "{
        "b": 42,
        "c": "42",
        "d": [
            1,
            2,
            3
        ]
    }"
  • 相关阅读:
    第三章 C++中的C 《C++编程思想》
    网络时间协议 网络对时程序
    不相交集类应用:迷宫生成
    第一章 对象导言 第二章 对象的创建与使用
    获取本机IP MAC地址
    详解C#制做Active控件的五个步骤
    js HTML编码转换
    Web应用Word编辑
    HTML <map>标签的使用
    Web(浏览器)打开运行WinForm应用程序
  • 原文地址:https://www.cnblogs.com/chuaWeb/p/12546876.html
Copyright © 2020-2023  润新知