为什么在这种情况下排序会修改原始

Why is sorting modifing the original in this case?

本文关键字:修改 原始 排序 这种情况下 为什么      更新时间:2023-09-26

我在更改原始数组时遇到了一个问题,奇怪的是添加arr.join("...").split("...")似乎可以防止这种情况:

一点背景:

  • 我的脚本创建并向array添加内容
  • 该数组初始化为空,与arr=[]类似
  • 通过arr[index] = "..."添加的东西
  • 那么我想要一份arr的副本,但要排序
  • 当我进行排序时,原始arr被修改

以下是正在发生的事情的简化版本:

var arr=[], sorted;
arr[0] = "hello";
arr[1] = "world";
//buggy, the original is sorted
//sorted = arr.sort(function(a,b){return (a.length-b.length);});
sorted = arr.join("improbableCollision").split("improbableCollision").sort(function(a,b){return (a.length-b.length);});
  • 为什么添加.join("*").split("*")可以解决问题
  • 问题出在哪里
  • 有没有更优雅的方法来解决这个问题

对于完整的脚本,请检查这个jsFiddle

要在不进行所有连接和拆分的情况下进行排序,请使用slice或concat:复制数组

var sort=arr.slice(0).sort()

这之所以有效,是因为join()然后split()操作会生成原始数组的副本。