Javascript 为什么可以';我不能用一个函数作为地图的键吗?
考虑由同一表达式或声明(即,由同一行代码)创建的两个不同的函数对象。在这种情况下,这些函数是Javascript 为什么可以';我不能用一个函数作为地图的键吗?,javascript,javascript-objects,Javascript,Javascript Objects,考虑由同一表达式或声明(即,由同一行代码)创建的两个不同的函数对象。在这种情况下,这些函数是wa和wb,由wrap函数中的相同表达式创建: function a() { return "abc" } function b() { return 123 } function wrap(f) { return () => f() } var wa = wrap(a) var wb = wrap(b) 任何这两种功能 不会根据==比较相等 将不会根据对象进行相等比较。is 但是将被Map视为
wa
和wb
,由wrap
函数中的相同表达式创建:
function a() { return "abc" }
function b() { return 123 }
function wrap(f) { return () => f() }
var wa = wrap(a)
var wb = wrap(b)
任何这两种功能
- 不会根据
比较相等==
- 将不会根据
对象进行相等比较。is
- 但是将被
视为相等的键Map
sameValueZero
算法:NaN
被认为与NaN
相同(即使NaN!==NaN
),并且根据===
运算符的语义,所有其他值被认为相等
您还可以阅读他们对和的定义。根据我的理解,两个不同的函数对象应该是两个不同的键
(
Object
s表现出相同的行为,但因为它们不支持非字符串或符号的键,我给它们一个通行证。我标记它们是因为Map
s没有标记。)您没有正确设置贴图键-您将贴图视为普通对象,在普通对象上放置键会导致键被转换为字符串。所以
var m = new Map()
m[wa] = "hello, world!"
m[wb]
将wa
和wb
强制为字符串(因为对象键只能是字符串),上述代码解析为
var m = new Map()
m["() => f()"] = "hello, world!"
m["() => f()"]
要正确使用映射(以便它可以具有任何类型的键,包括不被强制为字符串的函数和对象),请使用Map.set
和Map.get
。然后,行为将如预期的那样-两个单独的函数彼此之间没有关联,在映射中将具有不同的键:
函数a(){return“abc”}
函数b(){return 123}
函数换行(f){return()=>f()}
var wa=包裹(a)
var wb=包裹(b)
常数m=新映射();
m、 设置(wa,“你好,世界”);
console.log(m.get(wb));//未定义;映射将wa和wb视为不同的,正如预期的那样
您没有正确设置映射键-您将映射视为普通对象,将键放置在普通对象上会导致键转换为字符串。所以
var m = new Map()
m[wa] = "hello, world!"
m[wb]
将wa
和wb
强制为字符串(因为对象键只能是字符串),上述代码解析为
var m = new Map()
m["() => f()"] = "hello, world!"
m["() => f()"]
要正确使用映射(以便它可以具有任何类型的键,包括不被强制为字符串的函数和对象),请使用Map.set
和Map.get
。然后,行为将如预期的那样-两个单独的函数彼此之间没有关联,在映射中将具有不同的键:
函数a(){return“abc”}
函数b(){return 123}
函数换行(f){return()=>f()}
var wa=包裹(a)
var wb=包裹(b)
常数m=新映射();
m、 设置(wa,“你好,世界”);
console.log(m.get(wb));//未定义;地图上显示wa和wb是不同的,正如预期的那样
getwa
不会说明问题已经解决-尝试获取wb
而没有得到任何回报表明wa
没有被地图视为与wb
getwa
相同的键不会说明问题已经解决-尝试获取wb
和没有得到任何回报表明wa
没有被映射视为与wb
相同的键