一個 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}]

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

  1. 首先我們應該知道的是,在 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 的值

  1. 在 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 來反應出來。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457053.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457053.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457053.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux運維適合女生么,女生真的不適合做IT行業嗎?Linux運維適合女生學習嗎?

在很多人的腦海中都是女生不適合做IT,IT行業不適合女性。可能傳統的思想中,女生只適合做文職工作,比如說幼師、公務員、會計等,就因為這樣的思想也讓IT行業男女出現了失衡的情況,那么作為女生真的不適合做IT行業嗎?Li…

關于在用異步消息處理機制使用Message.Obtain()方法(而非New Message)獲得一個Message對象的好處

類概述 定義一個包含任意類型的描述數據對象,此對象可以發送給Handler。對象包含兩個額外的int字段和一個額外的對象字段,這樣可以使得在很多情況下不用做分配工作。 盡管Message的構造器是公開的,但是獲取Message對象的最好方法是調用Messag…

python編程中的if __name__ == 'main': 的作用和原理

大多數編排得好一點的腳本或者程序里面都有這段if __name__ main: ,雖然一直知道他的作用,但是一直比較模糊,收集資料詳細理解之后與打架分享。 1、這段代碼的功能 一個python的文件有兩種使用的方法,第一是直接作為腳本執行&…

vim 配置

vim包下載 https://github.com/spf13/spf13-vim 安裝教程 http://blog.csdn.net/u011729865/article/details/49210841 https://www.zhihu.com/question/20151659轉載于:https://www.cnblogs.com/aituming/p/6013279.html

自己簡單封裝的自己項目需要的http請求

2019獨角獸企業重金招聘Python工程師標準>>> package www.tydic.com.util;import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Http…

excel導入linux亂碼怎么解決方法,,請大家都來看下,Excel導入有亂碼?原因出在哪里?應該怎么解決?...

老師,感謝你再次的回答。我按照您的方法操作,轉換utf-8另外為CSV格式,然后這個CSV格式在Notepad 編輯器中打開后,沒有亂碼,μ 符號(希臘字符)正確顯示。我想導入文件已經準備完畢,當我導入的時候&#xff0…

Oracle 正則表達式

一. 正則表達式簡介: 正則表達式,就是以某種模式來匹配一類字符串。一旦概括了某類字符串,那么正則表達式即可用于針對字符串的各種相關操作。例如,判斷匹配性,進行字符串的重新組合等。正則表達式提供了字符串處理的快捷方式。…

python編程中的if __name__ == 'main': 的作用和原理[2]

這個問題來自于知乎用戶的提問,當時看到這個問題,我只是做了下簡單的回答。后來我發現,對于很多人來說,更準確的說應該是大部分的 Python 初學者,對這個問題理解的不是很深刻。所以這里我來做下總結,并試圖…

Java基礎中按值傳遞和引用傳遞詳解

下面是我在網上看到的一個帖子,解釋的感覺挺全面,就轉過來,以供以后學習參考: 1:按值傳遞是什么 指的是在方法調用時,傳遞的參數是按值的拷貝傳遞。示例如下: [java] view plaincopy public cla…

【Foreign】采蘑菇 [點分治]

采蘑菇 Time Limit: 20 Sec Memory Limit: 256 MBDescription Input Output Sample Input 51 2 3 2 31 21 32 42 5Sample Output 10912911HINT Main idea 詢問從以每個點為起始點時,各條路徑上的顏色種類的和。 Solution 我們看到題目,立馬想到了O(n^2)…

c語言迷宮游戲怎么存放坐標,求解迷宮問題(c語言,很詳細哦

《求解迷宮問題(c語言,很詳細哦》由會員分享,可在線閱讀,更多相關《求解迷宮問題(c語言,很詳細哦(5頁珍藏版)》請在人人文庫網上搜索。1、求迷宮問題就是求出從入口到出口的路徑。在求解時 , 通常用的是 “窮舉求解”的方法 ,即從入口出發 ,順某一方向向…

模塊概述

概述 目前代碼比較少,寫在一個文件中還體現不出什么缺點,但是隨著代碼量越來越多, 代碼就越來越難以維護 為了解決難以維護的問題,我們把很多相似功能的函數分組,分別放到不同的文件中取。這樣每個文件所包含的內容相…

【MySQL】PREPARE 的應用

簡單的用set或者declare語句定義變量,然后直接作為sql的表名是不行的,mysql會把變量名當作表名。在其他的sql數據庫中也是如此,mssql的解決方法是將整條sql語句作為變量,其中穿插變量作為表名,然后用sp_executesql調用…

簡歷要求中“ 扎實的JAVA基礎”的學習方法

最近在頭條看到一篇關于Java基礎學習的文章,感覺寫的很不錯,分享一下,希望對大家有幫助 什么東西算作Java基礎?學到什么程度才算扎實? 這些問題的答案,LZ已經用文言文告訴你了,咳咳,…

C++11 tuple的使用

多少分轉載于:https://www.cnblogs.com/DswCnblog/p/6524832.html

c語言程序設計貪吃蛇需求分析,C語言編程新手入門基礎進階學習!貪吃蛇小游戲演示和說明...

C語言是面向過程的,而C++是面向對象的設計貪吃蛇游戲的主要目的是讓大家夯實C語言基礎,訓練編程思維,培養解決問題的思路,領略多姿多彩的C語言。游戲開始后,會在中間位置出現一條只有三個節點的…

解決bash: mysql: command not found 的方法【linux mysql命令 】

linux下,在mysql正常運行的情況下,輸入mysql提示: mysql command not found 遇上-bash: mysql: command not found的情況別著急,這個是因為/usr/local/bin目錄下缺失mysql導致,只需要以下方法即可以解決: …

堆和棧的區別(經典干貨)

一、預備知識—程序的內存分配 一個由C/C編譯的程序占用的內存分為以下幾個部分 1、棧區(stack)— 由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值等。其 操作方式類似于 數據結構 中的棧。 2、堆區(he…

Strus2中關于ValueStack詳解

什么是ValueStack 它是一個接口com.opensymphony.xwork2.util.ValueStack。我們使用它是將其做為一個容器,用于攜帶action數據到頁面。在頁面上通過ognl表達式獲取數據。 valueStack主要是將action數據攜帶到頁面上,通過ognl獲取數據 1.ValueStack有一個…

Airbnb React/JSX 編碼規范

Airbnb React/JSX 編碼規范算是最合理的React/JSX編碼規范之一了內容目錄基本規范Class vs React.createClass vs stateless命名聲明模塊代碼對齊單引號還是雙引號空格屬性Refs引用括號標簽函數/方法模塊生命周期isMountedBasic Rules 基本規范每個文件只寫一個模塊.但是多個無…