美文网首页
JS必备基础之隐式类型转换、包装类

JS必备基础之隐式类型转换、包装类

作者: 张先觉 | 来源:发表于2020-10-16 09:58 被阅读0次

    #显示类型转换

    console.log(parseInt('xx123'),parseInt('123xxx'),parseInt('1xxx23'))打印结果是什么?

    数据类型转换:Number、String、Boolean、null、undefined之间的转换;
    显示类型转换常用方法:Number()、parseInt()、parseFloat()、String()、Boolean();

    console.log(parseInt('xx123'));  // 打印结果:NaN
    console.log(parseInt('123xxx')); // 打印结果:123
    console.log(parseInt('1xxx23')); // 打印结果:1
    
    // parseInt(……,radix)
    // radix 基数、进制 2-36(默认十进制)
    console.log(parseInt("10", 16));  // 打印结果:16
    

    #隐式类型转换

    console.log(2 > 1 == 3)打印结果是什么?

    隐式类型转换:JS偷偷地做了类型转换,不用你管
    1. ++ --
    2. ''+
    3. ''- * / % > >= < <= == !=
    4. undefined、null与数字进行比较,undefined、null与数字没有关系,怎么比较都是false
    5. isNaN(),会先进行Number()数据类型转换,再判断是否是数字。
    6.(-true)、(+undefined),正负号隐式类型转换为Number,所以,(-true) -> -1(+undefined)->NaN
    7.(!!" ")和(!!"")的区别?!!隐式转换Boolean。注意," "空格字符串为true,而""空字符串是false

    var a = "123";
    a++;
    console.log(a); // 过程: Number(a) > a++ > console.log()
    
    
    console.log("js" + 123); // 过程:String(123) > ('js' + '123') > console.log()
    
    
    console.log("2" % 3); // 过程:Number('2') > ('2' % 3) > console.log()
    
    
    console.log(2 > 1 == 3); // 结果:false   分析:2 > 1先得到true; 再隐式类型转换以下Number(true)得到1,最后,拿1和3比较;
    
    
    console.log(undefined > 0, undefined < 0, undefined == 0); // 结果:false,undefined和0没有关系,怎么比较都是false
    console.log(null > 0, null < 0, null == 0); // 结果:false,null和0没有关系,怎么比较都是false
    console.log(null == undefined, null === undefined); // 结果:true false,既然都和0没有关系,干脆结果相等算了,但是类型不一样。
    
    
    console.log(isNaN(null), Number(null), isNaN(undefined), Number(undefined)); // 打印结果:false 0 true NaN
    

    #隐式类型练习

    • 练习1:(-true)、(+undefined)
    if (typeof a && -true + +undefined + "") {
        console.log("通过了");
    } else {
        console.log("没有通过");
    }
    
    // console.log(-true);  -> -1
    // console.log(+undefined);  -> NaN
    // console.log(-true + -undefined + ""); -> "NaN"
    
    • 练习2: !!、!!" "、!!""
    console.log(!!" " + !!"" - !!false || "未通过");
    
    // console.log(!!" "); -> true
    // console.log(!!"");   -> false
    // console.log(!!false);    -> false
    

    # 包装类:将原始值转换成对象

    原始值是没有属性和方法的!如果非要让原始值拥有自己的属性例如:var str = '123';console.log(str.length);,该怎么办呢?所以,JS引擎提供了三种构造函数:Number、String、Boolean,能将原始值转换成为对象。

    • var str = '123';console.log(str.length);打印结果为何是3?分析?
    var str = "123";
    console.log(str.length); // 结果:3
    
    // 分析
    // console之前,JS引擎会先将str转成对象。例如:“console.log(new String(str).length)” 
    
    • var str = '123';str.length=1;console.log(str.length);打印结果为何是3?分析?
    // 案例1:
    var arr = [1,2,3,4,5];
    arr.length = 3;
    console.log(arr); // 打印结果:[1,2,3]
    
    // 案例2:
    var str = 'string';
    str.length = 3;
    console.log(str.length);  // 打印结果:6
    // 分析:
    // str.length = 3; -> new String(str).length = 3;没有变量储存,无奈之下,delete删除该属性
    // console.log(),JS引擎将str转成对象。例如:“console.log(new String(str).length)” 
    
    // 解决方案
    var str = 'string';
    var str1 = (str.length = 3);
    console.log(str1); // 打印结果: str
    
    • (练习题)修改下面代码,让其打印结果为string:
    var name = "xiaoming";
    name += 10;
    
    var type = typeof(name);
    if(type.length === 6) {
        type.text = 'string';
    }
    console.log(type.text); // 打印结果是:undefined
    
    
    // 分析:
    type.text = 'string';
     -> JS引擎隐式地进行包装类:new String(type).text = 'string'  
     -> 但是,没有变量可以保存该变量,只能默默地删除该属性,delete 
     -> 导致最后打印:undefined
     -> 解决方案:事先将type字符串变成对象,然后添加text属性,如此text属性便能保存下来。
    
    
    // 修改代码如下:
    var name = "xiaoming";
    name += 10;
    
    var type = new String(typeof(name));
    if(type.length === 6) {
        type.text = 'string';
    }
    console.log(type.text); // 打印结果是:string
    

    相关文章

      网友评论

          本文标题:JS必备基础之隐式类型转换、包装类

          本文链接:https://www.haomeiwen.com/subject/vttzpktx.html