强制转换成字符串或数值的问题

263 阅读3分钟

在阅读《你不知道的javascript》中卷第四章(第48页) 非字符串转换到字符串类型时有这样一句话

“对普通对象来说,除非自行定义,否则toString() (Object.prototype.toString()) 返回内部属性[[Class]]的值,如[object object]; 但是如果对象有自己的toString()方法,字符串化时就会调用该方法并返回其返回值”

下面是自己的见解,如果有不对的地方,请大神指正

let f ={a:123}
console.log(f+'a');  // [object object]a

let a ={a:123}
Object.prototype.toString=function(){
  return '555'
}
console.log(a.toString()); // 555
console.log(a+'a');  // 555a

let e = {
    a:123,
    toString:function(){
      return '999'   
    }
}
console.log( e +'a');  // 999a

let g = [1,3,4]
console.log(g+'a');  // 1,3,4a
 
let b = [1,3,4]
Array.prototype.toString=function(){
  return '666'
}
console.log(b.toString()); // 666
console.log(b+'a');  // 666a

let c = 5
Number.prototype.toString=function(){
  return '777'
}
console.log(c.toString()); // 777
console.log(c+'a');  //5a

let d = '5'
String.prototype.toString=function(){
  return '888'
}
console.log(d.toString()); // 888
console.log(d+'a');  //5a

只是个人见解,仅供参考(只是作为自己的知识点,记录下来)

总结:
(1)对象转成字符串时,首先先在自身找toString方法,如果自身没有,再到自己的封装对象的原型中去找toString方法,得到返回值
(2)数组的 Array的原型中有重定义了toString方法,将所有单元字符串话后再用“,”连接起来
(3)数字隐形转成字符串的时候,由于可以直接转换成字符串,即使他的Number对象原型中有toString方法,他也不会调用,而是直接转换的。
(4) 针对第三点,也可以这么理解,基本类型的值都可以直接转换成字符串,因此他们不需要调用他们各自原型的toString方法,而是直接转换的。

这里补充下强制转换成Number的Number()方法

(1)如果是基本类型的值将直接转换
(2)如果不是基本类型的值,首先调用原型的valueOf方法,如果valueof没能将其转换成基本类型的值,再调用原型的toString方法,试图其转换成基本类型值。如果能转换成基本类型值就 直接转换成数字。如果valueOf和toString都没将其转换成基本类型值。那么将会报错。
(3)一些特殊值转换成Number(true转换成1,false转换成0,undefined转换成NaN,null转换成0)
补充:parseInt和Number方法
let a ={
  num:12,
  valueOf(){
    return this.num*2
  },
  toString(){
    return this.num*3
  }
}
console.log(parseInt(a));  //36
console.log(Number(a));  //24
parseInt函数接收的参数是字符串类型的值,即使传的不是字符串类型,也会强制转换成字符串类型,上面代码传的是对象,得先将对象转换成字符串,所以调用toString方法,得到字符串36,然后parseInt对字符串36进行转换。
Number(a)得到24原因,参考上面的number方法讲解