JavaScript 中的 Array.sort() - 我在一次面试中被问到这个问题

2025-06-09

JavaScript 中的 Array.sort() - 我在一次面试中被问到这个问题

我在一次面试中收到了一组字符串。

const arr = [
  "karachi",
  "lahore",
  "kolachi",
  "islamabad"
]
Enter fullscreen mode Exit fullscreen mode

他让我按字母顺序排列。

我试过:

arr.sort((a, b) => {
  return a < b;
});
Enter fullscreen mode Exit fullscreen mode

他说它对数字有效(实际上不行),但对字符串无效。

然后我尝试

arr.sort((a, b) => {
  return a.charAt(0) < b.charAt(0);
});
Enter fullscreen mode Exit fullscreen mode

他说它只对第一个字符起作用(实际上不会),那么如何karachikolachi从...开始k进行排序?

我一片空白。

他说什么是ab

我说的a是当前元素(当前迭代索引处的元素)并且b是下一个元素(当前迭代 + 1 索引处的元素)。

👉 但实际上,它是相反的。a是下一个元素,b是当前元素。

然后他问,排序是否会修改原始数组或返回一个新数组。

老实说,大多数时候我都在使用.map()、、和。所以我知道这些方法的行为.filter()但我不记得上次使用是什么时候.some().every().sort()

我说的是,它不会修改原始数组,而是返回一个像这样的新数组.map()

👉 但事实恰恰相反。.sort()修改原始数组并返回对原始数组的引用,该数组现在已排序。

究竟如何.sort()运作?

Array.sort()接受可选的比较函数作为参数。

如果我们不提供任何比较函数,sort 方法会将所有non-undefined元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列。

“比较它们的 UTF-16 代码单元值序列”是什么意思?
简单来说,假设我们a在 JavaScript 中写入一个以 UTF-16 编码的字符。它的十进制值为97。因此,b它的值为98。即
A= 65
B= 66
C=67
等等。
我想你应该了解 ASCII 码表。

因此基本上字符串数组将自动按.sort()方法正确排序,而无需传递任何比较函数。

👉 如果是数字,行为是一样的;

const arr = [1, 30, 4, 21, 100000];
arr.sort();
console.log(arr);
// expected output: [1, 100000, 21, 30, 4]
Enter fullscreen mode Exit fullscreen mode

因为每个数字首先被转换成字符串,然后根据它们的 UTF-16 代码单元值进行比较。

但是如果我们提供一个比较函数来根据数字进行排序:

const arr = [1, 5, 3, 10, 7]
arr.sort((nextValue, prevValue) => {
  // if returnValue > 0, move nextValue after the prevValue
  // if returnValue < 0, move the nextValue before the prevValue
  // if returnValue === 0, keep the original order, do not move any value
  return nextValue - prevValue;
});
Enter fullscreen mode Exit fullscreen mode

因此,排序方法可以这样理解:

function compareFunction(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  a must be equal to b
  return 0;
}
Enter fullscreen mode Exit fullscreen mode

我希望这能让事情变得更清楚Array.sort()

这篇文章就到这里。请在下方评论区写下你的想法!

鏂囩珷鏉yu簮锛�https://dev.to/mhm13dev/arraysort-in-javascript-i-was-asked-about-this-in-an-interview-387
PREV
使用 Mocha 和 Chai 在 Express 中测试 Node JS 中的 REST API 😎 目录 什么是单元测试?!为什么要使用单元测试?谁使用单元测试?!结论
NEXT
如何使用 IronOCR 和 Tesseract 在 C# 中构建 OCR 应用程序 - 完整教程