1. 乘法

  1. console.dir(5 * '5'); //25
  2. console.dir(5 * 'a'); //NaN
  3. console.dir(5 * 'NaN'); //NaN
  4. console.dir(5 * 'null'); //0
  5. console.dir(5 * undefined); //NaN
  6. console.dir(5 * 5); //25

乘法隐形转换原则:

  • 如果2个数值都是数字,那么直接进行乘法运算,如果乘积数值超过了ECMAScript的数值表示范围,则返回Infinity(正无穷)或者 -Infinity(负无穷)
  • 如果一个数是NaN,那么结果就是NaN
  • 如果 Infinity与 0 相乘,结果是NaN
  • 假如一个操作符是数字,另外一个不是数值,那么先用Number()函数,将其进行转化,将转化出来的值与数字进行相乘。假如转换出来的结果出现NaN,那么结果就是NaN。

    2. 除法

    1. console.log(5 / '5'); //1 将数字转化为数字进行相除
    2. console.log(5 / 'a'); //NaN 将'a'用Number()函数进行转化,出来的值是NaN,结果就是NaN
    3. console.dir(5/NaN);//NaN
    4. console.dir(5/null);//Infinity null用Number()函数进行转化,结果是0,那么5/0是正无穷
    5. console.dir(null/5);//0 同上0/5是0
    6. console.dir(5/undefined);//NaN undefined 用Number()进行转化,结果是NaN
    7. console.dir(5/5);//1
    8. console.dir(5/0);//Infinity
    9. console.dir(0/5);//0
    10. console.dir(0/0);//NaN //0除以0结果是NaN

    除法隐性转换原则:

  • 和乘法类似,唯一多的一条就是0/0结果是NaN

    3. 取余

    取余经常在求奇偶数的式子中使用,通过判断是否与 2 整除来确认奇偶性

    1. console.dir(16%"5"); //1 将字符串5通过Number()转化为5然后进行求余
    2. console.dir(5%"a");//NaN
    3. console.dir(5%NaN);//NaN
    4. console.dir(5%null);//NaN 将null 通过Number()转化,结果是0,然后计算5%0 ,结果是NaN
    5. console.dir(null%5);//0 同上0%5 取余,结果是0
    6. console.dir(5%undefined);//NaN
    7. console.dir(5%5);//0
    8. console.dir(5%0);//NaN
    9. console.dir(0%5);//0
    10. console.dir(0%0);//NaN
    11. console.dir(Infinity%Infinity);//NaN
    12. console.dir(5%Infinity);//5
    13. console.dir(Infinity%5); //NaN

    取余隐形转换原则:

  • 被除数是无穷大,除数是有限大的值,那么结果是NaN

  • 被除数是有限大的值,除数是0,那么结果是NaN
  • Infinity % Infinity结果是Nan
  • 被除数是有限大的值,除数是无穷大的值,结果是被除数
  • 被除数是0,结果是0

    4. 减肥

    1. console.dir(16 - "5");//11
    2. console.dir(5 - "a");//NaN
    3. console.dir(5 - NaN);//NaN
    4. console.dir(5 - null);//5
    5. console.dir(5 - undefined);//NaN
    6. console.dir(5 - 5);//0
    7. console.dir(5 - true);//4
    8. console.dir(5 - "true");//NaN
    9. console.dir(5 - "");//5
    10. console.dir(5 - Infinity);//-Infinity
    11. console.dir(Infinity - Infinity);//NaN
    12. console.dir("两个数的差是" + 5 - 5);//NaN
    13. console.dir("两个数的差是" + (5 - 5));//两个数的差是0

    减法隐性转换原则:

  • Infinity - Infinity 结果是NaN

  • -Infinity - Infinity 结果是-infinity
  • 一个数字减Infinity结果是-Infinity
  • Infinity - (Infinity) 结果是Infinity
  • 如果操作数是对象,则调用对象valueOf方法,如果结果是NaN那么结果就是NaN。如果没有valueOf方法,那么调用toString()方法,并将得到的字符串转换为数值。

    5. 关系操作符

    1. console.dir(16>"5"); //true
    2. console.dir("16">"5");//false
    3. console.dir(5<"a");//false
    4. console.dir(5>=NaN);//false
    5. console.dir(5<NaN);//false
    6. console.dir(NaN>=NaN);//false
    7. console.dir(5>=null);//true
    8. console.dir(5>=undefined);//false
    9. console.dir(5>=5);//true
    10. console.dir(5>=true);//true
    11. console.dir(5>="true");//false
    12. console.dir(5>="");//true
    13. console.dir("Brick">"alphabet");//false B的字符串编码值是66 ,而a的字符串编码是97.因此false
    14. console.dir("brick">"alphabet");//true 小写字母b比a大,所以是true

    关系操作符隐性转换法则:

  • 与减法相同

    6. 加法运算

    加法运算的隐性转换与之前其他不同,之前都是一方有数字就转换number型,但加法循环只要一方有字符串型,就转为字符串型

    1. console.dir(16+"5"); //156
    2. console.dir(5+"a");//5a
    3. console.dir(5+NaN);//NaN
    4. console.dir(5+null);//5
    5. console.dir('5'+null);//5null
    6. console.dir(5+undefined);//NaN
    7. console.dir(null+undefined);//NaN
    8. console.dir(5+5);//10
    9. console.dir("两个数的和是"+5+5);//两个数的和是55
    10. console.dir("两个数的和是"+(5+5));//两个数的和是10

    加法运算隐式转换原则:

  • 有一个是字符串,那么另外一个也会转换为字符串进行拼接。假如一个是字符串,另外一个是null或者undefined,那么相加,null或者undefined就会调用String()方法,获得字符串 ‘null’ 或者 ‘undefined’,然后进行拼接。

  • 假如一个数字加null或者undefined,那么还是把null或者undefined进行Number()转换之后再相加。

    7. 相等操作符

    当判断两个不同类型的数时,ECMAScript提供了两组操作符。第一组是等于和不等于,它们在比较之前执行转换。第二组是全等和全不等,它们 在比较之前不执行转换。

    1. 等于和不等于

  • 如果存在布尔值,则会将布尔值转换成数值型来进行比较,true转换成1;false转换成0

  • 如果一个为字符串,一个为数值,则会尝试将字符串转换成数值来进行比较
  • 如果一个操作数是对象,另一个操作数不是,则调用对象的 value() 方法取得其原始值,再根据前面的规则进行比较。
  • 在进行比较时,这两个操作符会遵循如下规则:
    1. - null undefined 相等
    2. - null undefined 不能转换为其他类型的值再进行比较
  • 如果有任一操作数是 NaN,则相等操作符返回 false,不相等操作符返回 true。记住:即使两个操作数都是NaN,相等操作符也返回 false,因为按照规则,NaN 不等于 NaN
  • 如果两个操作数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则相等操作符返回 true。否则,两者不相等。

总结一些特殊的情况及比较的结果:

  • null == undefined true
  • "NaN" == NaN false
  • NaN == NaN false
  • 7 == NaN false
  • NaN != NaN true
  • false == 0 true
  • true == 1 true
  • true == 2 false
  • null == 0 false
  • "5" == 5 true

    2. 全等与不全等

    全等操作符由三个等号===构成,只有在操作符两边的值在不需要转换的情况下相等才返回true
    1. var num=('55' === 55) //false 类型不同,需要转换为数值型
    2. var num=('55' == 55) //true 判等操作符只确定转后后是否相等
    不全等操作符由一个叹号和两个等号组成!==,只有操作符两边在不转换的情况下不相等才为true
    1. var num=('55' !== 55) //true 类型不同,不相等
    2. var num=('55' != 55) //false 转换后值相等