Прямо сейчас я добиваюсь этого

if (obj instanceof Uint8Array || obj instanceof Uint16Array || obj instanceof Uint32Array ......

Это очень длинная очередь. Я знаю, что тестирование instanceof против родительского класса объекта дает истину, так есть ли родительский класс среди этих типизированных массивов? Я пробовал TypedArray, но, согласно хрому, его не существует.

Кто-нибудь знает, есть ли базовый класс между типизированными массивами? Или какой-нибудь другой метод?

2
user81993 21 Янв 2021 в 12:02

3 ответа

Лучший ответ

Прототип TypedArray существует, но не подвергается прямому воздействию. Вы можете получить его, используя Object.getPrototypeOf из любого из его типизированных подклассов arry, например:

>> const TypedArray = Object.getPrototypeOf(Uint8Array)
>> console.log((new Uint32Array()) instanceof TypedArray)
true

Таким образом, с указанным выше const TypedArray в области действия ваша проверка будет просто выглядеть так:

if (obj instanceof TypedArray) { ... }
2
Thomas 21 Янв 2021 в 10:15

Я знаю, что это не очень хорошее решение, но я думаю, что вы можете добиться того же поведения, используя хакерский способ. На самом деле мне такое решение не нравится. Я использовал Uint8Array.__proto__, я понятия не имею, почему прототип массивов Uint не существует в chrome.

const uint8Array = new Uint8Array();
const uint16Array = new Uint16Array();
const uint32Array = new Uint32Array();

console.log(uint8Array instanceof Uint8Array.__proto__); //true
console.log(uint16Array instanceof Uint8Array.__proto__); //true
console.log(uint32Array instanceof Uint8Array.__proto__); //true

Редактировать:

const typedArrays = [new Uint8Array(), new Uint16Array(), new Uint32Array()];

const result = typedArrays.every(elem => elem instanceof Uint8Array.__proto__);

console.log(result);

Итак, вы можете проверить любой типизированный массив с помощью Uint8Array.__proto__.

Изменить 2:

const isTypedArray = (arg) => {
  return arg instanceof Uint8Array.__proto__;
};


console.log(isTypedArray(uint8Array));// true
console.log(isTypedArray(uint16Array));// true
console.log(isTypedArray(uint32Array));// true
0
Thant Sin Aung 21 Янв 2021 в 09:44

Как насчет того, чтобы сократить его, проверив, не является ли это обычным массивом, подобным этому:

if (!(obj instanceof Array)) {
  // Do stuff with typed array
}
0
Ethan Vu 21 Янв 2021 в 10:08
65824084