13

背景

通过一些研究,我发现,虽然ArrayBufferView最初没有公开(通过 [NoInterfaceObject]),但由于我描述的用例,似乎广泛同意应该公开。

最初的协议是ArrayBufferView在命名空间上公开构造函数,该构造函数DOMWindow在 Safari(并且在 6.1.1 中仍然有效)和 Chrome 中实现,但后来从 Chrome中拉出以支持静态方法ArrayBuffer.isView()

同时,Mozilla(仍在)谈论实施 ArrayBuffer.isView().

简单来说:

  • Safari 公开ArrayBufferView构造函数

  • 铬有ArrayBuffer.isView()

  • 火狐什么都没有

  • IE - 我什至还没有靠近...

问题

所以,我的问题。检查对象是否为 ArrayBufferView 实例的最简洁方法是什么?

4

2 回答 2

9

我会使用:

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;
}
于 2014-02-15T15:53:09.360 回答
1

我猜更好的答案:

var arr = new Float64Array(100);

arr instanceof (new Uint16Array()).constructor.prototype.__proto__.constructor //true

适用于 Chrome 和 Firefox,也许也适用于其他浏览器

于 2017-10-17T17:07:01.250 回答