如何检查Javascript中的es6代理类型?

时间:2019-04-02 16:51:24

标签: javascript es6-proxy

我正在使用ES6代理。我已经创建了一个数组的代理,现在当我检查代理的类型时,它就是Object类型。

问题:

如何检查我创建的代理是用于数组还是对象?

示例:

const arr = ['a', 'b', 'c'];

const arrProxy = new Proxy(arr, {});

alert(typeof(arrProxy));

更新(解决方案): 而不是使用typeof,我们应该使用Array.isArray

const arr = ['a', 'b', 'c'];

const arrProxy = new Proxy(arr, {});

alert(Array.isArray(arrProxy));

3 个答案:

答案 0 :(得分:3)

您不能说代理是代理。这就是它们的意义所在,它们为另一个物体提供了立面(您无法检测到的立面)。

就看您的arrProxy的代码而言,它是一个数组:

const arr = ['a', 'b', 'c'];

const arrProxy = new Proxy(arr, {});

console.log(Array.isArray(arrProxy)); // true

另外:typeof很普遍,它为您提供"object"的各种功能:任何对象(非原始)类型的东西(包括{{ 1}})。因此nulltypeof new Map()typeof new Set()typeof null(在浏览器上)等都可以给您typeof document。 (还请注意,"object"是运算符,而不是函数;代码示例中不需要typeof。)

答案 1 :(得分:1)

还有一种使用instanceof的方法:

if (arrProxy instanceof Array) {
   console.log('This is an array!');
}

答案 2 :(得分:0)

正如其他答案所暗示的那样,您无法判断某物是否是代理。

所以你可能需要自己实现它。

下面是一个例子:https://exploringjs.com/deep-js/ch_proxies.html#transparent-virtualization-and-handler-encapsulation

const proxies = new WeakSet();

export function createProxy(obj) {
  const handler = {};
  const proxy = new Proxy(obj, handler);
  proxies.add(proxy);
  return proxy;
}

export function isProxy(obj) {
  return proxies.has(obj);
}