variable now new example javascript

javascript - new - Por favor explique por qué y cómo+fecha nueva(); funciona como ''solución'' para Date.now() en IE8 o inferior



timestamp javascript example (3)

El operador unario + convierte un valor en un número. Por ejemplo, +"123" convertirá la cadena "123" al número 123 . Esto también funcionará para una fecha, y la fecha convertida a un número da la cantidad de milisegundos.

(Estoy leyendo el libro " JavaScript profesional para desarrolladores web " para dar un contexto sobre esta pregunta, específicamente el Capítulo 5 sobre Tipos de referencia)

Me pregunto por qué y cómo var start = +new Date(); funciona para obtener la representación de milisegundos actual de los navegadores (por ejemplo, IE8) que no son compatibles con Date.now() ECMAScript 5?

¿Qué hace el operador + aquí comparado con la new Date() que también tiene la fecha y hora actual?


Lo que sucede es que primero crea un nuevo objeto Date y luego lo convierte en un número.

TL; DR-versión

Bajo el capó, el tiempo de ejecución llama al método valueOf del objeto Date .

Versión verbosa

devolver un nuevo objeto Date

var d = new Date;

usa el operador Unario +

var n = +d;

El operador unario + llama al número de ToNumber interno con d .

ToNumber

Toma un argumento de entrada y si el tipo de argumento es Object (Date is) llama al ToPrimitive con entrada y al número de pista .

ToPrimitive

toma un argumento de entrada y un argumento opcional PreferredType .

si el tipo de entrada es Object, la especificación dice:

Devuelve un valor predeterminado para el Objeto. El valor predeterminado de un objeto se recupera llamando al método interno [[DefaultValue]] del objeto, pasando la sugerencia opcional PreferredType . El comportamiento del método interno [[DefaultValue]] está definido por esta especificación para todos los objetos ECMAScript nativos en 8.12.8.

[[DefaultValue]]

Cuando se llama al método interno [[DefaultValue]] de O con el número de sugerencia, se realizan los siguientes pasos:

  1. Permita que valueOf sea el resultado de llamar al método interno [[Get]] del objeto O con el argumento "valueOf".
  2. Si IsCallable (valueOf) es verdadero, entonces,
    1. Deje val ser el resultado de llamar al método interno de [[Call]] de valueOf, con O como este valor y una lista de argumentos vacía.
    2. Si val es un valor primitivo, devuelve val.

En el código, esto se traduce aproximadamente a:

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 el método interno de O con argumento "valueOf" básicamente significa regresar Date.prototype.valueOf .

Date.prototype.valueOf

La función valueOf devuelve un Número, que es este valor de tiempo .

Si ahora volvemos a ToNumber vemos que ToNumber se llama a sí mismo, esta vez con el val [[DefaultValue]] de [[DefaultValue]] como primValue . Si el tipo de argumento es Número, dice:

El resultado es igual al argumento de entrada (sin conversión).

El fin


Función Date.now () en IE:

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

Requisitos

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.

Para obtener el objeto Date actual en IE8, puede usar esto:

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

Para obtener el valor de tiempo en un objeto de fecha (como el número de milisegundos desde la medianoche del 1 de enero de 1970) en IE8, puede usar esto:

var currentDateTime = +new Date();