对象的 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"
i.e.:
我们可以编写一个表达式,其中通过 valueOf 隐式调用 toString (即不显式调用 toString)吗?
是否有任何表达式可以隐式调用对象的 toString 方法并覆盖其 valueOf 方法?
是的,每当抽象时就会发生这种情况ToString手术 http://es5.github.io/#x9.8应用于对象上,使用DefaultValue程序 http://es5.github.io/#x8.12.8 with .toString()
before .valueOf()
.
但是,在您的示例中您只使用了加法运算符 http://es5.github.io/#x11.6.1这就像标准行为的例外。由于它不仅连接字符串,还对数字求和,因此它总是使用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
- The
Function
构造函数
- The
Array::sort
算法的默认比较函数
- The
String
转换时的构造函数和 String 方法this
对象到字符串
- The
RegExp
构造函数
- The
Error
构造函数
- 许多其他函数不是由 EcmaScript 指定的,而是在 DOM 或其他地方,例如
alert
, XMlHTTPRequest::open
, querySelector
, …
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)