在JavaScript中,toString()函数与valueOf()函数解决的是值的显示和运算的问题,所有引用类型都拥有这两个函数。

    • toString()函数
      • toString()函数的作用是把一个逻辑值转换为字符串,并返回结果。Object类型数据的toString()函数默认的返回结果是”[object Object]”,当我们自定义新的类时,可以重写toString()函数,返回可读性更高的结果。在JavaScript中,Array,Function,Date等类型都实现了自定义的toString()函数。
      • Array的toString()函数返回值为以逗号分隔构成的数组成员字符串,例如[1, 2,3].toString()结果为字符串’1,2,3’。
      • Function的toString()函数返回值为函数的文本定义,例如(function(x){return x 2;}).toString()的结果为字符串”function(x){return x 2;}”。
      • Date的toString()函数返回值为具有可读性的时间字符串,例如,new Date().toString()的结果为字符串”Sun Nov 25 201815:00:16 GMT+0800 (中国标准时间)”。
    • valueOf()函数
      • valueOf()函数的作用是返回最适合引用类型的原始值,如果没有原始值,则会返回引用类型自身。Object类型数据的valueOf()函数默认的返回结果是”{}”,即一个空的对象字面量。对于Array、Function、Date等类型,valueOf()函数的返回值是什么呢?
      • Array的valueOf()函数返回的是数组本身,例如[1, 2,3].valueOf()返回的结果为“[1,2,3]”。
      • function的valueOf()函数返回的是函数本身,例如(function(x){return x 2;}).valueOf()返回的结果为函数本身“function(x){return x 2;}”。
      • Date的valueOf()函数返回的是指定日期的时间戳,例如newDate().valueOf()返回的结果为“1543130166771”。
      • 如果一个引用类型的值既存在toString()函数又存在valueOf()函数,那么在做隐式转换时,会调用哪个函数呢?这里我们可以概括成两种场景,分别是引用类型转换为String类型,以及引用类型转换为Number类型。
        • 引用类型转换为String类型一个引用类型的数据在转换为String类型时,一般是用于数据展示,转换时遵循以下规则。
        • 如果对象具有toString()函数,则会优先调用toString()函数。如果它返回的是一个原始值,则会直接将这个原始值转换为字符串表示,并返回该字符串。
        • 如果对象没有toString()函数,或者toString()函数返回的不是一个原始值,则会再去调用valueOf()函数,如果valueOf()函数返回的结果是一个原始值,则会将这个结果转换为字符串表示,并返回该字符串。
        • 如果通过toString()函数或者valueOf()函数都无法获得一个原始值,则会直接抛出类型转换异常。
      • 引用类型转换为Number类型一个引用类型的数据在转换为Number类型时,一般是用于数据运算,转换时遵循以下规则。
      • 如果对象具有valueOf()函数,则会优先调用valueOf()函数,如果valueOf()函数返回一个原始值,则会直接将这个原始值转换为数字表示,并返回该数字。
      • 如果对象没有valueOf()函数,或者valueOf()函数返回的不是原生数据类型,则会再去调用toString()函数,如果toString()函数返回的结果是一个原始值,则会将这个结果转换为数字表示,并返回该数字。
      • 如果通过toString()函数或者valueOf()函数都无法获得一个原始值,则会直接抛出类型转换异常