【JavaScript】这是哪出问题了?作用域的问题?

function myFn(arr) {
  const sortedArray = [];
  while (Math.max(...arr) !== 0) {
    const maxTemp = Math.max(...arr);
    const indexTemp = arr.indexOf(maxTemp);
    sortedArray.unshift({
      No: indexTemp,
      counts: maxTemp
    });
    arr[indexTemp] = 0;
  }
  return sortedArray;
}
let temp;
const myobj = {
  f1: Array(3).fill(0),
  f2: Array(3).fill(0)
}
myobj.f1 = [1, 2, 3];
myobj.f2 = [6,23,35];
temp = myobj.f1;
myobj.f1sorted = myFn(temp);
temp = myobj.f2;
myobj.f2sorted = myFn(temp);
console.log(myobj);

为啥myFn函数会改变myobj中f1和f2的值啊?

f1和f2是数组为对象,传递进去后是地址引用,非值引用,在函数内的修改也会同时修改外部的f1和f2的值。不想改变原值,可以 JSON.parse(JSON.stringify(temp)) 传一个新数组进去


    temp = myobj.f1;
    myobj.f1sorted = myFn(JSON.parse(JSON.stringify(temp)));//////
    temp = myobj.f2;
    myobj.f2sorted = myFn(JSON.parse(JSON.stringify(temp)));////
    console.log(myobj);

引用数据类型的通病,函数开始时,深拷贝以下就行了 {} === {} 为false

myobj.f1 以及 myobj.f2 中保存的是指向数组首部的地址
temp = myobj.f1 是把指向数组的地址赋值给了temp
使用temp作为参数调用myFn函数当然会改变 myobj中f1和f2 的值了。
你传的是地址不是数值。

js中变量拷贝 引用数据类型,都会这样。 直接赋值就是浅拷贝,只是引用地址赋值给它。 所以会出现这种情况。 使用深拷贝,就可以了。json.string拷贝或者递归循环实现。

temp = myobj.f1;直接赋值属于深拷贝,temp = myobj.f1.concat();就不会了