隐式转换本质就是调用了valueOf或者toString方法
先看dome01: toString
function smallFun (y){
let x= 10
let aaa = ()=>{
}
aaa.toString = ()=>{
return x+y
}
return aaa
}
console.log(smallFun(10)) //20
上面的smallFun函数调用了一下,并传参 10
这个时候y等于10
在函数中返回了aaa函数体
但是并没有执行,我们改动了aaa原型上的toString方法,返回了结果20
说明我们打印aaa函数体的时候,它自动执行了aaa原型上的toString方法
再看dome02:valueOf
let b= ()=>{
}
b.valueOf = () => {
return 222
}
b.toString = () => {
return 'bbb'
}
console.log(+b) //222
console.log(b*1) //222
同样是打印了一下b函数体,不同的是在函数体前 加了个 + ,或者是后面加了 *1
就变成了自动调用原型上的valueOf方法;
再看dome03
let b = () => {
}
b.toString = () => {
return 'bbb'
}
b.valueOf = () => {
return 222
}
console.log(+b) //222
console.log(b * 1) //222
console.log(b == {
}) //false
console.log(b === {
}) //false
console.log(b == '') //false
console.log(Number(b))//222
console.log(String(b))//bbb
console.log(b.toString())//bbb
console.log(b+1)//223
console.log(b+'1')//2221
我们发现,当b函数体以字符串输出的时候返回的是bbb,调用了原型上的toString方法,
当以Number类型输出的时候(隐士转换也算),调用了原型上的valueOf方法。
同理 上面的例子我们再回顾一下:
function smallFun (y){
let x= 10
let aaa = ()=>{
}
aaa.toString = ()=>{
return x+y
}
aaa.valueOf=()=>{
return 222
}
return aaa*1
}
console.log(smallFun(10)+1) //223
加油~
原因 :
https://www.jianshu.com/p/ace2c71bec3b
https://zhuanlan.zhihu.com/p/104362868