检测对象是否为Array或类型化数组
Detect if object is either an Array or typed array
我需要确定给定的对象是Array
还是类型化数组,如Float32Array
。
目前我正在检查是否定义了.length
属性,但这并不总是指示数组。.forEach()
或其他方法的存在性检查也会出现类似的问题。
几个instanceof
检查就足够了,就像这里做的那样-但我想知道是否有一个简单的内置功能,例如,一个通用的Array.isArray()
函数,做我需要的。
function isArrayOrTypedArray(x) {
return Boolean(x && (typeof x === 'object') && (Array.isArray(x) || (ArrayBuffer.isView(x) && !(x instanceof DataView)));
}
遗憾的是,我不相信有。
您可以执行您提到的instanceof
检查,或者您可以检查Object.prototype.toString.call(variable)
的结果,看看它是否是预定义字符串("[object Array]"
, "[object Uint8Array]"
等)之一。
虽然我认为,正如T.J. Crowder已经说过的,没有内置的功能,但您应该能够组合Array.isArray
和ArrayBuffer.isView
来获得您想要的功能:
function isArrayOrTypedArray(x) {
return Array.isArray(x) || (ArrayBuffer.isView(x) &&
Object.prototype.toString.call(x) !== "[object DataView]");
}
如果x
是一个数组, Array.isArray(x)
返回true。如果x
是类型数组或DataView,则ArrayBuffer.isView(x)
返回true,因此我们只需忽略x
是DataView的情况即可获得我们想要的函数。
示范:
function isArrayOrTypedArray(x) {
return Array.isArray(x) || (ArrayBuffer.isView(x) && Object.prototype.toString.call(x) !== "[object DataView]");
}
console.log(isArrayOrTypedArray()); // false
console.log(isArrayOrTypedArray({})); // false
console.log(isArrayOrTypedArray(null)); // false
console.log(isArrayOrTypedArray(undefined)); // false
console.log(isArrayOrTypedArray(new ArrayBuffer(10))); // false
console.log(isArrayOrTypedArray([])); // true
console.log(isArrayOrTypedArray([1,2,3,4,5])); // true
console.log(isArrayOrTypedArray(new Uint8Array())); // true
console.log(isArrayOrTypedArray(new Float32Array())); // true
console.log(isArrayOrTypedArray(new Int8Array(10).subarray(0, 3))); // true
var buffer = new ArrayBuffer(2);
var dv = new DataView(buffer);
console.log(isArrayOrTypedArray(dv)); // false
你可以这样做:
function isArray(array) {
if((array.length || array.length === 0) && (array.constructor !== String)) {
return true;
}
return false;
}
注意,String
也有一个长度属性,我们需要排除它,因此constructor
检查
判断x
是否为ArrayBuffer,您可以利用new DataView(x)
抛出TypeError的事实:DataView构造函数的第一个参数必须是arraybuffer;如果x
不是ArrayBuffer.
换句话说,只要做:
function isArrayBuffer(x) {
try {
new DataView(x);
return true;
}
catch (TypeError) {
return false;
}
}
要测试一个东西是否是typearray,我相信ArrayBuffer.isView
可以胜任。
您可以使用obj.constructor.name
作为获取对象名称的方式,而不是使用instanceof
匹配阶梯。所有这些数组的共同之处在于它们的类名中都有Array
,并且array.length
属性是一个数字。
function isArray(x) {
if (typeof x.length === 'number'
&& x.constructor.name.includes('Array')) {
return true;
}
return false;
}
无论如何,这在Javascript/Node的后续版本中都有效。如果你的JS版本支持,你可以使用name.includes
。
Array.constructor.name
对于[]
是Array
,对于类型化数组则是Uint8Array
。
在其他版本的JavaScript中,您可能需要obj.prototype.constructor.name
.
- Javascript-将类型化数组保存为blob,并作为二进制数据读回
- 在Node.js中用.bin文件内容填充一个类型化数组
- 将非类型化数组编译为 C 的有效方法是什么?
- 如何使用类型化数组来模拟对象
- 编辑类型化数组中的值
- 了解 JavaScript 中类型化数组的概念
- 如何检查是否支持 javascript 类型化数组
- 用于在javascript中存储对象的类型化数组
- 在Javascript中将字符串转换为类型化数组
- 正在类型化数组中移动数据
- 不能给类型化数组缓冲区赋值
- 检测对象是否为Array或类型化数组
- 从类型化数组更新svg路径
- 如何在JavaScript类型化数组中使用字符串
- 类型化数组vs数组用例
- 是否有可能在JavaScript中使用类型化数组从4x Uint8转换为Uint32 ?
- 为什么类型化数组构造函数要求offset为基础类型大小的数倍
- 如何检查变量是否是javascript中的类型化数组
- 有没有一种方法可以将类型化数组设置为零
- TypeError:使用类型化数组时发生类型错误