请解释为什么和如何+新的date(); 在IE8或更低版本中用作Date.now()的“解决方法”

(我正在阅读“ 用于Web开发人员的专业JavaScript ”一书, 这个问题提供背景知识,特别是关于参考types的第5章)

我想知道为什么和如何var start = +new Date(); 工作得到当前毫秒表示作为解决scheme浏览器(例如:IE8),不支持ECMAScript 5的Date.now()

+运算符在这里做什么比较,只是普通的旧的new Date()也得到当前的date和时间?

会发生什么是你首先创build一个新的date对象,然后将其转换为数字。

TL; DR-版本

在运行时,运行时调用Date对象的valueOf方法。

详细版本

返回一个新的Date对象

 var d = new Date; 

使用一元+运算符

 var n = +d; 

一元+运算符用d调用内部的ToNumber 。

9.3 ToNumber

获取input参数,如果参数typesObject (Date is), 则使用inputhint Number调用内部ToPrimitive 。

9.1 ToPrimitive

接受一个input参数和一个可选参数PreferredType

如果inputtypes是Object,则说明:

返回对象的默认值。 通过调用对象的[[DefaultValue]]内部方法来检索对象的默认值,并传递可选的提示PreferredType 。 本规范针对8.12.8中的所有本地ECMAScript对象定义了[[DefaultValue]]内部方法的行为。

8.12.8 [[DefaultValue]](提示)

当使用提示号调用O的[[DefaultValue]]内部方法时,采取以下步骤:

  1. 让valueOf是用参数“valueOf”调用对象O的[[Get]]内部方法的结果。
  2. 如果IsCallable(valueOf)为true,那么,
    1. 让val是调用valueOf的[[Call]]内部方法的结果,其中O为此值和一个空的参数列表。
    2. 如果val是原始值,则返回val。

在代码中,这近似转化为:

 var val, type, valueOf = O.Get( 'valueOf' ); if ( typeof valueOf === 'function' ) { val = valueOf.call( O ); type = typeof val; if ( val == null || type === 'boolean' || type === 'number' || type === 'string' ) { return val; } } 

[[Get]]使用参数“valueOf”的O的内部方法基本上意味着返回Date.prototype.valueOf 。

15.9.5.8 Date.prototype.valueOf()

valueOf函数返回一个Number,它是这个时间值 。

如果我们现在返回到9.3 ToNumber,我们看到ToNumber调用自己,这次返回的值是从8.12.8 [[DefaultValue]](提示) primValue 。 如果参数types是数字它说:

结果等于input参数(不转换)。

结束

IE上的Date.now()函数:

 return a number of milliseconds between midnight, January 1, 1970, and the current date and time. 

要求

 Not supported in installed versions earlier than Internet Explorer 9. However, it is supported in the following document modes: Quirks, Internet Explorer 6 standards, Internet Explorer 7 standards, Internet Explorer 8 standards, Internet Explorer 9 standards, Internet Explorer 10 standards. Also supported in Windows Store apps. 

为了获得IE8上的当前date对象,你可以使用这个:

 if (typeof Date.now() === 'undefined') { Date.now = function () { return new Date(); } } 

在IE8中 获取Date对象的时间值 (以1970年1月1日午夜以来的毫秒数表示) ,可以使用以下命令:

 var currentDateTime = +new Date(); 

一元+ 运算符将值转换为数字。 例如+"123"会将string"123"转换为数字123 。 这也适用于date,转换为数字的date表示毫秒数。