You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Array.sort()排序对象数组报错:ReferenceError: b is not defined

解决sort回调中的ReferenceError: b is not defined问题

我来帮你拆解下问题所在,你遇到的错误主要是语法错误导致代码解析失败,和a、b本身是否存在无关:

核心错误原因

你的sort回调代码里有两个致命的语法问题:

  1. 多余的TypeScript类型注解:typeof a.name: string里的: string是TypeScript里用来标注类型的写法,但你现在是在JavaScript表达式里写这个,完全不符合语法规范,直接打乱了代码的解析逻辑,导致引擎无法正确识别回调参数b,所以抛出了ReferenceError: b is not defined。
  2. 缺少闭合括号:你的代码最后只写了},但没有闭合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:23:02