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?
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
:
Live-Beispiel:
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:
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
:
Wenn Sie einen allgemeineren Test wünschen, der einen der ArrayBufferView- und DataView-Typen abfängt, können Sie Folgendes verwenden:
%Vor%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.
Alle typisierten Arrays erben von ArrayBuffer. Dieser Typ enthält eine byteLength-Eigenschaft. Überprüfen Sie daher, ob diese Eigenschaft verfügbar ist.
%Vor%Tags und Links javascript json stringify typedarray