JavaScript中valueOf函数与toString方法重写优先级问题

  • 1.JavaScript中valueOf函数方法是返回指定对象的原始值。
    使用方法:
    object.valueOf( )object是必选项参数是任意固有 JScript 对象。
    每个JavaScript固有对象的 valueOf 方法定义不同。
对象返回值
Array数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。
BooleanBoolean 值。
Date存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function函数本身。
Number数字值。
Object对象本身。这是默认情况。
String字符串值。

Math 和 Error 对象没有 valueOf 方法。

基本上,所有JS数据类型都拥有valueOf和toString这两个方法,null除外。它们俩解决javascript值运算与显示的问题。
以上信息转载自脚本之家

  • 2.JavaScript 的 toString() 方法
    toString() 方法可把一个逻辑值转换为字符串,并返回结果。

  • 3.重写valueOf函数与toString方法
    下面是在转载的基础加上一些自己的体会

         var aaa = {

                i: 10,

                valueOf: function () {
                    console.log('valueOf');
                    return this.i + 30;
                },

                toString: function () {
                    console.log('toString');
                    return this.valueOf() + 10;
                }

            };
            //给对象aaa定义valueOf()方法toString()方法
            //alert(aaa > 20); // true valueOf
            //alert(+aaa); // 40 valueOf
            //alert(aaa); // 50 toString valueOf
            //alert(aaa === '50'); // false
            //alert('' + aaa); // 50 valueOf   ===========?这个地方目前还不明白,按理说应该是字符串
            //================同样被重写,在有操作符的情况下 优先调用valueOf。强等于,不进行隐式的运算,类型不相同就直接false





            var aa = {
                i: 10,
                toString: function () {
                    console.log('toString');
                    return this.i;
                }
            };

            //alert(aa);// 10 toString
            //alert(+aa); // 10 toString
            //alert('' + aa); // 10 toString
            //alert(String(aa)); // 10 toString
            //alert(Number(aa)); // 10 toString
            //alert(aa == '10'); // true toString

            //==============valueOf没有被重写,走的是被重写的toString。重写能提高优先级

            //Object.prototype.valueOf = null;
            //Object.prototype.toString = null;

            var bb = {
                i: 10,
                valueOf: function () {
                    console.log('valueOf');
                    return this.i;
                }

            }

            //alert(bb);// [object Object]  
            //通过赋空Object.prototype.toString方法说明刚才走的是Object.prototype.toString
            //当只有重写valueOf时,没有运算符的情况下
            //Object.prototype.toString的优先级最高其次是Object.prototype.valueOf,重写的toString,最后才是重写的valueOf

            //console.info(bb);//  Object { i=10,  valueOf=function()}
            //很明显,不管是哪个方法,最后输出的是一个对象,没有执行console.log('valueOf');。
            //可能是console不进行隐式运算。

            //alert(+bb); // 10 valueOf
            //有运算符时还是重写的valueOf优先级最高

            //alert('' + bb); // 10 valueOf
            //alert(String(bb)); // [object Object]
            //只有重写valueOf时,String()转换,优先级又有了变化
            //先走的是Object.prototype.toString、重写的valueOf、Object.prototype.valueOf

            //alert(Number(bb)); // 10 valueOf
            //alert(bb == '10'); // true valueOf

综上所述:

  • 重写能提高优先级,在有运算符的情况下,重写的valueOf要比重写的toString 优先级高。

  • 强运算不进行隐式转换。

但是, 当只有重写valueOf 的时候 优先级有很大的变化:

  • 1.没有运算符的情况下

    优先级从最高到最低依次是:
    Object.prototype.toStringObject.prototype.valueOf、最后才是重写的valueOf

  • 2.有运算符时还是重写的valueOf优先级最高

  • 3.String()时
    见上例alert(String(bb));
    优先级依次是
    Object.prototype.toString
    重写的valueOf
    Object.prototype.valueOf


以上部分信息参考司徒正美的博客-valueOf与toString方法研究

有关 date.toString()date.valueOf()的问题
可以参考 valueOf与toString方法研究2
[] == ![] //答案为true,注意非[] !== []
[] ==> [].valueOf() ==> '';
![] ==> false
'' == false ==> true!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript Valueof、toString、toLocaleString 都是 Object 原型链上的方法,可以用来获取对象的值或者转换为不同的字符串形式。 1. valueOf(): valueOf() 方法返回一个对象的原始值。当 JavaScript 需要一个对象的原始值时,它会自动调用 valueOf() 方法。如果没有找到原始值,则会尝试调用 toString() 方法。 例如: ```javascript let num = new Number(10); console.log(num.valueOf()); // 10 ``` 这里的 `valueOf()` 返回了 `num` 的原始值,即 `10`。 2. toString(): toString() 方法返回一个对象的字符串表示形式。当 JavaScript 需要将一个对象转换为字符串时,它会自动调用 toString() 方法。 例如: ```javascript let num = new Number(10); console.log(num.toString()); // "10" ``` 这里的 `toString()` 返回了 `num` 的字符串表示形式,即 `"10"`。 3. toLocaleString(): toLocaleString() 方法返回一个对象的本地化字符串表示形式。当 JavaScript 需要将一个对象转换为本地化字符串时,它会自动调用 toLocaleString() 方法。该方法返回的字符串与所在地区的语言和文化相关。 例如: ```javascript let num = new Number(1234567.89); console.log(num.toLocaleString()); // "1,234,567.89" ``` 这里的 `toLocaleString()` 返回了 `num` 的本地化字符串表示形式,即 `"1,234,567.89"`,与所在地区的语言和文化相关。 总之,这三个方法都是用来获取对象的值或者转换为不同的字符串形式,但是具体使用要看实际情况和需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值