2、隐式类型转换 JavaScript

阅读前需了解:

  • 以下描述粗体部分为工作中常用到的场景。
  • 其他描述均为兴趣爱好了解即可。
  • 文中提到的运算均表示+-*/%,不包含比较运算。

!

  • !的优先级最高,任何falsefy或非falsefy的值进行非运算时,都会先转为true或false再参与其他运算
  • falsefy的值有 null undefined 0 '' NaN false

比较运算 == > <

  • 比较运算符会将两边都进行Number转换后再进行比较,如果两边都是字符串则通过ascii码比较首个字符

加运算 +

  • 任何数据类型的值与字符串相加都等于字符串。如下:


    image.png

    另:1+1+"1" 为 21 ,"1"+1+1为111,会按顺序执行

除运算 /

  • 正数/0 为 infinidy[ɪnˈfɪnəti] 数字类型
  • -负数/0 为 -infinidy
  • 0/0 为NaN

模运算(取余) %

  • 模运算是除法运算后,获取结果的余数部分
  • 当除数小于被除数,由于除不动,则除数的余数为自己本身
  • 当除数大于被除数时,结果为 除数 - ( 被除数 * 最大倍数 )
    image.png
  • 模运算中,只要被除数为0,结果则为NaN
  • 模运算其他语言扩展

字符串

  • 字符串与任意数据类型的值相加均为字符串。

  • 字符串通过new String()转换为String对象后,会变成类数组,其他原始值不会。

  • 纯数字的字符串自加或自减时,会转成number


  • 纯数字的字符串,使用-*/%与纯数字字符串运算时,会自动转成数字进行运算。

  • 非数字的字符串,使用-*/%运算时,得到的结果都是NaN。


    image.png

    image.png

    image.png
  • 数字和数字字符串比较,字符串会转成数字类型后进行比较。

  • 数字字符串和数字字符串比较是通过ASCII码进行比较。

boolean型

  • null undefined 0 '' NaN false 属于falsefy,其余的值通过! && || 运算时都会为true。

undefined

  • 特殊(优先级最高):undefined除了和null及它自己相等以外,和其他值都不相等
  • 特殊:Number(undefined)为NaN,因此参与比较运算的结果为false,参与+-*/的运算结果为NaN。

null

  • 特殊(优先级最高):null除了和undefined及它自己相等以外,和其他值都不相等
  • Number(null)为0。
  null == false // false
  null == 0 // false
  null == '' // false
  0 == false // true
  0 == '' // true


NaN 情况总结

  • isNaN会进行数字隐式转换,与Number()显示类型转换的结果相同。
  • 翻译为not a number 但 NaN typeof为'number'
  • 任何数与NaN进行运算,结果均为NaN。
  • 任何数(包括它自己)和NaN比较,返回的都为false
    image.png
  • NaN有哪些: 0/0、任意类型数值%0、NaN运算、undefined运算、非数字字符串的非加法运算。如下举例:
    image.png

扩展1 交换变量a和b的值

  • 要求:不定义第三个变量,如下:
a = a + b;
b = a - b;
a = a - b; 

扩展2 ++、--运算

a++ 为先输出后自加;
++a 为先自加后输出;
如下:

var a = 1;
var b = a++ + ++a + --a + a--;
console.log(a,b); // 结果为 1和8
// 过程解析
// a++ 先输出1  参与下一个运算前先自加 此时 a:2
// ++a  a = 3  输出 1+3
// --a a = 2 输出 1+3+2
// a-- 先输出 1+3+2+2 赋值给b   然后自减 此时a:1

比较运算符

  • 数字和数字字符串比较,字符串会转成数字类型后进行比较。
  • 数字字符串和数字字符串比较是通过ASCII码进行比较
    image.png
  • 纯数字和纯字符串比较,结果均为false
  • 百分号数字字符串属于纯字符串,和数字字符串不同,不能和数字比较大小。
  • NaN 是和包括自己在内的任何数据都不相等
    image.png
  • 数字字符串和数字字符串比较时会转成ASCII码,其他情况数字字符串均会转成纯数字进行运算

扩展3 [ ] { }

  • 所有数据类型通过 == 判断时,都会转成Number
  • 引用值进行 == 比较时,先toString后Number
[] == ![]
解析:
==左边 toString后为'',Number('')为0
==右边 !的优先级最高,[]为引用值,即为非falsefy的值,所以![]为false,Number(false)为0,所以最终的结果为true
{} == !{}
解析:
==左边toString后为'[object Object]',Number('[object Object]')为NaN
==右边!优先级最高,{}为非falsefy的值,因此!{}为false
NaN == false 结果为false

扩展4 " "

  • 带空格的字符串不属于falsefy,因此!" "为false
  • 但进行Number转换时,Number会将字符串进行trim,因此Number(" ")为0

interview questions

  • 写一个isNaN的函数,实现isNaN的功能
function isNaN(num){
    console.log(num);
    var res = Number(num) + '';
    if(res === 'NaN'){
        return true;
    }else{
        return false;
    }
}

你可能感兴趣的:(2、隐式类型转换 JavaScript)