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

来源:互联网 发布:mac上大型游戏 编辑:程序博客网 时间:2024/05/22 06:32
  • 1.JavaScript中valueOf函数方法是返回指定对象的原始值。
    使用方法:
    object.valueOf( )object是必选项参数是任意固有 JScript 对象。
    每个JavaScript固有对象的 valueOf 方法定义不同。
对象 返回值 Array 数组的元素被转换为字符串,这些字符串由逗号分隔,连接在一起。其操作与 Array.toString 和 Array.join 方法相同。 Boolean Boolean 值。 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