使用对象作为键将擦除类型信息



在最近的一个项目中,我一直在使用一些对象作为其他对象的键。然而,在这样做之后,它们的类型信息被擦除,因为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. 我该如何修复它

是什么导致了这种行为?

属性名称是字符串(如果显式使用Symbol,则为Symbol(。

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

如何修复它?

你不能。

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

是什么导致了这种行为?

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

如何修复它?

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

最新更新