JS進階(一)---關於js基本類型與引用類型(堆內存、棧內存的理解)

1、基本類型javascript

基本的數據類型有:Number,Boolean,String,undefined,null  5種基本類型
    基本類型的訪問是按值訪問,就是說你能夠操做保存在變量中的實際的值。
    特色:
    1.基本數據類型的值是不可變的:
       任何方法都沒法改變一個基本類型的值,好比一個字符串:
       
        var name = 'jozo';
        name.toUpperCase(); // 輸出 'JOZO'
        console.log(name); // 輸出  'jozo'
        
        會發現原始的name並未發生改變,而是調用了toUpperCase()方法後返回的是一個新的字符串。
    再來看個:
     
    
    var person = 'jozo';
    person.age = 22;
    person.method = function(){//...};
     
    console.log(person.age); // undefined
    console.log(person.method); // undefined
    
    經過上面代碼可知,咱們不能給基本類型添加屬性和方法,再次說明基本類型時不可變得;
複製代碼

2、基本類型的比較是值的比較html

只有在它們的值相等的時候它們才相等。
        但你可能會這樣:
        var a = 1;
        var b = true;
        console.log(a == b);//true
        
        你會說上面爲何會是相等呢,因 == 運算符比較兩個不一樣類型的變量時會進行一些類型轉換。像上面的比較先會把true轉換爲數字1進行比較,結果就是true;
複製代碼

3、基本類型的變量是存放在棧區的(棧區指內存裏的棧內存)java

假若有如下幾個基本類型的變量:
        var name = 'jozo';
        var city = 'guangzhou';
        var age = 22;
        棧區包括了 變量的標識符和變量的值。
        那麼它的存儲結構以下圖:
複製代碼

**4、引用類型**  
 javascript中除了上面的基本類型(number,string,boolean,null,undefined)以外就是引用類型了,也能夠說是就是對象了。對象是屬性和方法的集合。
複製代碼

也就是說引用類型能夠擁有屬性和方法,屬性又能夠包含基本類型和引用類型。來看看引用類型的一些特性: 1.引用類型的值是可變的 咱們可爲爲引用類型添加屬性和方法,也能夠刪除其屬性和方法,如:bash

var person = {};//建立個控對象 --引用類型
person.name = 'jozo';
person.age = 22;
person.sayName = function(){console.log(person.name);} 
person.sayName();// 'jozo'
 
delete person.name; //刪除person對象的name屬性
person.sayName(); // undefined
 
上面代碼說明引用類型能夠擁有屬性和方法,而且是能夠動態改變的。

2.引用類型的值是同時保存在棧內存和堆內存中的對象
引用類型的存儲須要內存的棧區和堆區(堆區是指內存裏的堆內存)共同完成,棧區內存保存變量標識符和指向堆內存中該對象的指針,
也能夠說是該對象在堆內存的地址。
假若有如下幾個對象:
        var person1 = {name:'jozo'};
        var person2 = {name:'xiaom'};
        var person3 = {name:'xiaoq'};
複製代碼

則這三個對象的在內存中保存的狀況以下圖:ui

3.引用類型的比較是引用的比較spa

var person1 = '{}';
     var person2 = '{}';
     console.log(person1 == person2); // true
複製代碼

上面講基本類型的比較的時候提到了當兩個比較值的類型相同的時候,至關因而用 === ,因此輸出是true了。再看看:指針

var person1 = {};
        var person2 = {};
        console.log(person1 == person2); // false
複製代碼

可能你已經看出破綻了,上面比較的是兩個字符串,而下面比較的是兩個對象,爲何長的如出一轍的對象就不相等了呢?code

別忘了,引用類型時按引用訪問的,換句話說就是比較兩個對象的堆內存中的地址是否相同,那很明顯,person1和person2在堆內存中地址是不一樣的:cdn

3.簡單賦值 基本類型賦值: 從一個變量向另外一個變量賦值基本類型時,會在該變量上建立一個新值,而後再把該值複製到爲新變量分配的位置上:htm

var a = 10;
var b = a;
 
a ++ ;
console.log(a); // 11
console.log(b); // 10
複製代碼

a中保存的值爲 10 ,當使用 a 來初始化 b 時,b 中保存的值也爲10,但b中的10與a中的是徹底獨立的,該值只是a中的值的一個副本,此後, 這兩個變量能夠參加任何操做而相互不受影響。

也就是說基本類型在賦值操做後,兩個變量是相互不受影響的。

4.對象引用賦值 當從一個變量向另外一個變量賦值引用類型的值時,一樣也會將存儲在變量中的對象的值複製一份放到爲新變量分配的空間中。前面講引用類型的時候提到,

保存在變量中的是對象在堆內存中的地址,因此,與簡單賦值不一樣,這個值的副本其實是一個指針,而這個指針指向存儲在堆內存的一個對象。那麼賦值操做後

兩個變量都保存了同一個對象地址,則這兩個變量指向了同一個對象。所以,改變其中任何一個變量,都會相互影響

var a = {}; // a保存了一個空對象的實例
var b = a;  // a和b都指向了這個空對象
 
a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'
 
b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22
 
console.log(a == b);// true
複製代碼

它們的關係以下圖:

來自 www.cnblogs.com/chenhuichao… 1、內存空間

Js的內存分爲棧內存和堆內存
JavaScript有自動垃圾收集機制,那麼這個自動垃圾收集機制的原理是什麼呢?
其實很簡單,就是找出那些再也不繼續使用的值,
而後釋放其佔用的內存。垃圾收集器會每隔固定的時間段就執行一次釋放操做。
複製代碼

 內存的生命週期:分配內存,使用內存,釋放內存                      

2、數據類型:

 基本數據類型:Number,Boolean,String,undefined,null 5種基本類型  基本數據類型存放於棧內存。包括變量標識符和變量的值。

  var name = 'jozo';
   name.toUpperCase(); // 輸出 'JOZO'
   console.log(name); // 輸出  'jozo'
複製代碼

引用數據類型: Object,Array

能夠爲引用類型添加屬性和方法,也能夠刪除其屬性和方法(delete person.name)。 對象是屬性和方法的集合。 也就是說引用類型能夠擁有屬性和方法,屬性又能夠包含基本類型和引用類型。來看看引用類型的一些特性:

相關文章
相關標籤/搜索