37 votes

Veuillez expliquer pourquoi et comment + nouvelle date (); fonctionne comme «solution» pour Date.now () dans IE8 ou inférieur

(Je suis en train de lire le livre "Professionnel JavaScript pour Développeurs Web" pour donner un contexte à propos de cette question, plus précisément le Chapitre 5 sur les Types de Référence)

Je me demandais pourquoi et comment var start = +new Date(); travaille pour obtenir le courant de la milliseconde à la représentation de maintenant comme un travail autour de navigateurs (par exemple: IE8) qui ne supportent pas ECMAScript 5 Date.now()?

Ce qui ne l' + de l'opérateur de le faire ici, par rapport à tout simplement vieux - new Date() qui reçoit également la date et l'heure actuelles?

58voto

anddoutoi Points 3491

Ce qui se passe est que vous devez d'abord créer un nouvel objet Date, et puis le convertir en un nombre.

TL;DR-version

Sous le capot, le moteur d'exécution des appels valueOf méthode de Date objet.

Commentaire: version

de retour d'un nouveau Date objet

var d = new Date;

utiliser le Unaire + Opérateur

var n = +d;

Unaire + opérateur appelle l'interne ToNumber avec d.

9.3 ToNumber

Prend une entrée argument et si le type d'argument est - Object (Date) appel interne ToPrimitive avec entrée et indicateur de Nombre.

9.1 ToPrimitive

prend une entrée argument et un argument optionnel PreferredType.

si le type d'entrée est l'Objet de la spécification dit:

Renvoie une valeur par défaut pour l'Objet. La valeur par défaut d'un objet est extrait par l'appel de la [[Valeur par défaut]] méthode interne de la l'objet, en passant l'option soupçon PreferredType. Le comportement de l' [[Valeur par défaut]] méthode interne est défini par cette spécification de tous les ECMAScript objets dans 8.12.8.

8.12.8 [[Valeur par défaut]] (astuce)

Lors de la [[Valeur par défaut]] méthode interne de O est appelée avec indicateur de Nombre, les mesures suivantes sont prises:

  1. Laissez valueOf être le résultat de l'appel de la [[Get]] méthode interne 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 [[Appel]] interne méthode valueOf, avec O comme cette valeur et une liste d'arguments vide.
    2. Si val est une valeur primitive, de retour de val.

Dans le code de cette environ se traduit 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]]ting la méthode interne de O avec l'argument "valueOf" signifie le retour de la Date.le prototype.valueOf.

15.9.5.8 Date.le prototype.valueOf ( )

L' valueOf de la fonction renvoie un Nombre, qui est cette valeur de temps.

Si nous allons maintenant revenir à 9.3 ToNumber nous voyons que ToNumber appelle elle-même, cette fois, avec le retour de l' val de 8.12.8 [[Valeur par défaut]] (note) comme primValue. Si le type d'argument est le Nombre qu'il dit:

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

La Fin

7voto

mr.boyfox Points 3704

Fonction Date.now () 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 actuel sur IE8, vous pouvez utiliser ceci:

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

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

 var currentDateTime = +new Date(); 
 

6voto

Sjoerd Points 34671

Unaire + opérateur convertit une valeur à un certain nombre. Par exemple, +"123" convertira la chaîne "123" en nombre 123 . Cela fonctionnera également pour une date, et la date convertie en nombre donne le nombre de millisecondes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X