2012-03-06 11 views
40

new Date() prende un ordinale e restituisce un oggetto Date.
Cosa fa Date() e come mai dà un orario diverso?Data vs nuovo Data in 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)" 

risposta

86

Dal specs:

Quando Date è chiamato come una funzione piuttosto che come un costruttore, restituisce una stringa che rappresenta l'ora corrente (UTC).

e:

Quando Date è chiamato come parte di un'espressione new, è un costruttore: inizializza l'oggetto appena creato.

Quindi, new Date(...) restituisce un oggetto in modo tale che obj instanceof Date è vero, mentre Date(...) restituisce fondamentalmente la stessa new Date().toString().

+0

Risposta migliore fino ad ora –

+1

qualsiasi pseudo-codice di come la funzione Date() è implementata in modo che possa funzionare sia come costruttore che come funzione normale? grazie – Benny

+2

@Benny si osservi quanto segue: 'function Test() { var private =" private value "; this.public = "valore pubblico"; restituisce "valore di ritorno"; } ' Chiamare' new Test() 'crea un oggetto con valori privati ​​e pubblici. Chiamando 'Test()' restituisce una stringa. – musicin3d

18

new Date crea un nuovo oggetto Date che è possibile modificare o inizializzare con una data diversa, mentre Date restituisce una stringa della data/ora corrente, ignorando i suoi argomenti.

+3

In realtà restituisce una stringa, non un oggetto Date, ma questo è altrimenti corretto: funziona così perché funziona così :-) – Pointy

+0

Grazie, cambiato la mia risposta. – xato

2

new Date() restituisce la data in base al parametro di input e Date() restituisce la data di oggi sul browser.

2

Data consente di creare oggetti che rappresentano data/ora. NON è pensato per essere chiamato come una funzione. È possibile ottenere ulteriori informazioni qui: Date - MDN

5

Verificare JavaScript Date per un rapido riferimento API e un banco di prova del codice. È possibile vedere la funzione Date() senza new non accetta alcun parametro e restituisce sempre una rappresentazione string della data/ora corrente. Se si modifica il campione di essere:

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

troverete i risultati per entrambi sono gli stessi (perché JavaScript ignora argomenti extra passati alle funzioni):

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

Chiamare un costruttore come una funzione è semplicemente sbagliato fare cose (probabilmente) inaspettate con l'ambito dell'app e, prima che sia molto tempo, sarai al centro dell'attenzione in una sessione di bug fixing di gruppo.

Creare un oggetto data come previsto dai progettisti delle specifiche, non codificare le soluzioni alternative implementate come precauzioni dagli ingegneri che pensano che i programmatori JS siano stupidi. (ha lavorato in laboratorio, è stato nella sedia successiva durante la conversazione, l'ha affrontata e si è trasferito)

Se sei follemente contro il nuovo puoi provare object.create ma al momento della scrittura è più lento ea meno che non stia pianificando per implementare l'eredità polimorfica, allora è uno sforzo extra per meno ricompensa.

1

Date classe può essere chiamato come costruttore o come metodo di avere un built-in codice come:

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

} 

Quindi, se si chiama esso come metodo, ri-chiamare il costruttore per restituire la data corrente & ora.

+1

Interessante, ma si noti che 'typeof Date() === 'stringa'', non'' oggetto''. –

0

È il 2017 e avevo in mente la stessa domanda. Quello che ho trovato come risposta dopo alcune letture:

"Il modo più semplice per eseguire una conversione di tipo esplicito consiste nell'utilizzare le funzioni booleana(), Number(), String() o Object(). visto queste funzioni come costruttori per gli oggetti wrapper. Quando invocati senza il nuovo operatore, tuttavia, funzionano come funzioni di conversione ed eseguono conversioni di tipo .. "

" Le classi integrate del tentativo di nucleo JavaScript valueOf() conversione prima conversione toString(), ad eccezione della classe Date, che esegue la conversione toString(). "

Quindi Data() invocato senza la nuova parola chiave esegue una conversione di tipo. E poiché Date è un oggetto e deve essere eseguito un oggetto-primitivo, gli oggetti data per impostazione predefinita chiamano toString() (sebbene Date abbia anche un metodo valueOf() significativo).

Trovato sul libro "JavaScript: The Definitive Guide". Lasciandolo qui per le generazioni future che hanno appena iniziato a imparare JS :)