在阅读《你不知道的javascript》中卷第四章(第48页) 非字符串转换到字符串类型时有这样一句话
“对普通对象来说,除非自行定义,否则toString() (Object.prototype.toString()) 返回内部属性[[Class]]的值,如[object object]; 但是如果对象有自己的toString()方法,字符串化时就会调用该方法并返回其返回值”
下面是自己的见解,如果有不对的地方,请大神指正
let f ={a:123}
console.log(f+'a');
let a ={a:123}
Object.prototype.toString=function(){
return '555'
}
console.log(a.toString());
console.log(a+'a');
let e = {
a:123,
toString:function(){
return '999'
}
}
console.log( e +'a');
let g = [1,3,4]
console.log(g+'a');
let b = [1,3,4]
Array.prototype.toString=function(){
return '666'
}
console.log(b.toString());
console.log(b+'a');
let c = 5
Number.prototype.toString=function(){
return '777'
}
console.log(c.toString());
console.log(c+'a');
let d = '5'
String.prototype.toString=function(){
return '888'
}
console.log(d.toString());
console.log(d+'a');
只是个人见解,仅供参考(只是作为自己的知识点,记录下来)
总结:
(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));
console.log(Number(a));
parseInt函数接收的参数是字符串类型的值,即使传的不是字符串类型,也会强制转换成字符串类型,上面代码传的是对象,得先将对象转换成字符串,所以调用toString方法,得到字符串36,然后parseInt对字符串36进行转换。
Number(a)得到24原因,参考上面的number方法讲解