javascript - length - jquery isarray




Unterschied zwischen der Verwendung von Array.isArray und der Instanz von Array (2)

Es gibt zwei Möglichkeiten, um herauszufinden, ob ein Array ein Array oder ein Objekt ist. Verwenden von typeof item === "object"; gibt für ein Objekt und ein Array den Wert true zurück, da Arrays relativ neu in Javascript sind und Arrays Prototypen von Objekten sind (dies hat möglicherweise falsch gehandelt, bitte korrigieren Sie mich). Die zwei mir bekannten Methoden zum Bestimmen, ob ein Array ein Array ist, sind:

Lösung 1:

Array.isArray(item);

Lösung 2:

item instanceof Array;

Meine Fragen sind:

  1. Was ist der Unterschied zwischen diesen beiden Lösungen?
  2. Welche der beiden ist die bevorzugte Lösung?
  3. Welches hat eine schnellere Prozesszeit?

1.Was ist der Unterschied zwischen diesen beiden Lösungen?

isArray ist eine ES5-Methode, die von älteren Browsern nicht unterstützt wird, jedoch zuverlässig ermittelt, ob ein Objekt ein Array ist.

instanceof prüft nur, ob Array.prototype sich in der [[Prototype]] -Kette eines Objekts befindet. Es schlägt fehl, wenn Arrays über Frames geprüft werden, da der für die Instanz verwendete Array- Konstruktor sich wahrscheinlich von dem für den Test verwendeten unterscheidet.

2.Welche dieser beiden Lösungen ist die bevorzugte Lösung?

"Bevorzugt" setzt einige Auswahlkriterien voraus. Im Allgemeinen ist die bevorzugte Methode so etwas wie:

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

das passt zu ES3-Browsern und funktioniert über Frames hinweg. Wenn nur ES5-Browser in Betracht kommen, ist isArray wahrscheinlich in Ordnung.

3.Welches hat eine schnellere Prozesszeit?

Weitgehend unerheblich, da die Bearbeitungszeit für beide vernachlässigbar ist. Viel wichtiger ist es, den zuverlässigen auszuwählen. Eine Array.isArray- Methode kann zu Browsern hinzugefügt werden, für die sie nicht integriert ist.

if (!Array.isArray) {
    Array.isArray = function(obj) {
      return Object.prototype.toString.call(obj) == '[object Array]';
    }
}

  1. Unterschied zwischen Array.isArray(item) und Array.isArray(item) item instanceof Array

    Wie Felix Kling in dem Kommentar erwähnt, funktioniert die instanceof Array nicht über Iframes hinweg. Versuchen Sie den folgenden Code, um Ihnen ein bestimmtes Beispiel zu geben:

    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    

    Wie Sie im obigen Beispiel sehen, wird ein Array, das mit dem Array-Konstruktor in iframe (dh array2 ) erstellt wurde, nicht als Array erkannt, wenn Sie instanceof Array . Bei Verwendung von Array.isArray() wird es jedoch korrekt als Array identifiziert.

    Wenn Sie wissen möchten, warum instanceof Array nicht über verschiedene Globals hinweg funktioniert (z. B. Iframe oder window ), können Sie here mehr darüber erfahren.

  2. Welche der beiden ist die bevorzugte Lösung?

    In den meisten Fällen sollte instanceof Array ausreichend sein. Da die instanceof Array jedoch nicht in iframes / window korrekt iframes , wäre Array.isArray() eine robustere Lösung.

    Vergewissern Sie sich jedoch, dass Sie die Browserkompatibilität überprüfen. Wenn Sie IE 8 oder weniger unterstützen müssen, Array.isArray() nicht (siehe Mozilla-Dokument ).

  3. Welches hat eine schnellere Prozesszeit?

    Gemäß dieser jsperf ist instanceof Array schneller als Array.isArray() . Das macht Sinn, weil Array.isArray() eine robustere Überprüfung durchführt und daher einen geringfügigen Performance-Treffer verursacht.







arrays