Differenza tra l’utilizzo di Array.isArray e instanceof Array

Esistono due modi per capire se una matrice è una matrice o un object. Usando typeof item === "object"; restituirà true per un object e un array poiché gli array sono relativamente nuovi per javascript e gli array sono prototipi di oggetti (potrebbe averlo scritto in modo errato, sentiti libero di correggermi). Quindi i due modi che conosco per determinare se una matrice è una matrice sono:

Soluzione 1:

 Array.isArray(item); 

Soluzione 2:

 item instanceof Array; 

Le mie domande sono:

  1. Qual è la differenza tra queste due soluzioni?
  2. Quale di questi due è la soluzione preferita?
  3. Quale ha un tempo di elaborazione più veloce?

1. Qual è la differenza tra queste due soluzioni?

isArray è un metodo ES5 quindi non supportato dai browser più vecchi, ma determina in modo affidabile se un object è una matrice.

instanceof controlla solo se Array.prototype si trova sulla catena [[Prototype]] un object. Non riesce quando si controllano le matrici attraverso i frame poiché il costruttore di Array utilizzato per l’istanza sarà probabilmente diverso da quello utilizzato per il test.

2. Quale di questi due è la soluzione preferita?

“Preferred” presuppone alcuni criteri per la selezione. Generalmente, il metodo preferito è qualcosa come:

 if (Object.prototype.toString.call(obj) == '[object Array]') 

che si adatta ai browser ES3 e funziona su frame. Se solo i browser ES5 sono in considerazione, isArray è probabilmente OK.

3.Che ha un tempo di processo più veloce?

In gran parte irrilevante, poiché il tempo di elaborazione per entrambi è trascurabile. Molto più importante per selezionare quello che è affidabile. Un metodo Array.isArray può essere aggiunto ai browser che non lo hanno integrato utilizzando:

 if (!Array.isArray) { Array.isArray = function(obj) { return Object.prototype.toString.call(obj) == '[object Array]'; } } 
  1. Differenza tra Array.isArray(item) e item instanceof Array

    Come menzionato da Felix Kling nel commento, instanceof Array non funziona su iframe. Per darti un esempio specifico, prova il seguente codice:

     var iframeEl = document.createElement('iframe'); document.body.appendChild(iframeEl); iframeArray = window.frames[window.frames.length - 1].Array; var array1 = new Array(1,1,1,1); var array2 = new iframeArray(1,1,1,1); console.log(array1 instanceof Array); // true console.log(Array.isArray(array1)); // true console.log(array2 instanceof Array); // false console.log(Array.isArray(array2)); // true 

    Come si vede nell’esempio sopra, la matrice creata con il costruttore Array in iframe (cioè array2 ) non viene riconosciuta come matrice quando si utilizza l’ instanceof Array . Tuttavia, viene identificato correttamente come matrice quando si utilizza Array.isArray() .

    Se sei interessato a sapere perché instanceof Array non funziona su diversi globals (ie iframe o window ), puoi leggere di più su questo qui .

  2. Quale di questi due è la soluzione preferita?

    Nella maggior parte dei casi l’ instanceof Array dovrebbe essere sufficiente. Tuttavia, poiché instanceof Array non funziona correttamente su iframes / window , Array.isArray() sarebbe una soluzione più robusta.

    Assicurati però di verificare la compatibilità del browser. Se è necessario supportare IE 8 o meno, Array.isArray() non funzionerà (consultare il documento di Mozilla ).

  3. Quale ha un tempo di elaborazione più veloce?

    Secondo questo jsperf , instanceof Array è più veloce di Array.isArray() . Il che ha senso, perché Array.isArray() esegue un controllo più robusto e quindi subisce un leggero Array.isArray() prestazioni.