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不成立,因为他们指向的地址空间不同。

 

posted @ 2022-02-11 19:32  邵耿耿  阅读(387)  评论(0)    收藏  举报