JavaScript 中的 .toSorted() 和 .sort() 方法有什么区别?

问题描述 投票:0回答:2

我试图理解 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]

除了不变性之外,这两种方法还有其他显着差异吗?

javascript arrays sorting
2个回答
0
投票

除了这个根本区别之外,还有其他几个重要点需要考虑:

  1. 浏览器和平台支持: .sort()方法长期以来一直是 JavaScript 的一部分,几乎所有浏览器和 JavaScript 环境都支持。 .toSorted() 方法在 JavaScript 中相对较新,可能并非所有浏览器或平台都支持。因此,在旧版浏览器或 JavaScript 引擎中使用 .toSorted() 可能会导致缺乏支持。在为较旧或不经常更新的环境编写代码时,使用 .toSorted() 可能存在风险。

  2. 性能: .sort() 通常更节省内存,因为它对数组进行就地排序。它仅对一个数组进行操作,并且不会创建原始数组的新副本。 另一方面,.toSorted() 创建并返回数组的排序副本,这可能会使用更多内存,因为它需要保持原始数组的不变性。这种差异可能会影响性能,尤其是在处理大型数组时。

  3. 不变性: .toSorted() 更符合函数式编程范式,强调不变性。不可变数据结构具有无副作用和更少意外错误等优点。因此,.toSorted()通常是一个更安全的选择,因为它不会改变原始数组并提高代码的可预测性。

  4. 链接: 由于 .sort() 会改变数组,因此在某些情况下可能会使方法链变得复杂,因为它会改变原始数组并可能导致意外结果。 .toSorted() 返回一个新数组,使其对于方法链接更加可靠。它可以轻松地与其他方法组合(如.map()、.filter()等),而不存在修改原始数组的风险。

  5. 副作用: .sort() 方法可能会引入意想不到的副作用,因为它会改变原始数组。如果代码的另一部分正在共享或引用该数组,则 .sort() 可能会导致该代码以不可预见的方式运行。 另一方面,.toSorted() 避免了这些副作用,因为它不会修改原始数组。

  6. 可用性和错误处理: .sort() 的可变性可以更容易地引入错误,因为它会就地更改原始数组,并且您可能会意外地将 .sort() 多次应用于数组而没有意识到。 .toSorted() 确保不变性,使您的代码更可靠且更易于维护。由于原始数据结构保持不变,因此可以更轻松地跟踪错误来源。

.sort(): 对原始数组进行排序并返回排序后的数组。它在性能方面可能更有效,但它通过改变原始数组引入了副作用。

.toSorted(): 返回数组的排序副本,而不修改原始数组。它更适合不变性、更安全、更符合函数式编程实践,但在内存使用方面可能会更昂贵。


0
投票

如果您想保留原始数组而不修改内容,您只需使用

.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]

您本质上是将排序后的数组存储在新数组(类)中,而不是修改旧数组的属性(数据)。这将是一个全新的对象。

© www.soinside.com 2019 - 2024. All rights reserved.