是否有任何表达式,对象的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)?
答案 0 :(得分:5)
是否有任何表达式,其中一个对象的toString方法被隐式调用覆盖其valueOf方法?
是的,只要在对象上应用抽象ToString
operation,就会.toString()
之前使用DefaultValue
procedure和.valueOf()
,就会发生这种情况。
但是,在您的示例中,您只使用了addition operator,这类似于标准行为的异常。由于它不仅连接字符串,而且还对数字求和,因此在检查它们是否为字符串之前,它总是在两个操作数上使用valueOf
。见注1:
在步骤5中对ToPrimitive的调用中未提供任何提示 6.除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
对象转换为字符串时的this
构造函数和String方法RegExp
构造函数Error
构造函数alert
,XMlHTTPRequest::open
,querySelector
,... 答案 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"