【问题标题】:How to check the type of es6 proxy in Javascript?如何在 Javascript 中检查 es6 代理的类型?
【发布时间】:2019-08-24 01:58:38
【问题描述】:

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

问题:

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

示例:

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

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

alert(typeof(arrProxy));

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

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

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

alert(Array.isArray(arrProxy));

【问题讨论】:

  • typeof [] 也是“对象”,试试Array.isArray(arrProxy)
  • 您是在问如何判断arrProxy 是一个数组,还是如何判断它是一个代理

标签: javascript es6-proxy


【解决方案1】:

你不能说代理就是代理。这是它们的重点,它们在另一个对象周围提供了一个外观(您无法检测到的外观)。

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

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

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

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

另外:typeof非常 通用的,它为您提供了范围广泛的 "object":任何对象(非原始)类型(包括 null)。所以typeof new Map()typeof new Set()typeof nulltypeof document(在浏览器上)等等,都会给你"object"。 (另请注意,typeof 是运算符,而不是函数;代码示例中不需要 ()。)

【讨论】:

    【解决方案2】:

    还有一种方法可以使用instanceof

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

    【讨论】:

    • 这对于您从另一个 realm 接收的任何数组都将失败。这就是为什么我们有Array.isArray
    • 这里的another realm 是什么意思?
    • @JoharZaman - A realm "...由一组内在对象、一个 ECMAScript 全局环境、在该全局环境范围内加载的所有 ECMAScript 代码组成,以及其他相关的状态和资源。” 例如,如果您有一个包含 iframe 的页面,则该页面和 iframe 是独立的领域;如果您将数组从一个传递到另一个,instanceof 将不起作用。同样,如果一个窗口打开另一个窗口,如果您在它们之间传递数据,则该数据是跨领域的。
    • @marsibarsi instanceof 有问题。当我使用arrProxy instanceof Object 时,它仍然是真实的。
    • Array__proto__Object 这就是为什么arrProxy instanceof Object 也是true
    【解决方案3】:

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

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

    下面是一个例子: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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2013-12-27
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      相关资源
      最近更新 更多