Expliquez pourquoi et comment + nouvelle Date (); Fonctionne comme «solution de contournement» pour Date.now () dans IE8 ou ci-dessous

(Je lis le livre « JavaScript professionnel pour les développeurs Web » pour donner un contexte sur cette question, en particulier le chapitre 5 sur les types de référence)

Je me demande pourquoi et comment var start = +new Date(); Fonctionne pour obtenir la représentation actuelle de milliseconde maintenant comme un travail sur les navigateurs (par exemple: IE8) qui ne prennent pas en charge Date.now() ? Date.now() ECMAScript 5?

Qu'est-ce que l'opérateur + fait ici par rapport à l'ancienne et ancienne new Date() qui obtient également la date et l'heure actuelles?

Ce qui se passe, c'est que vous créez d'abord un nouvel objet Date, puis lancez-le à un numéro.

TL; version DR

Sous le capot, l'exécution appelle la méthode valueOf de l'objet Date .

Verbose-version

Renvoyer un nouvel objet Date

 var d = new Date; 

Utilisez l' opérateur Unary +

 var n = +d; 

L'opérateur unary + appelle ToNumber interne avec d .

9.3 ToNumber

Prend un argument de saisie et si le type d'argument est Object (Date est), appelez le paramètre ToPrimitif interne avec le numéro d' entrée et d' indice .

9.1 ToPrimitive

Prend un argument d' entrée et un argument optionnel PreferredType .

Si le type d'entrée est Objet, la spécification indique:

Renvoie une valeur par défaut pour l'objet. La valeur par défaut d'un objet est récupérée en appelant la méthode interne [[DefaultValue]] de l'objet, en passant l'indice optionnel PreferredType . Le comportement de la méthode interne [[DefaultValue]] est défini par cette spécification pour tous les objets ECMAScript natifs dans 8.12.8.

8.12.8 [[DefaultValue]] (indice)

Lorsque la méthode interne [[DefaultValue]] de O est appelée avec le numéro d'indice, les étapes suivantes sont prises:

  1. Laissez valueOf être le résultat d'appeler la méthode interne [[Get]] de l'objet O avec l'argument "valueOf".
  2. Si IsCallable (valueOf) est vrai alors,
    1. Laissez val être le résultat de l'appel de la méthode interne [[Call]] de valueOf, avec O comme valeur et une liste d'arguments vide.
    2. Si val est une valeur primitive, retournez val.

Dans le code, cela se traduit approximativement par:

 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]] la méthode interne de O avec l'argument "valueOf" signifie essentiellement retourner Date.prototype.valueOf .

15.9.5.8 Date.prototype.valueOf ()

La fonction valueOf renvoie un numéro, quelle est cette valeur de temps .

Si nous revenons maintenant à 9.3 ToNumber, nous voyons que ToNumber s'appelle lui-même, cette fois avec la valeur renvoyée à partir de 8.12.8 [[DefaultValue]] (indice) en tant que primValue . Si le type d'argument est Numéro, il dit:

Le résultat équivaut à l'argument d'entrée (pas de conversion).

La fin

Date.now () fonction sur IE:

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

Exigences

 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. 

Pour obtenir l'objet Date actuelle sur IE8, vous pouvez utiliser ceci:

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

Pour obtenir de la valeur du temps dans un objet Date (en nombre de millisecondes depuis minuit le 1er janvier 1970.) sur IE8, vous pouvez utiliser ceci:

 var currentDateTime = +new Date(); 

L'opérateur unary + convertit une valeur en un nombre. Par exemple +"123" convertira la chaîne "123" sur le numéro 123 . Cela fonctionnera également pour une date, et la date convertie en un nombre donne le nombre de millisecondes.