1. 程式人生 > 其它 >JS陣列賦值中的引用傳遞問題(以及leetcode輸出值和返回值不相同的問題)

JS陣列賦值中的引用傳遞問題(以及leetcode輸出值和返回值不相同的問題)

問題源於在做leetcode的189.旋轉陣列時,在vscode端執行結果正確,但是在leetcode上執行錯誤

console.log(result) //用控制檯輸出結果正確
return result  //但是最終函式的執行結果錯誤

  

分析原因

  1. leetcode題目最終判定的是原始nums的值,而不是返回值result
    解決方法:我直接返回result,但沒有改變nums,考慮最終將result賦值給nums進行更改。

  2. 賦值的方法一(傳遞引用):直接使用nums = result,將result賦值給nums
    陣列的儲存方式如圖所示,陣列中儲存的實際上是儲存地址值,然後通過地址指向實際的資料。


    陣列是引用型別,當直接使用等式進行賦值時,不是將result的值賦給nums,而是將nums作為result的引用
    let result = [1,2,3]
    let nums 
    = [] nums = result


    因為該方法更改的nums的引用地址值,原始nums地址的資料沒有發生變化。


    本以為這次結果應該對了,但是結果仍然錯誤。因為LeetCode判斷的是nums原始資料儲存地址指向的值,而不是nums陣列中儲存的地址指向的資料值。

  3. 賦值的方法二(傳遞值):用迴圈賦值對nums重新賦值

    for(let i = 0 ; i < nums.length ; i++){
        nums[i] = result[i]
        }

    該方法直接修改了nums的資料,最終通過了leetcode測試。


總結:陣列是引用型別,用a =b 給陣列a賦值時,向a傳遞的實際是b的引用,以後對a或b進行更改時,都會同時更改兩個陣列。

  為了避免這種狀況的發生,應該直接使用3中迴圈賦值的方法,更改a的資料值。
  此時a和b的值相等,但是a===b不成立,因為他們指向的地址空間不同。