JavaScript匿名函数是否自动转换参数类型?对象键排序场景疑问
问题解答
核心原因:JS对象的键本质都是字符串
你遇到的现象和匿名函数的自动类型转换无关,问题根源在于JavaScript对象的键会被强制转换为字符串类型——不管你定义对象时用的是数字、布尔还是其他可转换为字符串的类型,最终存储的键都是字符串。
比如你定义:
const myObj = { 10: 'num', true: 'bool', 'str': 'string' };
实际对象的键是"10"、"true"、"str",而非原始的数字或布尔值。
而Object.entries(myObj)返回的是对象键值对的数组,其中每个子数组的第一个元素(也就是你代码里的key1、key2)必然是字符串类型,所以调用localeCompare完全合法,不会出现像直接用数字调用时的报错。
为什么直接调用数字的localeCompare会报错
localeCompare是String类型专属的方法,Number、Boolean等类型本身并没有这个方法。所以直接执行(10).localeCompare(11)时,JS会找不到对应的方法,自然抛出错误。
三个排序函数表现一致的原因
因为key1、key2本身已经是字符串,所以:
- 第一个函数里的
key1.localeCompare(key2),本质是两个字符串调用localeCompare; - 第二个函数
key1.toLocaleString().localeCompare(key2),字符串调用toLocaleString会返回自身,等价于第一个函数; - 第三个函数
key1.toLocaleString().localeCompare(key2.toLocaleString()),同样两个字符串转字符串后对比,结果和前两个完全一致。
这就是为什么三个函数的排序效果没有区别。
总结
匿名函数并不会自动对参数进行类型转换适配函数内的使用。你代码里的排序函数能处理非字符串键的对象,是因为Object.entries返回的键已经被JS自动转换为字符串了,并非匿名函数做了类型转换。
内容的提问来源于stack exchange,提问作者Travis Bemrose
相关产品推荐
相关产品推荐

