1. 程式人生 > >從JS的變量復制看JS的參數傳遞

從JS的變量復制看JS的參數傳遞

pan weight -- urn 一份 strong ava chan r+

變量的復制: 基本類型:從一個變量向另一變量復制基本類型的值,會在變量對象上創建一個新值,然後把該值復制到為新的變量分配的位置上
 1 console.log(" 基本類型:");
 2 var num1=1;
 3 var num2=num1; //此時num1=1,num2=1,這是兩個完全獨立的變量,互不影響,只是值相等而已
 4 
 5 console.log("   before copy --> num1:"+num1+" , num2:"+num2);
 6 //輸出 before copy --> num1:1 , num2:1
 7
8 num1="change"; // 改變 num1 的值 9 10 console.log(" after copy --> num1:"+num1+" , num2:"+num2); 11 //輸出 after copy --> num1:change , num2:1
解析:獨立變量 互不影響 引用類型:從一個變量向另一變量復制引用類型的值,會在變量對象上,創建一個新值,然後把該值復制到為新的變量分配的位置上,      不同的是,這個副本和原來的變量都是一個指針,指向堆內存中同一個對象
1 console.log(" 引用類型:");
2 var obj1=new Object(); 3 var obj2=obj1; // 此時 obj1 和 obj2 是兩個獨立的引用,只是指向同一個地方而已 4 5 obj1.name="Guang Zai";// 改變 name 的值 6 7 console.log(" obj2.name:"+obj2.name); 8 //輸出: obj2.name:Guang Zai
解析: 更改 obj1.name 的值,即更改 obj1 指向的那個地方的 name 屬性的值,obj2 也指向同一個地方,因此讀取 obj2 的 name 必然是更改後的結果

函數的參數傳遞: 在js中,所有函數的參數都是按照值傳遞的,也就是說:把函數外部的值復制給函數內部的參數, 就和把值從一個變量復制到另一個變量一樣,復制過程按照基本類型和引用類型對應的變量復制過程, 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 按值傳遞 基本類型:
 1 function changeString(str){
 2     str+=": add something in the function"
 3     return str;
 4 }        
 5 
 6 console.log(" 基本類型:");
 7 var str="str";
 8 var str_return=changeString(str);
 9 console.log("   str_return:"+str_return+" , str:"+str);
10 // 輸出:str_return:str: add something in the function , str:str

解析:基本類型按值傳遞,傳進去的參數與外面的變量互相獨立,互不影響

引用類型:

1 console.log(" 引用類型:");
2 function setName(obj){
3     obj.name="Guang Zai";
4     obj=new Object();
5     obj.name="guang";
6 }
7 var person=new Object();
8 setName(person);
9 console.log("   person.name:"+person.name);//輸出: "Guang Zai"
// 解析:函數外部創建一個對象person,然後調用setName函數傳遞參數 // 此時按照傳遞參數的過程,把person的值復制一份後傳遞給參數obj // 使得obj的引用與person指向同一個對象 /* other -----> {其他對象}
obj -----》 【對】 person -----》 【象】
*/ // 然後進入函數內部: // obj.name="Guang Zai"; person.name也等於"Guang Zai" 因為此時 obj 的引用與 person 指向同一個對象 // obj=new Object(); 此時obj指向另一個對象,person依然指向原來的對象 // 因此obj之後的修改對person無影響,所以函數外部person.name="Gaung Zai" // setName函數執行完成後,obj對象會被立即銷毀 // 拓展分割線:----------------------------------------------------------------------
// js中引用類型作為參數傳遞和java不一樣 // java中引用類型作為參數傳遞時,傳遞的是該對象的引用 // 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 傳遞的是引用 // 那上面的例子來說,參數傳遞後應該是下面這樣: /* other -----> {其他對象}
【對】 obj,person -----》 【象】 */ // 然後進入函數內部: // obj.name="Guang Zai"; person.name也等於"Guang Zai" // obj=new Object(); 此時obj指向另一個新的對象,person也指向那個新的對象 // 因為他們的引用是同意引用,因此對obj的修改就是對person的修改 // setName函數執行完成後,obj對象和person的name屬性都是 “guang”,而不是原來的 ”Guang Zai“

從JS的變量復制看JS的參數傳遞