0

在最近的一个项目中,我一直在使用一些对象作为其他对象的键。但是,这样做之后,它们的类型信息将被删除,因为它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. 我如何解决它?
4

2 回答 2

1

是什么导致了这种行为?

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

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

我如何解决它?

你不能。

至少在不编写代码以将字符串显式转换为对象并在读取字符串时调用该代码的情况下是这样。

于 2021-07-01T18:13:43.220 回答
1

是什么导致了这种行为?

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

我如何解决它?

在 js 中使用有效的键,不能使用对象作为键。

于 2021-07-01T18:17:20.767 回答