一、原始值转化为原始值
    1、Number
    Number( null ) => 0
    Number( undefined ) => NaN
    Number(Infinity) => Infinity
    2、Boolean
    虚值: 0, -0,-infinity,undefined,null,NaN,’’,false
    其余都会转化为true。
    空字符串转化为false,但是包含空格的字符串会转换为true console.log( ‘ ‘ ) => true

    typeof 返回值
    console.log(typeof /e/ ) => ‘object’
    console.log(typeof Date ) => ‘function’
    下面两个值虽然在打印台输出时间字符串,但是Date() 为字符串,new Date() 是对象,系统自动解析为时间字符串
    console.log(typeof Date()) => string’
    console.log(typeof new Date()) => ‘object’
    3.toString
    显示转化对象类型值的话,优先调用toString方法,如果返回原始类型值,再调用包装类原型上的toString方法。

    1. let a = {
    2. valueOf:()=>{return 123},
    3. toString:()=>{return 321}
    4. }
    5. //1、调用toString方法,返回数字321,
    6. //2、再调用Number包装类对象原型的toString方法(Number.prototype.toString)
    7. console.log(String(a)) // => '321'
    8. 相加运算的时候,还是先调用valueOf,再调用toString方法。
    9. console.log(1 + a) // => 124

    二、对象转原始值
    1、Boolean
    空对象和空数组都转化为true,不是falsey
    console.log(Boolean([])) => true
    console.log(Boolean()) => true

    2、转Number
    调用对象自身的ValueOf,如果不能得到原始值,再调用toString方法。如果两个方法都不能返回原始值,系统会报错。
    Object.prototype.toString会返回字符串
    Function.prototype.toString方法返回函数体字符串
    Array.prototype.toString默认重写了,将每个元素字符串化后,再拼接起来。所以
    Number([12]) = > 12
    Number([1,2]) => NaN 在数组转化为字符串的时候,Array.prototype.toString会转化为 ‘1,2’ ,所以Number(‘1,2’) 返回NaN