2015-08-10 13 views
23

Sto tentando di capire i tipi nel mondo JavaScript. La mia pagina utilizza moment.js. Ho una funzione che a volte restituisce un moment() e altre volte, restituisce un string (è il codice legacy impazzito).JavaScript instanceof e moment.js

Il mio codice tipo di assomiglia a questo:

var now = getDate(); 
if (now instanceof moment) { 
    console.log('we have a moment.'); 
} else { 
    console.log('we have a string.'); 
} 


function getDate() { 
    var result = null; 
    // Sometimes result will be a moment(), other times, result will be a string. 
    result = moment(); 
    return result; 
} 

Quando eseguo il codice di cui sopra, non ho mai ottenere we have a moment.. Anche se eseguo manualmente il set result = moment();. Perché? Sto fraintendendo instanceof o moment?

+0

provare a stampare "tipo di momento()" per assicurarsi che vi aspettate il giusto valore. – michaelAdam

+0

prova a usare typeof e debug: console.log (typeof now); – FrankBr

+0

dovrebbe usare 'typeof now ===" stringa "' – Hacketo

risposta

28

Prima di tutto, instanceof non è perfettamente affidabile.

In secondo luogo, moment() restituisce l'istanza della classe che non è esposta all'utente. Seguente codice dimostrare questo:

moment().__proto__.constructor // function Moment() 
moment().constructor === moment; // false 

terzo di tutti, moment svolge la funzione moment.isMoment che risolverà il vostro problema.

E, ultimo ma non meno importante, il codice deve utilizzare tipi di restituzione coerenti: restituisce sempre le istanze moment o restituisce sempre le stringhe. Ridurrà il tuo dolore in futuro.

È possibile assicurarsi di avere sempre moment esempio chiamando moment funzione - moment(string) uguale valore moment(moment(string)), quindi si può solo sempre convertire il vostro argomento per moment esempio.

+1

non dovresti controllare 'moment(). Constructor === moment'? –

+0

Hai ragione, aggiustato. – Ginden

+2

Penso che questo non sia aggiornato. 'isMoment' non è definito. Inoltre, la differenza tra 'isMoment()' (o 'isValid()', che ritengo sia l'equivalente corrente) e typeof/instanceof può essere abbastanza significativa nelle giuste circostanze. – Trevor

29

versione 2.13.0 Moment

V'è un metodo statico .isMoment:

enter image description here