변수가 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
'programing' 카테고리의 다른 글
| 스프링 부트마다 1개의 @Configuration 클래스를 덮어씁니다@Test (0) | 2023.03.13 |
|---|---|
| Wordpress ACF get_field()가 값을 반환하지 않습니다. (0) | 2023.03.08 |
| JavaScript를 사용하여 파일 다운로드 시작 (0) | 2023.03.08 |
| 반응 useEffect 원인:마운트 해제된 구성 요소에서 반응 상태 업데이트를 수행할 수 없음 (0) | 2023.03.08 |
| 키로 특정 JSON 값을 찾는 방법 (0) | 2023.03.08 |