js的值傳遞和引用(地址)傳遞 首先總述一下:js的5種基本數據類型 number,string,null,undefined,boolean 在賦值傳遞時是值傳遞,js的引用數據類型(object,array,function)進行引用傳遞,其實底層都是對象。 廢話不多說,下麵直接上代碼 值傳遞例 ...
js的值傳遞和引用(地址)傳遞
首先總述一下:
js的5種基本數據類型 number,string,null,undefined,boolean 在賦值傳遞時是值傳遞,
js的引用數據類型(object,array,function)進行引用傳遞,其實底層都是對象。
廢話不多說,下麵直接上代碼
值傳遞例子:
1 var a = 10; 2 var b = a; 3 b = 5; 4 console.log('a:'+a,'b:'+b) // a:10 b:5
同樣的,如果你改變其中a的值,a的值變化,b不會改變。
基本數據類型的賦值傳遞,變數直接包含的是一個值,你可以理解這個賦值過程為把你電腦里的一個文件(假設本來在c盤)複製到了D盤,然後你就很清楚知道,它兩是完全不相干的兩個文件(複製但是沒修改前只是內容一樣)了,沒有關聯性的獨立文件,不會相互干擾。(不同地址路徑下相同的值)
引用傳遞例子如下:
1 var obj = {a:1,b:2,c:3}; 2 var objed = obj; 3 objed.a = 0; 4 console.log('obj:',obj,'objed:',objed) // obj: {a: 0, b: 2, c: 3} objed: {a: 0, b: 2, c: 3}
obj對象賦值給變數objed,需要理解的是,對象是以地址的形式存放在記憶體中的。還是用簡單易懂的話說吧,變數obj存放的不是a,b,c這三個值,而是它這個整體對象占用的一個空間(有些人用類似堆和棧的思路來對比理解),你每看到一個對象(非基本數據類型皆是對象),你看到的應該是一個空間,便於理解,可以自己取個名字“#001”(隨便叫什麼都行)。那麼變數obj就是一個叫“#001”的地址空間,這個空間裡面有a,b,c三個東西,且有它的值。objed變數被賦“值”是這個空間“#001”。所以obj和objed實質上都是叫“#001”的空間,不論你是修改obj里內容還是objed里的內容,實質上都是“#001”空間里的那個它。所以修改變數obj的內容和objed的內容都是同一個東西,obj和objed都是一樣的內容包含。同樣用使用電腦來理解,就是你將你的文件放到編輯器上修改創作,你會發現,你修理和鞭打的是你編輯器里的代碼,但是你磁碟里的文件同樣在挨打