在最近的一个项目中,我一直在使用一些对象作为其他对象的键。然而,在这样做之后,它们的类型信息被擦除,因为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评估(
我的问题是:
- 是什么导致了这种行为
- 我该如何修复它
是什么导致了这种行为?
属性名称是字符串(如果显式使用Symbol,则为Symbol(。
如果您尝试使用非字符串作为属性名称,那么它将被隐式转换为字符串。
如何修复它?
你不能。
至少要编写代码,将字符串显式转换为对象,然后在读取字符串时调用该代码
是什么导致了这种行为?
对象键应该只有字符串或符号,所以当有任何东西作为非该类型的键传递时,JS会尝试将其转换为字符串,因此它调用的是foo.toString((,您会得到FOO
作为键
如何修复它?
在js中使用有效键,不能将对象用作键。