资讯专栏INFORMATION COLUMN

浅析toString与valueOf

lpjustdoit / 2285人阅读

摘要:返回最适合该对象类型的原始值将该对象的原始值以字符串形式返回。这两个方法一般是交由去隐式调用,以满足不同的运算情况。进行强转字符串类型时将优先调用方法,强转为数字时优先调用。在有运算操作符的情况下,的优先级高于。

valueOf():返回最适合该对象类型的原始值;
toString(): 将该对象的原始值以字符串形式返回。

这两个方法一般是交由JS去隐式调用,以满足不同的运算情况。
在数值运算里,会优先调用valueOf(),在字符串运算里,会优先调用toString()。

let e2 = {
        n : 2,
        toString : function (){
            console.log("this is toString")
            return this.n
        },
        valueOf : function(){
            console.log("this is valueOf")
            return this.n*2
        }
    }
    alert(e2) //  2  this is toString
    alert(+e2)  // 4 this is valueOf
    alert(""+e2) // 4 this is valueOf
    alert(String(e2)) // 2 this is toString
    alert(Number(e2)) // 4 this is valueOf
    alert(e2 == "4") // true  this is valueOf
    alert(e2 === 4) //false ===操作符不进行隐式转换

第三个alert,之所以会调用valueOf是因为:在有运算操作符的情况下,valueOf的优先级高于toString

看接下来的两给例子:

let e3 = {
        n : 2,
        toString : function (){
            console.log("this is toString")
            return this.n
        }
    }
    alert(e3) //  2  this is toString
    alert(+e3)  // 2 this is toString
    alert(""+e3) // 2 this is toString
    alert(String(e3)) // 2 this is toString
    alert(Number(e3)) // 2 this is toString
    alert(e3 == "2") // true  this is toString
    alert(e3 === 2) //false  ===操作符不进行隐式转换
    
    
   Object.prototype.toString = null; 
   let e4 = {
        n : 2,
        valueOf : function(){
            console.log("this is valueOf")
            return this.n*2
        }
    }
    alert(e4) //  4 this is valueOf
    alert(+e4)  // 4 this is valueOf
    alert(""+e4) // 4 this is valueOf
    alert(String(e4)) // 4 this is valueOf
    alert(Number(e4)) // 4 this is valueOf
    alert(e4 == "4") // true  this is valueOf
    alert(e4 === 4) //false  ===操作符不进行隐式转换
    
 

修改过的toString与ValueOf调用顺序

 哪个修改先调用哪个

总结:

进行对象转换时(alert(e2)),优先调用toString方法,如没有重写toString将调用valueOf方法,如果两方法都不没有重写,但按Object的toString输出。

进行强转字符串类型时将优先调用toString方法,强转为数字时优先调用valueOf。

在有运算操作符的情况下,valueOf的优先级高于toString。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/82598.html

相关文章

  • 浅析-js的alert()console.log()区别

    alert(): 有阻塞作用,不点击确定,后续代码无法继续执行 alert()只能输出string,如果alert输出的是对象会自动调用toString()方法 e.g. alert([a,b,c]);//a,b,c alert不支持多个参数的写法,只能输出第一个值 e.g. alert(1,2,3);//1 console.log(): 在打印台输出 可以打印任何类型的...

    YFan 评论0 收藏0
  • 温故js系列(4)-运算符详解

    摘要:一元运算符一元运算符只能操作一个值。逻辑非逻辑非参考数据判断逻辑非运算符可以用于任何值。无论这个值是什么数据类型,这个运算符都会返回一个布尔值。 前端学习:教程&开发模块化/规范化/工程化/优化&工具/调试&值得关注的博客/Git&面试-前端资源汇总 欢迎提issues斧正:运算符 JavaScript-运算符 JavaScript 有一系列操作数据值的运算符,运算符按照特定运算规则对...

    王军 评论0 收藏0
  • 浅析微信支付:申请退款、退款回调接口、查询退款

    摘要:注意交易时间超过一年的订单无法提交退款微信支付退款支持单笔交易分多次退款,多次退款需要提交原支付订单的商户订单号和设置不同的退款单号。 本文是【浅析微信支付】系列文章的第八篇,主要讲解商户如何处理微信申请退款、退款回调、查询退款接口,其中有一些坑的地方,会着重强调。 浅析微信支付系列已经更新七篇了哟~,没有看过的朋友们可以看一下哦。 浅析微信支付:查询订单和关闭订单 浅析微信支付:支...

    silenceboy 评论0 收藏0
  • 浅析微信支付:统一下单接口

    摘要:本文是浅析微信支付系列文章的第五篇,主要讲解如何调用统一下单接口生成预支付单及调起支付页面。浅析微信支付系列已经更新四篇了哟,没有看过的朋友们可以看一下哦。 本文是【浅析微信支付】系列文章的第五篇,主要讲解如何调用统一下单接口生成预支付单及调起支付页面。 浅析微信支付系列已经更新四篇了哟~,没有看过的朋友们可以看一下哦。 浅析微信支付:微信公众号网页授权 浅析微信支付:开发前的准备 ...

    ytwman 评论0 收藏0
  • 关于Javascript中的valueOftoString

    摘要:中默认的方法返回字符串。的方法将返回一个具有可读性的日期时间字符串。函数的作用是返回该自身。其他一律返回对象本身。在有运算操作符的情况下,的优先级高于。 +{ a: 1, toString: function() { return 10 }, valueOf: function() { return 100 } } 以上引申出对象数据的转换的问题:所有对象继承了两个转换方法: toS...

    lvzishen 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<