JS中toString和valueOf在什么时候会自动触发

隐式转换本质就是调用了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

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六卿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值