2012-03-06 7 views
40

new Date() toma un ordinal y devuelve un objeto Date.
¿Qué hace Date() y cómo es que le da un tiempo diferente?Fecha vs nueva Fecha en JavaScript

>>> new Date(1329429600000) 
Date {Fri Feb 17 2012 00:00:00 GMT+0200 (القدس Standard Time)} 
>>> Date(1329429600000) 
"Tue Mar 06 2012 15:29:58 GMT+0200 (Jerusalem Standard Time)" 

Respuesta

86

Desde el specs:

Cuando Date se llama como una función más que como un constructor, devuelve una cadena que representa la hora actual (UTC).

y:

Cuando Date se llama como parte de una expresión new, es un constructor: se inicializa el objeto recién creado.

Así, new Date(...) devuelve un objeto de tal manera que obj instanceof Date es verdad, mientras que Date(...) básicamente devuelve el mismo que new Date().toString().

+0

Mejor respuesta hasta el momento –

+1

¿Algún pseudocódigo de cómo se implementa la función Date() para que pueda funcionar como un constructor y una función normal? gracias – Benny

+2

@Benny observe lo siguiente: 'function Test() { var private =" private value "; this.public = "valor público"; return "return value"; } ' Llamar' new Test() 'crea un objeto con valores privados y públicos. Llamar a 'Test()' devuelve una cadena. – musicin3d

18

new Date crea un nuevo objeto Date que puede modificar o inicializar con una fecha diferente mientras Date devuelve una cadena de la fecha/hora actual, haciendo caso omiso de sus argumentos.

+3

En realidad, devuelve una cadena, no un objeto Date, pero esto es correcto: funciona de esa manera porque funciona de esa manera :-) – Pointy

+0

Gracias, cambió mi respuesta. – xato

2

new Date() devuelve la fecha en función del parámetro de entrada y Date() devuelve la fecha de hoy en el navegador.

2

Fecha le permite crear objetos que representan la fecha/hora. NO debe ser llamado como una función. Puede obtener más información aquí: Date - MDN

5

Consulte JavaScript Date para obtener una API rápida de referencia y código de banco de pruebas. Puede ver que la función Date() llamada sin new no toma ningún parámetro y siempre devuelve una representación string de la fecha/hora actual. Si modifica la muestra a ser:

console.log(Date()); 
console.log(Date(1329429600000)); 

Encontrará los resultados de ambos son lo mismo (porque JavaScript ignora argumentos adicionales pasados ​​a las funciones):

Wed Apr 11 2012 09:58:11 GMT-0700 (PDT) 
Wed Apr 11 2012 09:58:11 GMT-0700 (PDT) 
0

Llamar a un constructor como una Función Es completamente incorrecto que hará (probablemente) cosas inesperadas con el alcance de su aplicación y antes de mucho tiempo será el centro de atención en una sesión de solución de errores grupales.

Cree un objeto de fecha según lo previsto por los diseñadores de la especificación, no codifique las soluciones provisionales implementadas como salvaguardas por los ingenieros que piensan que los programadores de JS son estúpidos. (trabajó en el laboratorio, estuvo en la silla de al lado durante la conversación, se ocupó de ella y siguió adelante)

Si está locamente en contra de lo nuevo, puede probar object.create pero al momento de escribir es más lento ya menos que esté planeando para implementar la herencia polimórfica, es un esfuerzo extra por menos recompensa.

1

Date clase puede ser llamado como constructor o como método tener incorporado un código como:

function Date(args){ 
    if (this.constructor == Date){ 
     // if you call : new Date(args) 
    }else{ 
     // if you call as method : Date() 
     return new Date() 
    } 

} 

Por lo tanto, si se llama a ella como método, vuelve a llamar al constructor para devolver la fecha actual & tiempo.

+1

Interesante, pero tenga en cuenta que 'typeof Date() === 'string'', not'' object''. –

0

Es 2017 y tenía la misma pregunta en mente. Lo que encontré como una respuesta después de leer:

"La forma más sencilla de realizar una conversión de tipo explícita es utilizar las funciones Boolean(), Number(), String() u Object(). vimos estas funciones como constructores para objetos envoltorios. Sin embargo, cuando se invocan sin el nuevo operador, funcionan como funciones de conversión y realizan conversiones de tipo ... "

" Las clases incorporadas de núcleo JavaScript intentan valorOf() conversión antes toString() conversión, excepto la clase Date, que realiza la conversión toString() ".

Así que Date() invocado sin la nueva palabra clave realiza una conversión de tipo. Y dado que Date es un objeto y debe producirse un objeto a primitivo, date object de forma predeterminada llama a toString() (aunque Date también tiene un método valueOf() significativo).

Lo encontré en el libro "JavaScript: La guía definitiva". Dejándolo aquí para las futuras generaciones que acaban de empezar a aprender JS :)

Cuestiones relacionadas