Javascript 应对变量变化,但不应';T

Javascript 应对变量变化,但不应';T,javascript,json,reactjs,react-hooks,Javascript,Json,Reactjs,React Hooks,我有一个问题大约3个小时,我不明白为什么 下面的代码应该可以解释我的问题: import {useEffect} from 'react' function shuffle(tab) { console.table(tab) //shows initialdata var i, j, tmp; for (i = tab.length - 1; i > 0; i--) { j = Math.floor(Math.random() * (i + 1));

我有一个问题大约3个小时,我不明白为什么

下面的代码应该可以解释我的问题:

import {useEffect} from 'react'

function shuffle(tab) {
  console.table(tab) //shows initialdata
  var i, j, tmp;
  for (i = tab.length - 1; i > 0; i--) {
      j = Math.floor(Math.random() * (i + 1));
      tmp = tab[i];
      tab[i] = tab[j];
      tab[j] = tmp;
  }
  return tab;
}

function App() {

  useEffect(() => {
    const initaldata = [{a:1}, {a:2}, {a:3}, {a:5}]
    console.table(initaldata) //shows initialdata
    const finaldata = initaldata 
    console.table(shuffle(finaldata)) //shows initialdata shuffled
    console.table(initaldata) //shows initialdata shuffled,  why ?

  }, [])
  return null;
}
我在一个函数中尝试了多种解决方案,比如孤立的“shuffle(initialdata)”

事实上,shuffle函数updateall my变量使我的所有代码都无法正常工作

谢谢你,我希望你能找到解决办法。
(如果有一些错误,我很抱歉,我是法国人)

JavaScript通过引用传递对象,这就是原因。如果要避免这种情况,请使用贴图更改for循环

....
const toReturn = tab.map(item =>{
...
});

return toReturn

在运行shuffle=>

const finalData = JSON.parse(JSON.stringify(initialData));
console.table(initialData);
希望这能有所帮助
Javascript通过引用传递对象,包括数组。这意味着当你

const finaldata = initaldata 

finaldata和initaldata仍然指向内存中的同一数组。如果您不想修改原始数据,则需要在修改数组之前对数组进行浅拷贝或深拷贝。

shuffle
对原始数组进行变异。通过引用调用,在shuffle函数中深度克隆args,
tab=tab.slice()
这是低效的。不过,不需要深度克隆,
array.slice()
应该可以做到这一点。这没有多大帮助,因为洗牌算法会改变。费舍尔·耶茨的重点是在原地踏步。