为什么将字符串附加到Date会调用toString()而不是valueOf()
Why does appending a string to a Date invoke toString() rather than valueOf()?
我今天偶然发现了这一点,在规范中找不到这种行为的定义
在JavaScript中将字符串附加到对象(即new Object() + "whatever"
)通常会触发对对象上valueOf()
的调用,但显然,Date对象是该规则的例外:new Date() + "..."
在Date上调用toString()
。
function test(constructor)
{
var name = constructor.name || /^'s*function (['w'$]+)/.exec(constructor.toString())[1];
var obj = new constructor();
obj.toString = function () { return name + ' : toString()'; }
obj.valueOf = function () { return name + ' : valueOf()'; }
document.body.appendChild(document.createElement('DIV')).textContent = obj + '';
}
test(Array);
test(Boolean);
test(Date);
test(Function);
test(Number);
test(Object);
test(RegExp);
test(String);
问题:这里的Date对象有什么不同?
当您在对象上调用加法运算符,并且该对象被转换为基元时,会调用该对象的内部[[DefaultValue]]
方法。该方法采用一个类型提示,该类型提示确定应该首先评估toString
还是valueOf
。
如果提示是"字符串",则在valueOf
之前查找toString
。如果传递了"数字",则反之亦然。
然而(重点矿):
当在没有提示的情况下调用O的
[[DefaultValue]]
内部方法时,它的行为就像提示是Number,,除非O是Date对象(请参见15.9.6),在这种情况下,它的操作就像提示是String。
这也在添加操作员部分中注意到:
注1步骤5和6中对
ToPrimitive
的调用中未提供任何提示。除Date对象外的所有本机ECMAScript对象都处理没有提示的情况,就好像给出了提示编号一样;日期对象处理没有提示的情况,就好像给出了提示字符串一样。主机对象可以以某种其他方式处理没有提示的情况。
相关文章:
- toBoolean方法类似于toString
- 为什么.toString的范围限制为36
- 如何使用 num.toString 和 str.split 查找整数的最后一位数字
- 将toString方法暴露给nashorn中的js对象
- 为什么控制台没有't使用输入的对象's的`toString`方法
- Javascript Date.toString() formatting?
- 需要帮助编写在不使用toString的情况下将十进制转换为二进制的代码
- 类型错误:无法读取未定义的属性“toString” - 为什么
- 如何在javascript中记录对象时强制使用toString
- 为什么可以对整数变量调用toString(),而不能对文字数字调用
- ToString 将 Javascript Object 更改为 Undefined
- JS valueOf and toString
- MongoDB原生:toString和toHexString方法之间有什么区别吗?
- JavaScript:Date 的 toString() 和 toLocaleString() 方法之间的区别
- 如何使 toString 检查 2 个变量
- 为什么当我在JS数组上调用.toString时得到“对象对象”
- 为什么将字符串附加到Date会调用toString()而不是valueOf()
- Java脚本中的Join()与toString()与valueOf()
- toString()和valueOf()方法的应用领域
- 迭代javascript object和valueOf toString方法