【问题标题】:Why does appending a string to a Date invoke toString() rather than valueOf()?为什么将字符串附加到 Date 调用 toString() 而不是 valueOf()?
【发布时间】:2014-10-26 17:00:17
【问题描述】:

今天偶然发现了这一点,我找不到规范中定义此行为的位置。

将字符串附加到 JavaScript 中的对象(即new Object() + "whatever")通常会触发对对象的valueOf() 调用,但显然,日期对象是此规则的一个例外:new 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 对象有什么不同?

【问题讨论】:

  • 你是怎么完成这个代码 sn-p 的事情的?
  • @Ultra:查看编辑面板以在下面插入答案。有一个按钮。
  • 看来你真的可以从这里的snippet console 中受益。

标签: javascript


【解决方案1】:

当你在一个对象上调用addition operator,并且对象被转换为to a primitive时,该对象的内部[[DefaultValue]] method被调用。该方法采用类型提示,该提示确定应首先评估 toString 还是 valueOf

如果提示是“字符串”,则在 valueOf 之前查找 toString。如果传递“数字”,则反之亦然。

但是(强调我的):

O[[DefaultValue]] 内部方法在没有提示的情况下被调用时,它的行为就像提示是数字一样,除非 O 是日期对象(请参阅15.9.6),在这种情况下,它的行为就像提示是字符串一样

addition operator section 中也注明了这一点:

注意 1 在第 5 步和第 6 步中对 ToPrimitive 的调用中没有提供任何提示。除 Date 对象外,所有本机 ECMAScript 对象都处理没有提示的情况,就好像给出了提示 Number 一样;日期对象处理没有提示的情况,就好像给出了提示字符串一样。宿主对象可能会以其他方式处理提示的缺失。

【讨论】:

    猜你喜欢
    • 2014-10-10
    • 1970-01-01
    • 2017-12-10
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多