JS 隐式转换

隐式转换

  1. 数据类型

    • 基本数据类型: undefined string boolean null number symbol(es6新加)
    • 复杂数据类型:object
    • typeof返回的7中数据类型: undefined string boolean null number object function
  2. 数字与其他类型加法

    • 字符串 123+ "456" == "123456" 数字转字符串 toString()
    • 布尔类型 123+false == false+123 = 123, 123+true==true+123==124 布尔类型转数字0
    • null类型 123+null==null+123==123 null转数字0
    • undefined类型 123+undefined==Nan undefined转数字NaN
  3. 字符串与其他类型加法

    • 布尔类型 "hello" + false == "hellofalse" , "hello"+true=="hellotrue" 布尔类型转字符串
    • 数字类型 "hello"+123=="hello123" 数字类型转字符串
    • null类型 "hello"+null=="hellonull" null类型转字符串
    • undefined "hello"+undefined=="helloundefined" undefined转字符串
  4. null和undefined

    • null+undefined == NaN 两者都转数字, null转数字为0, undefined转数字为NaN 任何数字与NaN相加为NaN, 判断是否为NaN不能用==, NaN于自身都不等, 使用isNaN()函数
  5. 其他类型的运算

    • 减法,乘法,除,取余,大于小于等操作都转成Number类型
        1-false == true
        20-"1" ==19
        20 < "40" == true
        "1">false == true
        "1abcd">false == false//(因为"1abcd转数字为NaN")
        "1abcd"
    • String类型的带有字符的比如: '1a' ,'a1' 转化为 NaN 与undefined 一样
    • parseInt, parseFloat和Number转化
      • parseInt("123abcd") = 123, 但是Number("123abcd") == NaN(这里应该使用isNaN判断), Number要严格一些,基本上,只要有一个字符无法转成数值,整个字符串就会被转为NaN。
      • parseFloat("1.23a4.56b.78") ==1.23)
  6. 转换为boolean类型

    • false: null, undefined, 0, '', ""(空串),false , NaN
    console.log(!!null)
    console.log(!!undefined)
    console.log(!!0)
    console.log(!!"")
    console.log(!!'')
    console.log(!!NaN)
    
    • undefined == null 返回true 比较特殊 (null与自身以及undefined等 与其他都不等)
    • ** 0 == undefined**, undefined==0 返回false
    • ** null == 0**, 0 == null 返回false
    • ** null == "0", ** "0" == null 返回false
    • ** null == false** 返回false
    • ** NaN == undefined, NaN == null ** 返回false
    • ** "" == false** 返回true ( 两者都转数字0)
    • ** "0" == false ** 返回true, (两者都转数字0)
    • ** 0 == false** 返回true (两者都转数字0)
  7. Object的基本运算

    • obj与其他类型运算的时候, 会调用valueOf方法
    • 在调用String(obj)的时候, 会调用toString()方法
    • 对象的比较简单来说就是转化成字符串之后再进行比较
    0 == [];        // true, 0 == [].valueOf(); -> 0 == 0;
    '0' == [];      // false, '0' == [].toString(); -> '0' == '';
    2 == ['2'];     // true, 2 == ['2'].valueOf(); -> 2 == '2' -> 2 == 2;
    '2' == [2];     // true, '2' == [2].toString(); -> '2' =='2';
    
    []+{} // "[object Object]"
    []+[] // ""
    1+[], []+1 // "1"
    
    {}+[]  //0  这里[]解析成0
    
    {}+1 // 1
    1+{} // "1[object Object]"
    
    {}+{} // "[object Object, object Object]"
    
    /*  简单小结
    [] 解析为 "" 或者0  跟数字运算时解析成数字0, 与字符串运算时解析成空串
    []+{}, {}=[]
    {} 在前面就解析成 0
    {} 在前面就解析成 "[object Object]"
    {} 两个一起的话 都解析成为字符串 "[object Object]"
    */
    

你可能感兴趣的:(JS 隐式转换)