Прямо сейчас я добиваюсь этого
if (obj instanceof Uint8Array || obj instanceof Uint16Array || obj instanceof Uint32Array ......
Это очень длинная очередь. Я знаю, что тестирование instanceof против родительского класса объекта дает истину, так есть ли родительский класс среди этих типизированных массивов? Я пробовал TypedArray, но, согласно хрому, его не существует.
Кто-нибудь знает, есть ли базовый класс между типизированными массивами? Или какой-нибудь другой метод?
3 ответа
Прототип TypedArray
существует, но не подвергается прямому воздействию. Вы можете получить его, используя Object.getPrototypeOf
из любого из его типизированных подклассов arry, например:
>> const TypedArray = Object.getPrototypeOf(Uint8Array)
>> console.log((new Uint32Array()) instanceof TypedArray)
true
Таким образом, с указанным выше const TypedArray
в области действия ваша проверка будет просто выглядеть так:
if (obj instanceof TypedArray) { ... }
Я знаю, что это не очень хорошее решение, но я думаю, что вы можете добиться того же поведения, используя хакерский способ. На самом деле мне такое решение не нравится. Я использовал 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
Как насчет того, чтобы сократить его, проверив, не является ли это обычным массивом, подобным этому:
if (!(obj instanceof Array)) {
// Do stuff with typed array
}
Похожие вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript / JS) и его различных диалектах / реализациях (кроме ActionScript). Включите все соответствующие теги в свой вопрос; например, [node.js], [jquery], [json] и т. д.