日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

一个 js 中值传递和引用传递的坑。

發布時間:2023/12/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个 js 中值传递和引用传递的坑。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

今天在調試代碼時遇到一個問題,剛開始想不明白,然后分析了一下后,才知道其中的問題,這也是一個基礎的問題,(所以基礎是很重要的)

代碼如下:

var a = 3; a = a * 2; console.log(a); // a = 6var b = 1, c =2, d = 3; var arr1 = [b,c,d]; arr1.forEach((item)=>{item = item * 2; }); console.log(arr1); //arr1 = [1,2,3];var arr2 = [{a:1},{a:2},{a:3}]; arr2.forEach((item)=>{item.a = item.a*2; }); console.log(arr2); //arr2 = [{a:2},{a:4},{a:6}]

如果你能不假思索的得出上面的答案,我相信你對這方面的知識已經很了解了,所以可以不用繼續往下看了,如果你像我今天該開始一樣,覺得有點疑惑的話,那么這篇文文章就很適合你。

  • 首先我們應該知道的是,在 javascript 中,基本數據類型是通過值傳遞的。

  • 比如:

    var a=1,b;b = a;// 這時 a 和 b 的值都為 1a = 2;//這時 a 的值 為 2,b 的值還是為 1 ,

    所以當 b = a, a = 2;a直接賦給b的值 是1,所以 b 就等于 1,而 a 的變化改變不了 b 的值

  • 在 js 中復雜數據類型是通過 引用傳遞的

  • 比如:

    var v1 = { a:1 }; var v2 = v1; //v2 = { a:1 } v1.a = 2; console.log(v2.a); // v2.a = 2;

    了解了以上的一些基礎知識后,就不難理解最開始的代碼輸出結果了。

    1.var a = 3;a = a * 2;console.log(a); // a = 62. var b = 1, c =2, d = 3;var arr1 = [b,c,d];arr1.forEach((item)=>{item = item * 2;});console.log(arr1); //arr1 = [1,2,3];3. var arr2 = [{a:1},{a:2},{a:3}];arr2.forEach((item)=>{item.a = item.a*2;});console.log(arr2); //arr2 = [{a:2},{a:4},{a:6}]

    第一段代碼當然好理解,就是簡單的值傳遞而已,然而第二段代碼呢?我剛開始有點困惑的是,既然也是值傳遞,那為什么它的值沒有變化還是原先的值,注意:這里我忽略了重要的一點,所以導致我不明白,那就是在這個 forEach 的遍歷中,還存在一個賦值的過程,就是這個過程導致 arr1 的值沒有改變,在每次循環中 arr1中的值都會賦給 item, 就是 item = b, item = c,item = d,所以后面對item 的改變就與 b,v,d 沒有關系了。
    所以那么 第三段也就很好理解了,他也與第二段代碼一樣,每次回存在一個賦值,但是注意的是 arr2 中存儲的是對象,就是 item = { a:1 } ...,這樣 item 仍然指向 arr2 中對象,所以這時對 item 的修改就可以通過 arr2 來反應出來。

    雖然這只是自己的粗心造成的,但仍然是自己的基礎不扎實而導致的,所以想要成為好的程序員,基礎是非常重要的。希望大家都能注重基礎的知識,為自己學習高級東西而打下堅實的基礎。

    總結

    以上是生活随笔為你收集整理的一个 js 中值传递和引用传递的坑。的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。