【问题标题】:Using object as key erases type information使用对象作为键擦除类型信息
【发布时间】:2021-09-13 19:27:50
【问题描述】:

在最近的一个项目中,我一直在使用一些对象作为其他对象的键。但是,在这样做之后,它们的类型信息被删除,instanceof 不再正常工作。

MWE:

class Foo {

    toString() {
        return "FOO";
    }

}

var foo = new Foo();
var keyObj = {};
keyObj[foo] = "y";
console.log(foo instanceof Foo);  // true
console.log(Object.keys(keyObj)[0].toString());  // prints "FOO" - this *is* a Foo
console.log(Object.keys(keyObj)[0] instanceof Foo);  // false

(使用 nodejs 评估)

我的问题是:

  1. 是什么导致了这种行为?
  2. 如何解决?

【问题讨论】:

    标签: javascript class types


    【解决方案1】:

    是什么导致了这种行为?

    对象键应该只是字符串或符号,所以当有任何东西作为非该类型的键传递时,JS 会尝试将其转换为字符串,所以它调用 foo.toString() 并且你得到 FOO 为键

    我该如何解决?

    在js中使用有效的key,不能使用object作为key。

    【讨论】:

      【解决方案2】:

      是什么导致了这种行为?

      属性名称是字符串(如果您明确使用符号,则为符号)。

      如果您尝试使用非字符串作为属性名称,那么它将被隐式转换为字符串。

      我该如何解决?

      你不能。

      至少不写代码将字符串显式转换为对象,然后在读取字符串时调用该代码。

      【讨论】:

      • 那是……嗯。我将制作一个地图类来实现我想要的行为。谢谢!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2020-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多