我试图理解 JavaScript 中
.toSorted()
和 .sort()
方法之间的区别。
根据我的研究和理解,到目前为止我所知道的是:
.sort():
.sort()
方法对数组进行就地排序并返回对同一数组的引用,这意味着原始数组已发生变化。它接受可选的比较函数来确定排序顺序。
示例:
const arr = [3, 1, 2];
arr.sort((a, b) => a - b);
console.log(arr); // output : [1, 2, 3]
.toSorted():
基于 MDN,
.toSorted()
方法返回数组的排序副本,保持原始数组不变。与 .sort()
一样,它可以采用可选的比较函数,但它不会改变原始数组。
示例:
const arr = [3, 1, 2];
const sortedArr = arr.toSorted((a, b) => a - b); //returns a new sorted array
console.log(arr); // output: [3, 1, 2] (original array is unchanged !)
console.log(sortedArr); // output: [1, 2, 3]
除了不变性之外,这两种方法还有其他显着差异吗?
除了这个根本区别之外,还有其他几个重要点需要考虑:
浏览器和平台支持: .sort()方法长期以来一直是 JavaScript 的一部分,几乎所有浏览器和 JavaScript 环境都支持。 .toSorted() 方法在 JavaScript 中相对较新,可能并非所有浏览器或平台都支持。因此,在旧版浏览器或 JavaScript 引擎中使用 .toSorted() 可能会导致缺乏支持。在为较旧或不经常更新的环境编写代码时,使用 .toSorted() 可能存在风险。
性能: .sort() 通常更节省内存,因为它对数组进行就地排序。它仅对一个数组进行操作,并且不会创建原始数组的新副本。 另一方面,.toSorted() 创建并返回数组的排序副本,这可能会使用更多内存,因为它需要保持原始数组的不变性。这种差异可能会影响性能,尤其是在处理大型数组时。
不变性: .toSorted() 更符合函数式编程范式,强调不变性。不可变数据结构具有无副作用和更少意外错误等优点。因此,.toSorted()通常是一个更安全的选择,因为它不会改变原始数组并提高代码的可预测性。
链接: 由于 .sort() 会改变数组,因此在某些情况下可能会使方法链变得复杂,因为它会改变原始数组并可能导致意外结果。 .toSorted() 返回一个新数组,使其对于方法链接更加可靠。它可以轻松地与其他方法组合(如.map()、.filter()等),而不存在修改原始数组的风险。
副作用: .sort() 方法可能会引入意想不到的副作用,因为它会改变原始数组。如果代码的另一部分正在共享或引用该数组,则 .sort() 可能会导致该代码以不可预见的方式运行。 另一方面,.toSorted() 避免了这些副作用,因为它不会修改原始数组。
可用性和错误处理: .sort() 的可变性可以更容易地引入错误,因为它会就地更改原始数组,并且您可能会意外地将 .sort() 多次应用于数组而没有意识到。 .toSorted() 确保不变性,使您的代码更可靠且更易于维护。由于原始数据结构保持不变,因此可以更轻松地跟踪错误来源。
.sort(): 对原始数组进行排序并返回排序后的数组。它在性能方面可能更有效,但它通过改变原始数组引入了副作用。
.toSorted(): 返回数组的排序副本,而不修改原始数组。它更适合不变性、更安全、更符合函数式编程实践,但在内存使用方面可能会更昂贵。
如果您想保留原始数组而不修改内容,您只需使用
.toSorted()
方法即可。
但是,如果你想改变原始数组,你可以使用
.sort()
方法。
就这么简单,使用排序函数,您只需运行该函数即可修改原始引用。这是一个例子
const arr = [11, 15, 8];
arr.sort()
console.log(arr)
预期输出为
[8, 11, 15]
请记住,每个数组都是一个类(数据结构),因此存储其自身的方法和属性。因此,实际上,当使用排序时,您正在修改类本身内部的属性(数据)。
这是一个示例
.toSorted()
const arr = [11, 15, 8];
const newArr = arr.toSorted();
console.log(arr, newArr);
预期输出为
[11, 15, 8], [8, 11, 15]
您本质上是将排序后的数组存储在新数组(类)中,而不是修改旧数组的属性(数据)。这将是一个全新的对象。