Gli array di Javascript sono primitivi? Stringhe? Oggetti?

Gli array sono semplicemente oggetti sotto mentite spoglie? Perché perché no? In che modo sono (tali / non)?

Ho sempre pensato che gli array e gli oggetti in JS fossero essenzialmente uguali, principalmente perché l’accesso a questi è identico.

var obj = {'I': 'me'}; var arr = new Array(); arr['you'] = 'them'; console.log(obj.I); console.log(arr.you); console.log(obj['I']); console.log(arr['you']); 

Sono fuorviato / sbagliato / sbagliato? Cosa devo sapere sui caratteri JS, sulle primitive e sulle stringhe / oggetti / array / etc …?

Gli array / oggetti sono semplicemente archi nascosti? Perché perché no? In che modo sono (tali / non)?

Gli array sono oggetti.

Tuttavia, a differenza degli oggetti normali, gli array hanno alcune caratteristiche speciali.

  1. Gli array hanno un object aggiuntivo nella loro catena di prototipi, vale a dire Array.prototype . Questo object contiene i cosiddetti metodi Array che possono essere richiamati su istanze di array. (Elenco dei metodi è qui: http://es5.github.com/#x15.4.4 )

  2. Gli array hanno una proprietà length (che è live, ergo, si auto-aggiorna) (Leggi qui: http://es5.github.com/#x15.4.5.2 )

  3. Gli array hanno uno speciale algoritmo per la definizione di nuove proprietà (Leggi qui: http://es5.github.com/#x15.4.5.1 ). Se si imposta una nuova proprietà su una matrice e tale nome della proprietà è una puntura che può essere forzata a un numero intero (come '1' , '2' , '3' , ecc.) Allora si applica l’algoritmo speciale (è definito a pag 123 nella specifica)

Oltre a queste 3 cose, gli array sono come oggetti normali.

Leggi gli array nelle specifiche: http://es5.github.com/#x15.4

Gli oggetti sono una mappa non ordinata dalle chiavi stringa ai valori, gli array sono un elenco ordinato di valori (con chiavi intere). Questa è la differenza principale. Sono entrambi non primitivi, poiché sono composti da più valori, il che implica anche il pass-by-reference in JavaScript.

Gli array sono anche un tipo di object, quindi puoi aggiungere proprietà aggiuntive a loro, accedere al loro prototipo e così via.

Nell’esempio revisionato, stai solo sfruttando il fatto che un array è in realtà un object, ovvero puoi impostare qualsiasi proprietà su di essi. Non dovresti farlo. Se non hai bisogno di un elenco ordinato di valori, usa un object semplice.

Le stringhe possono essere primitive o oggetti, a seconda di come sono state dichiarate.

 var str = 'yes'; 

Ti dà un primitivo, mentre,

 var str = new String('yes'); 

ti darà un object String.


Tutti gli array sono uguali (che siano stati definiti o meno con [] o il nuovo Array ()), sono di tipo object ed ereditano dal prototipo dell’object “Array”. Non ci sono classi reali in Javascript, tutto è un object, e c’è un object definito dal sistema chiamato Array. Ha una proprietà chiamata ‘prototipo’ (di tipo object) e quando si utilizza la nuova parola chiave su un object con una proprietà prototipo, crea un’istanza con un riferimento ai contenuti del prototipo e la memorizza nella variabile. Quindi tutti gli array che hai mai usato in Javascript sono oggetti e istanze della proprietà prototipo di Array.

In ogni caso, sebbene gli array siano davvero degli oggetti, si comportano come array a causa delle loro utili proprietà e funzioni (come lunghezza, slice, push ecc.).

Un’altra nota, anche se ho detto che non ci sono classi, quando lo fai:

 console.log(Object.prototype.toString.call(your_object)); 

ti darà una stringa nella forma [object object]. Ma ciò che è utile è che quando lo si chiama con un array, si ottiene [object Array] lo stesso con funzioni che danno [funzione object] e un numero di altri tipi definiti dal sistema, che aiuta a distinguere tra oggetti e array normali (dal tipo di l’operatore restituirà sempre la stringa ‘object’).

Prova questo

 var a = Array; 

e vai in FireBug ed esamina il contenuto di un, in particolare la sua proprietà ‘prototipo’.

Modifica: cambia leggermente il testo, per essere più corretto. Infatti, quando si utilizza la nuova parola chiave, viene creata un’istanza che fa riferimento all’object prototipo. Quindi eventuali modifiche apportate al prototipo dopo la dichiarazione dell’istanza, avranno comunque effetto sull’istanza.

Modifica: In risposta alla tua ultima domanda rivista (sono gli array / oggetti in realtà stringhe sotto mentite spoglie): No. Sono oggetti, come ho spiegato. Le stringhe sono o un tipo primitivo o un tipo di object (un’istanza dell’object String) che contiene l’equivalente primitivo come una delle sue proprietà.

Le matrici non sono primitive in Javascript, sono oggetti. La differenza fondamentale è che di conseguenza, quando si passa una matrice a una funzione, essa viene passata per riferimento, non per valore.

Quindi sì! Le matrici sono oggetti in javascript, con un Array.prototype completo e tutto (non toccarlo però …)

La confusione deriva dal fatto che i javascript consentono di accedere agli attributi dell’object in due modi:

myObj.attribute o myObj [“attribute”]

In realtà ciò che rende un array un array non ha nulla a che fare con il modo in cui si memorizzano i dati – qualsiasi object può memorizzare valori usando la syntax che si usa per memorizzare l’array – ciò che rende un array un array è il fatto che i metodi dell’array (ad es. () e sort ()) sono definiti per Array.prototype.

Cercando di essere brevi con quello che ritengo essere il più importante: gli array hanno un numero di metodi che gli oggetti non hanno. Compreso:

  • lunghezza
  • spingere
  • pop

Un object dichiarato come var x = {foo:bar} non ha accesso a un metodo .length (). Sono entrambi oggetti ma con l’array come una sorta di superset con metodi menzionati come sopra.

Non credo di essere nemmeno vicino allo standard di Crockford in termini di spiegazione, ma sto cercando di essere sintetico.

Se vuoi ottenere dei risultati rapidi, apri Firebug o la tua javascript Console e prova Array.prototype e Object.prototype per vedere alcuni dettagli

Aggiornamento: nel tuo esempio dichiari un array e poi fai:

 foo['bar'] = 'unexpectedbehaviour'; 

produrrà risultati imprevisti e non sarà disponibile in loop semplici come:

 var foo=[0,1]; foo['bar'] = 2; for(var i=0;i 

Un array può accettare foo['bar']=x foo.bar=y come un object ma non sarà necessariamente disponibile per essere passato in loop come evidenziato sopra.

Non che io stia dicendo che non puoi scorrere le proprietà di un object, solo che quando lavori con una matrice, stai utilizzando quella funzionalità unica e dovresti ricordare di non confondermi.

In JavaScript hai alcuni tipi, tutto il resto è un object. I tipi in JavaScript sono: boolean, numero e stringa. Esistono anche due valori speciali, “null” e “undefined”.

Quindi la ricerca “è un array JavaScript un object?” è leggermente ambiguo. Sì, un array JavaScript è un “object” ma non è un’istanza di “Oggetto”. Una matrice JavaScript è un’istanza di “Array”. Sebbene, tutti gli oggetti ereditino da Object; è ansible visualizzare la catena di ereditarietà sul MDC . Inoltre, gli array hanno proprietà leggermente diverse rispetto a un object. Gli array hanno la proprietà .length . Hanno anche i .slice() , .join() , etc.

Douglas Crockford fornisce una bella panoramica delle caratteristiche della lingua. Il suo sondaggio discute le differenze che stai chiedendo. Inoltre, puoi leggere di più sulla differenza tra letterali e costruttori nella domanda # 4559207.

Le matrici sono oggetti, ma di natura specializzata. Gli oggetti sono raccolte di valori indicizzati da chiavi (nella notazione di Javascript, {'key': 'value'} ), mentre le matrici sono oggetti le cui chiavi sono numeriche (con alcune funzioni e proprietà). La differenza chiave tra di loro è evidente quando si usa a for each ciclo: un object eseguirà iterazioni su tutti i valori nelle sue proprietà, mentre una matrice restituirà le chiavi. Ecco un collegamento a un JSFiddle che dimostra la differenza: si noti che il primo for each , che utilizza un array, restituisce gli indici, non i valori; al contrario, il secondo for each restituisce i valori effettivi su quelle chiavi.