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是不同的,正如预期的那样
get
wa
不会说明问题已经解决-尝试获取
wb
而没有得到任何回报表明
wa
没有被地图视为与
wb
get
wa
相同的键不会说明问题已经解决-尝试获取
wb
和没有得到任何回报表明
wa
没有被映射视为与
wb
相同的键