2016-03-15 9 views
5

sto cercando di capire questo comportamento:Perché l'aggiunta Data genera una stringa?

var d = new Date(); 

console.log(+d); // 1458049171381 
console.log(1 + d); // '1Tue Mar 15 2016 09:39:31 GMT-0400 (EDT)' 

In contrasto:

var obj = { 
    valueOf: function() { 
    return 123; 
    } 
}; 

console.log(+obj); // 123 
console.log(1 + obj); // 124 

Perché il risultato Date aggiunta in un string quando Date.prototype.valueOf restituisce un number?

Ecco traduzione ingenua del Addition Operator's spec a JavaScript

function ToPrimitive(x) { 
    return x.valueOf(); 
} 

function IsString(x) { 
    return typeof x === 'string'; 
} 

function ToString(x) { 
    return x.toString(); 
} 

function ToNumber(x) { 
    try { 
    return parseFloat(x); 
    } catch (e) { 
    return NaN; 
    } 
} 

function AdditionOperator(lval, rval) { 

    let lprim = ToPrimitive(lval); 
    let rprim = ToPrimitive(rval); 

    if (IsString(lprim) || IsString(rprim)) { 
    return ToString(lprim) + ToString(rprim); 
    } else { 
    return ToNumber(lprim) + ToNumber(rprim); 
    } 
} 

Tuttavia, se invoco questo con un oggetto Date, restituisce un valore numerico:

AdditionOperator(new Date(), 1) // 1458049347088 

Qualcuno può far luce su Questo?

+0

hai letto la NOTA 1? – Hacketo

+0

@Hacketo/facepalm ... Accetterò la tua risposta se ne pubblichi uno. –

+0

@iliacholy ya ero sbagliato.è stato un equivoco. Grazie per l'esempio. –

risposta

4

Percorso guidato:

  • Prima l'aggiunta avviene, sia i giusti valori dell'operazione binaria e sinistro sono convertiti primitive (string o number).

  • A seconda del contesto del valore, potrebbe essere fornito un "suggerimento" che suggerisce quale tipo primitivo dovrebbe diventare.

  • Se non viene fornito alcun suggerimento, per impostazione predefinita verrà scelto il tipo preferito. Tutti gli Object s hanno un tipo preferito di number ad eccezione di Date, che preferisce string (e confonde tutti).

Come per la spec

tutti gli oggetti standard eccetto oggetti Date gestire l'assenza di un suggerimento come se il numero suggerimento stata data; Gli oggetti Date gestiscono l'assenza di un suggerimento come se fosse stata fornita la stringa di suggerimento. Gli oggetti esotici possono gestire l'assenza di un suggerimento in un altro modo.

E in caso di Data si fa un exception

degli oggetti definiti in questa specifica solo oggetti Date (vedi 20.3.4.45) e gli oggetti simbolo (vedi 19.4.3.4) oltre-ride il comportamento predefinito di ToPrimitive. Gli oggetti data non trattano alcun suggerimento come se il suggerimento fosse Stringa.

Inoltre, controllare this

Questa funzione viene chiamata da parte degli operatori del linguaggio ECMAScript per convertire un oggetto Date per un valore di base. I valori consentiti per il suggerimento sono "default", "number" e "string".Gli oggetti data, sono univoci nell'oggetto ECMAScript incorporato in cui considerano "predefinito" come equivalente a "stringa", Tutti gli altri oggetti ECMAScript incorporati trattano "predefinito" come equivalente a "numero".

Quindi, la data viene utilizzata solo come stringa.

Problemi correlati