JavaScript中类型的强制转换与隐式转换详解

编辑: admin 分类: javascript 发布时间: 2022-01-01 来源:互联网
目录
  • 一、隐式转换
    • 双等号里的转换
    • Boolean 类型转换
    • "+" 与 "-"
  • 二、强制类型转换
    • new String 与 ' '
  • 总结

    一、隐式转换

    以下语句的执行结果是什么?

    A. undefined == null
    B. isNaN("100")
    C. parseInt("1a") === 1
    D. [ ] instanceof Array
    

    答案:

    A. undefined == null 为 true; undefined === null 为 false

    B. 当传入 NaN 或能被转换成 NaN 的值,isNaN 返回 true,"100"会被先转成 Number–>100,不为 NaN,因此返回 false

    C. parseInt("1a")只会解析前面是数字的部分,即只解析"1",parseInt("1a1”) === 1 也为 true

    D. [ ]是个空数组,返回 true

    双等号里的转换

    热身完毕再来看一段代码:

    if ([]) {
      console.log(true);
    }
    

    结果输出了 true。

    其实 [] 为 false,因为在等号比较时,如果有一边是 Boolean 值,会优先将左右两边的数据转为 Number,
    即:

    Number([]); // 0
    Number(false); // 0
    

    因此[] 为 false。

    但是,但是,进行 if 判断时,会将数据转为 Boolean 类型,

    即:

    Boolean([]); // true
    

    所以可以输出 true。

    总结一些双等号判断时的技巧:

    1. 如果双等号前后有 NaN,一律返回 false;
    2. 如果双等号前后有布尔值(0,1 也算),一律转成数字再比较,(false 为 0,true 为 1);
    3. 如果双等号前后有字符串,分为三种情况:
      1. 另一端是对象,则对象使用 toString 或者 ValueOf 进行转换;
      2. 另一端是数字,字符串转数字;
      3. 另一端是字符串,直接比较;
      4. 其他一律返回 false。
    4. 如果一端是数字,另一端是字符串如 '3'则参考第三条。另一端是对象,取对象的 toString 或 ValueOf 结果进行比较,其他一律返回 false;
    5. null 和 undefined 不进行类型转换,但是它们俩相等;

    Boolean 类型转换

    var test = new Boolean();
    console.log(test);
    
    var test = new Boolean(0);
    console.log(test.valueOf());
    
    var test = new Boolean(null);
    console.log(test.valueOf());
    
    var test = new Boolean("");
    console.log(test.valueOf());
    
    var test = new Boolean(NaN);
    console.log(test.valueOf());
    

    答案为:

    false false false false false

    原理如下:

    1. 当作为一个构造函数(带有运算符 new)调用时,Boolean() 将把它的参数转换成一个布尔值,并且返回一个包含该值的 Boolean 对象,注意这里返回的是 Boolean 对象,可以通过 toString 或者 valueOf 取值;
    2. 如果作为一个函数(不带有运算符 new)调用时,Boolean() 只将把它的参数转换成一个原始的布尔值,并且返回这个值——强制类型转换;
    3. 如果省略 value 参数,或者设置为 0、-0、null、""、false、undefined 或 NaN,则该对象设置为 false。否则设置为 true(即使 value 参数是字符串 "false”)。

    "+" 与 "-"

    console.log(1 + "2" + "2");
    console.log(1 + +"2" + "2");
    console.log("A" - "B" + "2");
    console.log("A" - "B" + 2);
    

    输出结果如何?

    结果为:122 32 NaN2 NaN

    解析:

    1. 数字和字符串相加,会将数字转为字符串,所以结果是字符串拼接,第一句输出"122";
    2. +"2”,这里的一元运算符+,会将字符串转为数字,于是 1+ +"2” = 1+2 = 3,再与后面的字符串合并,所以第二句输出”32";
    3. 减号会将减号两边都先转化成数字,而 Number("A”)、Number("B”)结果是 NaN,减法操作中,只要有一方为 NaN,结果都是 NaN,因此第三句是 NaN 和"2"的拼接,结果为 NaN2(第 4.1 点中提到,双等号其中一方为 NaN,结果为 false);
    4. 根据前一句的解析,"A”-"B"结果为 NaN,与数字 2 相加,结果还是 NaN

    二、强制类型转换

    对于代码 var a = 10.42; 取出 a 的整数部分,以下代码哪些是正确的?

    A. parseInt( a );
    B. Math.floor( a );
    C. Math.ceil( a );
    D. a.split('.')[0];
    

    答案:AB

    很多人看一眼就会选择ABC

    解析:

    A. parseInt 转换为整数,默认为 10 进制,结果为 10;

    B. floor 向下取整,结果为 10 —— floor 是地板的意思,向下取整,辅助记忆;

    C. ceil 向上取整,结果为 11;

    D. split 操作数必须是正则或字符串,结果为 TypeError。

    new String 与 ' '

    下面哪些执行结果为 true?

    A. 'foo' == new function(){ return String('foo'); };
    B. 'foo' == new function(){ return new String('foo'); };
    C. [] == 0
    D. ![]
    E: !0
    

    答案:

    A:下面细说;

    B:下面细说;
    C:Number([])结果是 0,因此 C 选项正确;
    D:对象总等于真,但是为什么在判断一个空对象 == true 或者 === true 得到的结果都是 false 呢?

    根据我们在双等号那里的总结可知,双等号有一方为布尔值时,两边都会转换为 Number 类型,所以控制台测试空对象== true 或者 === true,实际上都是在执行 空对象==1 或者 === 1,所以才会返回 false,因此,如果你想验证对象总等于真,应该使用!{} 和 !!{}  !{}; // false;   !!{}; // true

    E:由于 Boolean(0) == false,因此!0=true,正确。

    说说 AB 选项,由于使用 new 关键字,调用 function 构造函数,结果变得出乎我们的意料。

    首先我们要知道,当使用 new 调用一个构造函数时,如果内部返回了一个引用对象(数组,对象,函数等)都将覆盖 new 创建的匿名对象。

    如果返回一个原始类型(无显式 return 时,其实是返回了一个 undef【文章出处http://www.1234xp.com/yz.html 欢迎转载】ined),那么就返回了 new 创建的匿名对象。

    如此看来,

    A 选项中,构造函数内返回的是一个字符串,那么最终构造函数返回的是 new 创建的匿名对象,也就是一个空对象。

    B 选项中,构造函数内部返回的是一个字符串对象,那么最终构造函数返回的是这个对象。

    总结

    到此这篇关于JavaScript中类型的强制转换与隐式转换的文章就介绍到这了,更多相关JavaScript类型强制转换与隐式转换内容请搜索hwidc以前的文章或继续浏览下面的相关文章希望大家以后多多支持hwidc!