使用Array.sort()排序对象数组报错:ReferenceError: b is not defined
解决sort回调中的ReferenceError: b is not defined问题
我来帮你拆解下问题所在,你遇到的错误主要是语法错误导致代码解析失败,和a、b本身是否存在无关:
核心错误原因
你的sort回调代码里有两个致命的语法问题:
- 多余的TypeScript类型注解:
typeof a.name: string里的: string是TypeScript里用来标注类型的写法,但你现在是在JavaScript表达式里写这个,完全不符合语法规范,直接打乱了代码的解析逻辑,导致引擎无法正确识别回调参数b,所以抛出了ReferenceError: b is not defined。 - 缺少闭合括号:你的代码最后只写了
},但没有闭合sort方法的参数括号),导致整个sort调用的语法不完整。
另外还有个逻辑小问题:a.name - b.name只适合name是数字的场景,如果是字符串的话,这个减法会得到NaN,会干扰排序结果。
修正后的代码
我帮你调整了语法和排序逻辑,兼顾字符串、数字类型的name,同时把非字符串的项排在后面:
myArray.sort((a, b) => { // 先区分是否为字符串:非字符串排到后面 const aIsString = typeof a.name === 'string'; const bIsString = typeof b.name === 'string'; if (!aIsString && bIsString) return 1; if (aIsString && !bIsString) return -1; // 都是字符串的情况:先尝试按数字排序(如果是数字字符串),否则用localeCompare if (aIsString && bIsString) { const aNum = Number(a.name); const bNum = Number(b.name); if (!isNaN(aNum) && !isNaN(bNum)) { return aNum - bNum; } return a.name.localeCompare(b.name); } // 都不是字符串的情况:转成字符串统一比较 return String(a.name).localeCompare(String(b.name)); });
为什么console.log的版本能正常运行?
你测试的myArray.sort( (a, b) => { console.log(a.name); console.log(b.name); }这个代码,语法是完整的(箭头函数的大括号闭合了,sort的参数括号也闭合了),所以引擎能正确解析回调函数的参数a和b,自然能正常打印值。
内容的提问来源于stack exchange,提问作者newman
相关产品推荐
相关产品推荐

