• JavaScript之隐式类型转换


    布尔操作符(!、&&、||)

    当使用 条件判断语句(if...else) 以及 布尔操作符(!、&&、||) 时,会调用Boolean()进行隐式类型转换

    • 转换为false的有:0, null, undefined, NaN, '', false
    • 其余都为true([], {}为true)
    ![];  //  !Boolean([]);   ------------>    false     
    !2;   // false
    
    !null; //  !Boolean(null);   ------------>  true
    !undefined;  // true
    !0;  // true
    
    if([]) consolo.log('true');   //  if(Boolean([])) ... ----------->  true  

     

    乘/除法操作符(*、/)

    • 若有一个操作数为NaN,则结果为NaN
    • 若其中一个操作数不为数字,则调用Number()将其转换为数值
    2 * '5';   // 10
    2 * '5a';  // 2 * Number('5a')  -------->  2 * NaN  ------------>   NaN

     

    加法操作符(+)

    • 若有一个操作数为NaN,结果为NaN
    • 若有一个操作数为字符串,则将另一个数转换为字符串然后拼接
    • 若有一个操作数为对象,则调用对象的toString方法再执行上一步
    // num: 数值操作数   str: 字符串  obj: 对象
    num + 非字符串操作数(NaN/undefined/null/false/true) = num + Number(非字符串操作数)
    num + str = 'numstr';        // 1 + 2 + '3' = '33'
    
    str + NaN = 'strNaN';        //  '1' + NaN = '1NaN'
    str + null = 'strnull';      // '1' + null = '1null'
    str + true = 'strture';
    
    obj + num = obj.toString() + num;  // Math + 123 = '[object Math]123'
    obj + str = obj.toString() + str;  // Math + '123' = '[object Math]123'

     

    减法操作符(-)

    • 若一个操作数为字符串、null、undefined、布尔值,就调用Number()将其转换为数值再运算
    • 若一个操作数为对象则调用该对象valueOf(),没有valueOf()则调用toString()
    1 - '2' = -1;
    1 - '123a' = NaN; // 1 - Numer('123a')
    1 - Math = NaN;   // 1 - Math.valueOf()
    1 - true = 0;

     

    关系操作符(>、<、>=、<=)

    • 与NaN比较都会返回false
    • 若两个操作数都为字符串,则比较字符串的编码值
    • 若有一个操作数为数值,则对另一个操作数用Number()转换
    • 若有一个操作数为对象,则调用该对象valueOf(),没有valueOf()则调用toString()
    4 > '2';  // true
    4 > '2a'; // false
    4 > Math; // false
    4 > true; // true
    
    'ab' > 'a' // true

    相等操作符(==、!=)

    • 字符串、布尔类型和数值比较,现将前者用Number()转换为数值
    • 若一个操作数是对象另一个不是,则调用该对象valueOf(),没有valueOf()则调用toString()
    • 若两个操作数都是对象,则比较它们是不是同一个对象(地址是否相同)
    • null和undefined是相等的
    • null和undefined不会转换成任何值
    • 任何数都不等于NaN,包括NaN自己
    // true
    123 == '123';
    1 == true;
    '123' == new String(123);
    123 == new String(123);
    null == undefined;
    
    // false
    null == 0;
    2 == true;
    new String(123) == new String(123); 

    全等操作符(===、!==)

    全等操作符不会转换操作数

    123 ===  '123';  // false
    null === undefined; // false

    总结

    你能说说下面结果是什么以及原因吗?

    [] == 0;  // 1.??
    {} == 0;  // 2.??
    0 == {};  // 3.??
    [] == {};  // 4.??
    1. true
    2. true
    3. error: Uncaught SyntaxError: Unexpected token ==
    4. false

    根据相等操作符的规定,当一个操作数为对象另一个不是时,会调用对象的valueOf()

    [] == 0;  --------->  [].valueOf()  ----->  ''  -----> Number('')  ----> 0

    当两个操作数都为对象则会比较它们是否指向同一块区域,而[]和{}是两个独立的对象,所以为false。

  • 相关阅读:
    转载JGTM' 2004[MVP]有关AOP的三篇精彩文章
    新增Skin
    发表文章的要求
    自定义UserControl的属性为什么不能在设计时显示在属性窗口中
    .Text学习笔记(一)
    访问类的private或internal成员[转载]
    博客园对发表文章的一些要求
    博客园成立了管理团队
    推荐一篇介绍.NET MetaData的文章
    让大家久等了:终于完成了AOP尝鲜系列之第三部[JGTM'2004 [MVP]文章转载]
  • 原文地址:https://www.cnblogs.com/wind-lanyan/p/8696382.html
Copyright © 2020-2023  润新知