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

时间:2014-01-02 22:33:07

标签: 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"

即:

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

3 个答案:

答案 0 :(得分:5)

  

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

是的,只要在对象上应用抽象ToString operation,就会.toString()之前使用DefaultValue procedure.valueOf(),就会发生这种情况。

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

  

在步骤5中对ToPrimitive的调用中未提供任何提示   6.除Date对象之外的所有本机ECMAScript对象都处理   没有提示,好像给出了提示号;日期对象   处理没有提示,就好像给出了提示字符串一样。主办   对象可能会以其他方式处理缺少提示。

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

  • 有关属性名称的所有内容:in运算符,括号表示法,Object.getOwnPropertyDescriptorObject.definePropertyhasOwnProperty,...
  • 期望字符串作为参数的函数:parseIntparseFloatencodeURI[Component]decodeURI[Component][un]escapeArray::joinString::[last]indexOfRegExp::exec
  • Function构造函数
  • Array::sort算法的默认比较功能
  • String对象转换为字符串时的this构造函数和String方法
  • RegExp构造函数
  • Error构造函数
  • 许多其他功能未由EcmaScript指定,但在DOM或其​​他地方,例如alertXMlHTTPRequest::openquerySelector,...

答案 1 :(得分: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
    }
};

结果现在是44。

答案 2 :(得分:1)

  

是否有任何表达

是。以下是使用toString的示例:

alert({
    toString: function () {
        return "4";
    },
    valueOf: function () {
        return 6;
    }
});  // alerts "4"