如何检查变量是否是javascript中的类型化数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查变量是否是javascript中的类型化数组?相关的知识,希望对你有一定的参考价值。

我正在开发一款游戏,我们为数学类型广泛使用了类型数组(Float32Arrays)。我们从JSON保存并加载游戏状态。 JSON stringify输出的一个例子就是这样一个数组(在Chrome中)是:

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

这会浪费空间并导致它们作为不方便的对象加载。理想情况下,我们可以使用stringify'replacer'函数来测试变量是否是类型化数组,然后在这种情况下将其转换为bog标准数组。不幸的是,我不确定如何可靠地测试变量是否是类型化数组。

有帮助吗?

答案

如果你对它是Float32ArrayFloat32Array的子类感到满意,它们将来自与你正在检查的代码相同的realm(松散地,窗口),see Anton's answer using instanceof

如果你需要知道它特别是一个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
}
另一答案

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
另一答案

你也可以使用yourObject instanceof Float32Array结构。如果您的对象是trueFloat32Array的实例,则返回false

if (yourObject instanceof Float32Array) {
    // your code here
}
另一答案

我很惊讶没有人在下面得到这个。在大多数情况下,这应该可以确定您是否有类型数组:

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;
}

以上是关于如何检查变量是否是javascript中的类型化数组?的主要内容,如果未能解决你的问题,请参考以下文章

如何检查变量是不是是javascript中的类型化数组?

如何检查一个变量是不是是 JavaScript 中的一个数组?

如何检查变量是不是是 Ruby 中的日期或时间或日期时间?

如何在javascript中检查变量类型[重复]

如何检查 JavaScript 中是不是存在变量?

如何检查 JavaScript 中是不是存在变量?