今天在調(diào)試代碼時(shí)遇到一個(gè)問題,剛開始想不明白,然后分析了一下后,才知道其中的問題,這也是一個(gè)基礎(chǔ)的問題,(所以基礎(chǔ)是很重要的)
代碼如下:
var a = 3; a = a * 2; console.log(a); // a = 6 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]; 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}]
如果你能不假思索的得出上面的答案,我相信你對(duì)這方面的知識(shí)已經(jīng)很了解了,所以可以不用繼續(xù)往下看了,如果你像我今天該開始一樣,覺得有點(diǎn)疑惑的話,那么這篇文文章就很適合你。
首先我們應(yīng)該知道的是,在 javascript 中,基本數(shù)據(jù)類型是通過值傳遞的。
比如:
var a=1,b; b = a;// 這時(shí) a 和 b 的值都為 1 a = 2;//這時(shí) a 的值 為 2,b 的值還是為 1 ,
所以當(dāng) b = a, a = 2;a直接賦給b的值 是1,所以 b 就等于 1,而 a 的變化改變不了 b 的值
在 js 中復(fù)雜數(shù)據(jù)類型是通過 引用傳遞的
比如:
var v1 = { a:1 }; var v2 = v1; //v2 = { a:1 } v1.a = 2; console.log(v2.a); // v2.a = 2;
了解了以上的一些基礎(chǔ)知識(shí)后,就不難理解最開始的代碼輸出結(jié)果了。
1. var a = 3; a = a * 2; console.log(a); // a = 6 2. 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}]
第一段代碼當(dāng)然好理解,就是簡(jiǎn)單的值傳遞而已,然而第二段代碼呢?我剛開始有點(diǎn)困惑的是,既然也是值傳遞,那為什么它的值沒有變化還是原先的值,注意:這里我忽略了重要的一點(diǎn),所以導(dǎo)致我不明白,那就是在這個(gè) forEach 的遍歷中,還存在一個(gè)賦值的過程,就是這個(gè)過程導(dǎo)致 arr1 的值沒有改變,在每次循環(huán)中 arr1中的值都會(huì)賦給 item, 就是 item = b, item = c,item = d,所以后面對(duì)item 的改變就與 b,v,d 沒有關(guān)系了。
所以那么 第三段也就很好理解了,他也與第二段代碼一樣,每次回存在一個(gè)賦值,但是注意的是 arr2 中存儲(chǔ)的是對(duì)象,就是 item = { a:1 } ...,這樣 item 仍然指向 arr2 中對(duì)象,所以這時(shí)對(duì) item 的修改就可以通過 arr2 來反應(yīng)出來。
雖然這只是自己的粗心造成的,但仍然是自己的基礎(chǔ)不扎實(shí)而導(dǎo)致的,所以想要成為好的程序員,基礎(chǔ)是非常重要的。希望大家都能注重基礎(chǔ)的知識(shí),為自己學(xué)習(xí)高級(jí)東西而打下堅(jiān)實(shí)的基礎(chǔ)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/81967.html
摘要:值傳遞的典型這是典型的值傳遞的例子,只是把它的值給了局部變量,因此他們的存儲(chǔ)是分開的,函數(shù)不會(huì)改變的值。看來的參數(shù)傳遞還是有點(diǎn)小復(fù)雜的。 預(yù)備知識(shí) 首先要明白基本類型和引用類型的區(qū)別: 基本類型: var num1=5; var num2=num1; 基本類型存儲(chǔ)圖 showImg(https://segmentfault.com/img/bVEB5w?w=214&h=325); 從...
摘要:對(duì)象值傳遞與引用傳遞數(shù)據(jù)類型與數(shù)據(jù)結(jié)構(gòu)我們需要先回憶一下。值傳遞與引用傳遞通過上述的理解要明白中值傳遞與引用傳遞就太簡(jiǎn)單了,下面的兩個(gè)超級(jí)簡(jiǎn)單的可以詮釋一切。 title: JS對(duì)象(2)值傳遞與引用傳遞 date: 2016-10-05 tags: JavaScript 0x00 數(shù)據(jù)類型與數(shù)據(jù)結(jié)構(gòu) 我們需要先回憶一下。 JavaScript 是一種弱類型或者說動(dòng)態(tài)語...
摘要:地址傳遞引用類型則是地址傳遞,將存放在棧內(nèi)存中的地址賦值給接收的變量。即對(duì)象的淺拷貝會(huì)對(duì)主對(duì)象進(jìn)行拷貝,但不會(huì)復(fù)制主對(duì)象里面的對(duì)象。 相關(guān)知識(shí)點(diǎn) 1.javascript變量包含兩種不同數(shù)據(jù)類型的值:基本類型和引用類型。 基本類型值指的是簡(jiǎn)單的數(shù)據(jù)段,包括es6里面新增的一共是有6種,具體如下:number、string、boolean、null、undefined、symbol。 引...
摘要:記錄今天處理了小時(shí)的,代碼如下我以為預(yù)期是結(jié)果卻是說明這是一個(gè)引用傳遞了。銘記前天,月號(hào),又遇到一個(gè)坑,原以為數(shù)組引用是一坑,暫時(shí)用這樣的方式解決了,可是當(dāng)引用內(nèi)好有引用時(shí)這樣的方式同意會(huì)遭遇坑,切記 記錄今天處理了2小時(shí)的BUG,代碼如下: var a ={ id:[1,2,3] } var d = a.id; d.push(4); console.dir(a); ...
摘要:之前很少使用這個(gè)標(biāo)簽,因?yàn)楦杏X到父子頁(yè)面之間傳遞數(shù)據(jù)不太方便。最近同事做的一組頁(yè)面中大量的使用了用來嵌入其他頁(yè)面,由于懶所以只好看看如何在的標(biāo)簽下傳遞數(shù)據(jù)。在父頁(yè)面中使用函數(shù)來向子頁(yè)面發(fā)送消息而在子頁(yè)面中添加這個(gè)來接受消息。 之前很少使用IFRAME這個(gè)標(biāo)簽,因?yàn)楦杏X到父子頁(yè)面之間傳遞數(shù)據(jù)不太方便。最近同事做的一組頁(yè)面中大量的使用了IFRAME用來嵌入其他頁(yè)面,由于懶,所以只好看看如何...
閱讀 3759·2021-11-25 09:43
閱讀 2191·2021-11-23 10:13
閱讀 823·2021-11-16 11:44
閱讀 2369·2019-08-29 17:24
閱讀 1384·2019-08-29 17:17
閱讀 3480·2019-08-29 11:30
閱讀 2584·2019-08-26 13:23
閱讀 2345·2019-08-26 12:10