valueOf是否总是在javascript中覆盖toString?

use*_*390 11 javascript tostring

是否有任何表达式,其中一个对象的toString方法被隐式调用覆盖其valueOf方法?

在下面的示例中,valueOf始终是隐式调用的(重写toString).

"4" + {
    toString: function () {
        return "4";
    },
    valueOf: function () {
        return 6;
    }
};    // => "46", was expecting "44"

4 + {
    toString: function () {
        return "6";
    },
    valueOf: function () {
        return 4;
    }
};    // => 8

4 + {
    toString: function () {
        return 6;
    },
    valueOf: function() {
        return "4";
    }
};    // => "44"
Run Code Online (Sandbox Code Playgroud)

即:

我们可以写一个表达式,其中toString被隐式调用valueOf(即没有显式调用toString)?

Ber*_*rgi 5

是否有任何表达式,其中一个对象的toString方法被隐式调用覆盖其valueOf方法?

是的,每当抽象,它发生的ToString操作应用对象的不同,使用DefaultValue方法.toString().valueOf().

但是,在您的示例中,您只使用了加法运算符,这类似于标准行为的异常.由于它不仅连接字符串,而且还对数字求和,因此valueOf在检查它们是否为字符串之前,它总是在两个操作数上使用.见注1:

在步骤5和6中对ToPrimitive的调用中没有提供提示.除Date对象之外的所有本机ECMAScript对象都处理没有提示,就像提供了提示号一样; 日期对象处理缺少提示,就像提供了提示字符串一样.主机对象可以以某种其他方式处理缺少提示.

那么哪些操作隐式使用ToString而不是提示ToPrimitive?这里有一些例子:

  • 一切有关属性名称:该in操作,支架符号,Object.getOwnPropertyDescriptor,Object.defineProperty,hasOwnProperty,...
  • 功能期待字符串作为参数:parseInt,parseFloat,encodeURI[Component],decodeURI[Component],[un]escape,Array::join,String::[last]indexOf,RegExp::exec
  • Function构造
  • Array::sort算法的默认功能比较
  • 将对象转换为字符串String时的构造函数和String方法this
  • RegExp构造
  • Error构造
  • 其他很多功能不是由EcmaScript的,但在DOM或其他地方规定,比如alert,XMlHTTPRequest::open,querySelector,...


pet*_*ldi 2

Date 对象上的 + 运算符使用 toString 而不是 valueOf。此外,如果 valueOf 返回非原始值,则接下来调用 toString 方法。(JavaScript - 权威指南,第 3.14 节)使用您的示例:

var result = "4" + {
    toString: function () {
        return "4";
    },
    valueOf: function () {
        return this; // returning an object, not a primitive
    }
};
Run Code Online (Sandbox Code Playgroud)

现在结果是 44。