Wie überprüft man, ob eine Variable ein typisiertes Array in Javascript ist?

7

Ich arbeite an einem Spiel und benutze typisierte Arrays (Float32Arrays) für unsere mathematischen Typen. Wir speichern und laden den Gamestate von JSON. Ein Beispiel für die Ausgabe von JSON stringify ist für ein solches Array (in Chrome):

%Vor%

Dies verschwendet Platz und verursacht, dass sie als Objekte geladen werden, was unbequem ist. Idealerweise könnten wir die stringify-Funktion 'replacer' verwenden, um zu testen, ob eine Variable ein typisiertes Array ist, und sie dann in ein moog-Standardarray umwandeln. Leider bin ich mir nicht sicher, wie man zuverlässig testet, ob eine Variable ein typisiertes Array ist oder nicht.

Irgendwelche Hilfe?

    
AGD 06.03.2013, 15:50
quelle

6 Antworten

9

Wenn Sie zufrieden sind mit einer Float32Array oder Unterklasse von Float32Array , siehe Antons Antwort mit instanceof .

Wenn Sie wissen müssen, dass es spezifisch a Float32Array und keine Unterklasse ist, können Sie yourObject.constructor === Float32Array :

verwenden %Vor%

Live-Beispiel:

%Vor%

Beachten Sie jedoch, dass ein Fehler auftritt, wenn das Objekt aus einer anderen Umgebung stammt (wie ein anderer Rahmen), da verschiedene Umgebungen unterschiedliche Float32Array -Konstruktoren haben (obwohl sie dasselbe tun).

Wenn Sie Fälle unterstützen müssen, in denen constructor nicht funktioniert, können Sie den Object.prototype.toString.call(yourObject) Trick verwenden. Dies liefert eine nützliche Zeichenfolge für alle integrierten JavaScript-Typen ( [object Array] , [object Date] usw.) Pro Spezifikation muss Object.prototype.toString , wenn sie auf ein typisiertes Array angewendet wird, die Zeichenfolge im Format "[object TypedArrayNameHere]" zurückgeben.

Also:

%Vor%

Live-Beispiel:

%Vor%

Beachten Sie, dass es möglich ist, Objekte zu erstellen, die über ihren Typ liegen, so dass Object.prototype.toString dasselbe zurückgibt, wie es für (sagen wir) Float32Array :

zurückgegeben wird

%Vor%
    
T.J. Crowder 06.03.2013, 15:52
quelle
11

ArrayBuffer.isView sollte Ihnen helfen.

%Vor%     
Greg Tatum 15.04.2015 13:12
quelle
10

Sie können auch yourObject instanceof Float32Array construction verwenden. Es gibt true zurück, wenn Ihr Objekt in anderen Fällen eine Instanz von Float32Array und false ist.

%Vor%     
Anton 30.08.2013 10:02
quelle
3

Wenn Sie einen allgemeineren Test wünschen, der einen der ArrayBufferView- und DataView-Typen abfängt, können Sie Folgendes verwenden:

%Vor%     
visibleman 09.07.2014 06:02
quelle
0

Ich bin überrascht, dass niemand diesen hier hat. Dies sollte in den meisten Fällen funktionieren, um herauszufinden, ob Sie ein typisiertes Array haben:

%Vor%

Natürlich ist dies "Ente tippen", und a instanceof Float32Array oder ähnlich ist der beste Weg, um sicher für bestimmte Typen zu wissen.

    
James Wilkins 24.10.2017 04:56
quelle
0

Alle typisierten Arrays erben von ArrayBuffer. Dieser Typ enthält eine byteLength-Eigenschaft. Überprüfen Sie daher, ob diese Eigenschaft verfügbar ist.

%Vor%     
Martin Wantke 29.10.2017 11:25
quelle