通过一些研究我发现,虽然ArrayBufferView
最初没有暴露(通过[NoInterfaceObject]),但由于我描述的用例,似乎应该有广泛的一致意见。
最初的协议是在ArrayBufferView
命名空间上公开DOMWindow
构造函数,该命名空间在Safari(并且仍在6.1.1中)和Chrome中实现,但当时pulled from Chrome支持静态方法ArrayBuffer.isView()
。
与此同时,Mozilla(仍然)talking about implementing ArrayBuffer.isView()
。
ArrayBufferView
构造函数ArrayBuffer.isView()
所以,我的问题。检查对象是否是ArrayBufferView实例的最简洁方法是什么?
我会使用:
function isAbv(value) {
return value && value.buffer instanceof ArrayBuffer && value.byteLength !== undefined;
}
要么:
var ArrayBufferView = Object.getPrototypeOf(Object.getPrototypeOf(new Uint8Array)).constructor;
function isAbv(value) {
return value instanceof ArrayBufferView;
}
我猜是更好的答案:
var arr = new Float64Array(100);
arr instanceof (new Uint16Array()).constructor.prototype.__proto__.constructor //true
适用于Chrome和Firefox,也可能适用于其他浏览器