2016-01-03 20 views
11

Capisco che il seguente codice avvolge un numero in un oggetto:Capire JavaScript Object (value)

var x = Object(5); 

pertanto aspetto e comprendere la seguente:

alert(x == 5); //true 
alert(x === 5); //false 

Tuttavia, capisco anche che un oggetto è un elenco di coppie chiave/valore . Quindi mi sarei aspettato che le seguenti fossero diverse:

alert(JSON.stringify(5)); //5 
alert(JSON.stringify(x)); //5 

Come si presenta la struttura di x? E perché non sembra essere in formato coppia chiave/valore?

+0

Quello che è in discussione qui è il comportamento di 'JSON.stringify()', giusto? – Pointy

+0

Non ero sicuro.Immagino di aver preso la definizione che tutti gli oggetti sono coppie chiave/valore troppo alla lettera e di conseguenza, mi aspettavo qualcosa in un formato coppia chiave/valore. – Sandy

+0

Beh, è ​​gentile - di cosa intendo; l'output di 'JSON.stringify()' nella tua domanda è il risultato di come funziona quella particolare API. Comprende esplicitamente che le istanze Number devono essere trattate come valori numerici nel JSON risultante. – Pointy

risposta

11

Object constructor crea un oggetto wrapper per il valore specificato, di un tipo che corrisponde al valore.

in modo da ottenere un Number object con il valore di base 5 quando passa un certo numero di Object

var x = Object(5); 

è esattamente la stessa di fare

var x = new Number(5); 

al momento della chiamata valueOf() su entrambi, si ottiene il primitivo valore 5 di nuovo, che è il motivo per cui lo stringendo dà lo stesso come stringendo il numero 5, l'oggetto viene convertito nel suo valore primitivo prima di stringificare

La specifica JSON.stringify dice

oggetti booleano, numero e stringa vengono convertiti ai corrispondenti valori primitivi durante in stringa, in accordo con le tradizionali semantica di conversione.

+0

Quindi il seguente risultato è falso perché è un'istanza diversa? \t \t \t var x = oggetto (5); \t \t \t var y = nuovo numero (5); \t \t avviso \t (x === y); – Sandy

+0

@Sandy - sì, quando si confrontano direttamente e rigorosamente, sono ancora oggetti e due oggetti non sono mai uguali – adeneo

0
var x = Object(5); 

This scatole 5 come oggetto, quindi in stringa appena unboxes il valore.

Se si assegna una chiave/valore ad un oggetto, stringa i mostrerà come tale:

var x = {}; 
x.foo = "bar"; 

Questo è javascript Anatra Typing - fondamentalmente se sembra un'anatra, e suona come una papera, è deve essere un'anatra tuttavia sostituire anatra con un tipo di dati, come int o collezione ... https://en.m.wikipedia.org/wiki/Duck_typing

0

In una console javascript, ho inserito quanto segue:

> var x = Object(5); 
> x 
[Number: 5] 
> JSON.stringify(5) 
'5' 
> JSON.stringify(x) 
'5' 

Quando si utilizza Object(5), si crea un oggetto con coppie chiave/valore. Tuttavia, JSON.stringify() sta trasformando quell'oggetto nella sua rappresentazione stringa - "5". Chiamando JSON.stringify() su un valore letterale come il numero 5 primitivo restituisce anche la sua rappresentazione stringa - "5". Stai convertendo sia l'oggetto che la primitiva in stringhe, ecco perché sono uguali.

Problemi correlati