programing

변수가 javascript에서 typeed 배열인지 확인하는 방법

iphone6s 2023. 3. 8. 20:51
반응형

변수가 javascript에서 typeed 배열인지 확인하는 방법

게임을 하고 있는데, 타입 어레이를 폭넓게 사용하고 있습니다(Float32).어레이)를 참조해 주세요.JSON에서 gamestate를 저장하고 로드합니다.이러한 어레이(Chrome 의 경우)에 대한 JSON stringify 출력의 예는 다음과 같습니다.

"{"0":0,"1":0,"2":0,"length":3,"byteLength":12,"byteOffset":0,"buffer":{"byteLength":12}}"

이로 인해 공간이 낭비되고 물건으로 적재되어 불편합니다.stringify 'replacer' 함수를 사용하여 변수가 유형 배열인지 테스트한 후 bog 표준 배열로 변환하는 것이 이상적입니다.안타깝게도 변수가 유형 배열인지 아닌지 확실하게 테스트하는 방법을 잘 모르겠습니다.

도움이 필요하신가요?

ArrayBuffer.isView도움이 될 거야

var data = [0,1,2]
var dataBuffer = new ArrayBuffer( data )
var dataBufferView = new Float32Array( data )

ArrayBuffer.isView(data) //false
ArrayBuffer.isView(dataBuffer) //false
ArrayBuffer.isView(dataBufferView) //true
dataBuffer instanceof ArrayBuffer //true

만약 당신이 행복하다면Float32Array 또는 서브클래스의Float32Array체크하고 있는 코드와 같은 영역(느슨한 창)의 것이 됩니다.를 사용하여 Anton의 답변을 참조하십시오.

만약 당신이 확실히 알아야 한다면Float32Array서브클래스가 아닌 (및 같은 렐름의) 서브클래스를 사용할 수 있습니다.yourObject.constructor === Float32Array:

if (yourObject.constructor === Float32Array) {
     // It's a Float32Array
}

라이브 예:

if (typeof Float32Array === "undefined") {
  console.log("This browser doesn't support Float32Array");
} else {
  var array = new Float32Array(10);
  console.log(array.constructor === Float32Array); // true
}

다만, 오브젝트가 다른 렐름(다른 프레임 등)에서 발신된 경우, 는 실패합니다.환경에 따라 다르기 때문입니다.Float32Array(동일한 작업을 수행해도) 컨스트럭터입니다.

다음과 같은 경우를 지원해야 하는 경우constructor동작하지 않습니다.Object.prototype.toString.call(yourObject)trick. 모든 JavaScript 기본 제공 유형에 대해 유용한 문자열을 반환합니다([object Array],[object Date]) 사양에 따라Object.prototype.toString입력된 배열에 적용되는 경우 형식의 문자열을 반환해야 합니다."[object TypedArrayNameHere]".

그래서:

if (Object.prototype.toString.call(yourObject) === "[object Float32Array]") {
     // It's a Float32Array
}

라이브 예:

if (typeof Float32Array === "undefined") {
  console.log("This browser doesn't support Float32Array");
} else {
  console.log("Object.prototype.toString.call(new Float32Array()) returns: \"" +
    Object.prototype.toString.call(new Float32Array()) + "\"");
}

자신의 유형에 대해 거짓말을 하는 개체를 만들 수 있습니다.Object.prototype.toString답례품(말)과 같은 것을 답례품을 답례하다Float32Array:

const real = new Float32Array();
const fake = {
  get [Symbol.toStringTag]() {
    return "Float32Array";
  }
};
const realString = Object.prototype.toString.call(real);
const fakeString = Object.prototype.toString.call(fake);
console.log(realString);
console.log(fakeString);
console.log(realString === realString);

// You can also create a class that returns objects that lie:
class Foo {
  get [Symbol.toStringTag]() {
    return "Float32Array";
  }
}
const fake2 = new Foo();
console.log(Object.prototype.toString.call(fake2));

를 사용할 수도 있습니다.yourObject instanceof Float32Array구축.다시 돌아오다true대상이 의 인스턴스인 경우Float32Array그리고.false다른 경우에는요.

if (yourObject instanceof Float32Array) {
    // your code here
}

MDN에 따르면 가능한 모든 TypeArray를 테스트하려면 TypeArray 컨스트럭터를 사용할 수 있습니다.이 생성자를 사용하여 유형이 동일한지 테스트할 수 있습니다.

var x = new Uint32Array();
var TypedArray = Object.getPrototypeOf(Uint8Array);
console.log(x instanceof TypedArray);

이것을 다음과 같은 함수에 저장할 수 있습니다.

const isTypedArray = (function() {
  const TypedArray = Object.getPrototypeOf(Uint8Array);
  return (obj) => obj instanceof TypedArray;
})();

아무도 이걸 못 맞히다니 놀랍네요대부분의 경우, 타입이 지정된 어레이가 있는지 아닌지를 판별할 수 있습니다.

function isTypedArray(a) { return !!(a.buffer instanceof ArrayBuffer && a.BYTES_PER_ELEMENT); }

var a = [];
console.log(isTypedArray(a)); // (false);
var a = new Float32Array(3);
console.log(isTypedArray(a)); // (true);
var dataView = new DataView(a.buffer);
console.log(isTypedArray(dataView)); // (false);
console.log(isTypedArray(Float32Array)); // (false);

물론 이건 '덕타이핑'이고a instanceof Float32Array특정 유형을 확실히 알 수 있는 가장 좋은 방법입니다.

ArrayBufferView 및 DataView 유형 중 하나를 검출하는 보다 일반적인 테스트를 원하는 경우 다음을 사용할 수 있습니다.

if (Object.prototype.toString.call(yourObject.buffer) === "[object ArrayBuffer]") {
     // It's either an ArrayBufferView or a DataView
}

모든 유형의 어레이는 ArrayBuffer에서 상속됩니다.이 유형에는 byteLength 속성이 포함되어 있으므로 이 속성을 사용할 수 있는지 간단히 확인하십시오.

function isTypedArray(obj)
{
    return !!obj && obj.byteLength !== undefined;
}

TypeArray를 반환하는 모든 컨스트럭터를 실제로 찾는 간단한 방법:

isTypedArray = _ => _?.prototype?.__proto__?.constructor?.name == "TypedArray";
for (const key of Object.getOwnPropertyNames(window)) {
  const obj = window[key];
  if (isTypedArray(obj)) {
    console.log(key, "is a TypedArray");
  }
}

현재 Chrome에서의 출력:

Uint8Array is a TypedArray
Int8Array is a TypedArray
Uint16Array is a TypedArray
Int16Array is a TypedArray
Uint32Array is a TypedArray
Int32Array is a TypedArray
Float32Array is a TypedArray
Float64Array is a TypedArray
Uint8ClampedArray is a TypedArray
BigUint64Array is a TypedArray
BigInt64Array is a TypedArray

언급URL : https://stackoverflow.com/questions/15251879/how-to-check-if-a-variable-is-a-typed-array-in-javascript

반응형