Identificare quali oggetti sono is complicated in JavaScript e determinare quali oggetti sono matrici ha qualcosa di hacky solution. Per fortuna, riesce a lavorare in entrambi i seguenti casi:È possibile determinare se un oggetto creato con Object.create eredita dalla matrice in JavaScript?
Object.prototype.toString.call([]); // [object Array]
Object.prototype.toString.call(new Array()); // [object Array]
Grande, non [object Object]
in vista! Purtroppo, questo metodo riesce ancora a fallire con questo:
var arr = Object.create(Array.prototype);
Object.prototype.toString.call(arr); // [object Object]
Questo è frustrante, per non dire altro. Il mio oggetto arr
ha tutti i metodi di un array, funziona come un array e, per tutti gli scopi, lo è un array. Tuttavia JavaScript non fornisce gli strumenti per identificarlo come tale.
C'è un modo per capire se un oggetto eredita da un particolare prototipo? Suppongo che si possa scorrere i prototipi in questo modo:
function inherits(obj, proto) {
while (obj != null) {
if (obj == proto) return true;
obj = Object.getPrototypeOf(obj);
}
return false;
}
inherits(Object.create(Array.prototype), Array.prototype); // true
Ma ci si sente un po 'hacky. C'è un approccio più pulito?
Sono solo curioso: perché mai creare un array come questo? 'Object.create (Array.prototyp);' e lo controlla tramite 'Object.prototype.toString.call (arr);' – Zim84
@ Zim84: Penso che questo sia solo un esempio. Nelle applicazioni reali, non dovremmo mai farlo. Nelle applicazioni reali, Object.create (Array.prototype) può essere chiamato da qualche altra parte e passare l'oggetto creato a un'altra funzione –
Il problema è che in realtà non si dispone di un array vero (ad esempio non ha il magico ' proprietà di lunghezza', solo una che sembra a prima vista). Quello che hai è un array che sembra avere tutti i metodi di un vero array. Se vuoi verificare la presenza di array-like, dovresti semplicemente vedere se ha una proprietà 'length' e non è una stringa. Questo è il migliore IMO. Se si desidera verificare la presenza di allineamenti veri, continuare a utilizzare 'Object.prototype.toString.call' o' Array.isArray' e sapere che un oggetto con prototipo di 'Array.prototype' non è necessariamente un array vero. –