1. 程式人生 > >第183天:引用類型和值類型

第183天:引用類型和值類型

內存 span 屬於 func 進行 修改 引用 OS turn

一、內存分配

1、數值型內存分配

 1 <script>
 2     var num1; //這個時候不進行內存分配
 3     var num3=9;//分配內存
 4     var num4=num3;//會不會分配
 5 
 6      //  這裏到底分配還是不分配內存??
 7      // 答案 --分配內存 彼此擁有獨立的內存空間,互不影響
 8     console.log(num3);
 9     console.log(num4);
10 
11     num3=3333333;
12     num4=4444444;
13     console.log(num3);
14 console.log(num4); //當更改數據,值不一樣的本質是這裏分配兩個空間獨立存儲 15 16 17 </script>

2、字符串內存分配

 1 <script>
 2     //字符串
 3     var str1; //這個時候不進行內存分配
 4     var str2 = ‘樂樂‘; //分配內存
 5     var str3=str2; //問題,這裏str3 會不會分配內存??
 6     
 7     //答案:會
 8     console.log(str1);
 9     console.log(str2);
10     console.log(str3);
11 console.log(str2===str3); //比較的是指針指向的內存空間中存儲的值 12 13 str2 =‘lalala222222222‘; 14 str3 =‘lalala333333333‘; 15 console.log(str2);//lalala222222222 16 console.log(str3);//lalala333333333 17 </script>

3、數組內存分配

 1 <script>
 2     //    數組 : 當定義一個新數組,
 3     // 內存會產生兩片區域,一個存儲變量,一個存儲數組 變量中保存的只是數組所在的地址
4 var arr1=[‘樂樂‘,‘淘淘‘];//分配內存 5 //引用類型其實是指向同一個地址,也就是操縱的其實是同一個位置 6 var arr2=arr1; //問題:這裏arr2會不會分配內存 7 console.log(arr1[0]);//樂樂 8 console.log(arr2[0]); //樂樂 一樣 9 10 11 //修改數組1 12 arr2[0]=‘水滸傳 西遊記 三國演義 紅樓夢‘; 13 console.log(arr1[0]);//水滸傳 西遊記 三國演義 紅樓夢 14 console.log(arr2[0]);//水滸傳 西遊記 三國演義 紅樓夢 15 16 //一樣 說明這裏不分配內存,其實arr2變量中存的是地址,指向arr1內存 17 18 </script>

4、函數內存分配

 1 <script>
 2 
 3 //    系統都會在內存中生成兩個區域:一個存儲變量,一個用來存儲函數
 4 //    而變量中存放的只是函數空間所在的地址(指針)
 5 //    由於函數是對象,因此函數名實際上也是一個指向函數對象的指針,不會與某個函數綁定。
 6 //由於函數名僅僅是指向函數的指針,
 7 //因此函數名與包含對象指針的其他變量沒有什麽不同。
 8 //換句話說,一個函數可能會有多個名字,例如:
 9 function sum(num1,num2)
10     {
11         return num1 + num2;
12     }
13 console.log(sum(10,10)); //20
14 
15 var anotherSum = sum;
16 
17  //內存是如何分配的? 這裏不會在內存生成新的空間,存儲函數,而是生成一個變量,變量中保存的是同一個地址
18 sum = null;//這裏只是將sum變量中原來保存的是函數地址,然後賦值成null,這樣做並不會影響到函數對象對應的內存空間
19 console.log(anotherSum(10,10)); //20
20 console.log(sum(10,10)); //20
21     
22 </script>

二、引用類型和值類型總結

 1 <script>
 2     function show(x) {
 3         console.log(typeof(x));    // undefined 值類型
 4         console.log(typeof(10));   // number 值類型
 5         console.log(typeof(‘abc‘)); // string 值類型
 6         console.log(typeof(true));  // boolean 值類型
 7         console.log(typeof(function () { })); //function 函數 引用類型
 8         console.log(typeof([1, ‘a‘, true]));  //object 數組  引用類型
 9         console.log(typeof ({ a: 10, b: 20 }));  //object 或者json  引用類型
10         console.log(typeof (null));  //object   null  引用類型
11         console.log(typeof (new Number(10)));  //object  內置對象 引用類型
12     }
13     show();
14 //    其中上面的四種(undefined, number, string, boolean)屬於值類型,不是對象。
15 //    函數、數組、對象、null、new Number(10)都是對象。他們都是引用類型。
16 
17     var test ={name:‘lele‘};
18     var test2=  test;
19     console.log(test === test2);//true
20     test.name=‘lala‘;
21     console.log(test2.name);//lala
22 
23 </script>

第183天:引用類型和值類型