js數據類型

js中有六種數據類型,包括五種基本數據類型(Number,String,Boolean,Undefined,Null),和一種複雜數據類型(Object)。javascript

引用類型有:Object,Array,Function、Data等html

ES6增長新類型:Symbol,使用參考:https://www.cnblogs.com/diligenceday/p/5462733.htmljava

基本數據類型是按值訪問的,由於能夠直接操做保存在變量中的實際值函數

var a = 10;

var b = a;

b = 20;

console.log(a); // 10

上面,b獲取的是a值的一份拷貝,雖然,兩個變量的值相等,可是兩個變量保存了兩個不一樣的基本數據類型值。性能

b只是保存了a複製的一個副本。因此,b的改變,對a沒有影響。spa

javascript的引用數據類型是保存在堆內存中的對象。指針

與其餘語言的不一樣是,你不能夠直接訪問堆內存空間中的位置和操做堆內存空間。只能操做對象在棧內存中的引用地址。code

var obj1 = new Object();

var obj2 = obj1;

obj2.name = "我有名字了";

console.log(obj1.name); // 我有名字了

說明這兩個引用數據類型指向了同一個堆內存對象。obj1賦值給obj2,實際上這個堆內存對象在棧內存的引用地址複製了一份給了obj2,可是實際上他們共同指向了同一個堆內存對象。實際上改變的是堆內存對象。htm

下面咱們來演示這個引用數據類型賦值過程:對象

總結區別

a 聲明變量時不一樣的內存分配: 

  1)原始值:存儲在棧(stack)中的簡單數據段,也就是說,它們的值直接存儲在變量訪問的位置

    這是由於這些原始類型佔據的空間是固定的,因此可將他們存儲在較小的內存區域 – 棧中。這樣存儲便於迅速查尋變量的值。

  2)引用值:存儲在堆(heap)中的對象,也就是說,存儲在變量處的值是一個指針(point),指向存儲對象的內存地址。

     這是由於:引用值的大小會改變,因此不能把它放在棧中,不然會下降變量查尋的速度。相反,放在變量的棧空間中的值是該對象存儲在堆中的地址。

     地址的大小是固定的,因此把它存儲在棧中對變量性能無任何負面影響。

b 不一樣的內存分配機制也帶來了不一樣的訪問機制

  1)在javascript中是不容許直接訪問保存在堆內存中的對象的,因此在訪問一個對象時,

    首先獲得的是這個對象在堆內存中的地址,而後再按照這個地址去得到這個對象中的值,這就是傳說中的按引用訪問

  2)而原始類型的值則是能夠直接訪問到的。

c 複製變量時的不一樣

  1)原始值:在將一個保存着原始值的變量複製給另外一個變量時,會將原始值的副本賦值給新變量,此後這兩個變量是徹底獨立的,他們只是擁有相同的value而已。

  2)引用值:在將一個保存着對象內存地址的變量複製給另外一個變量時,會把這個內存地址賦值給新變量,也就是說這兩個變量都指向了堆內存中的同一個對象,他們中任何一個做出的改變都會反映在另外一個身上。

  (這裏要理解的一點就是,複製對象時並不會在堆內存中新生成一個如出一轍的對象,只是多了一個保存指向這個對象指針的變量罷了)。多了一個指針

d 參數傳遞的不一樣(把實參複製給形參的過程

  首先咱們應該明確一點:ECMAScript中全部函數的參數都是按值來傳遞的。

  可是爲何涉及到原始類型與引用類型的值時仍然有區別呢?還不就是由於內存分配時的差異。  

  1)原始值:只是把變量裏的值傳遞給參數,以後參數和這個變量互不影響。

  2)引用值:對象變量它裏面的值是這個對象在堆內存中的內存地址,這一點你要時刻銘記在心!

    所以它傳遞的值也就是這個內存地址,這也就是爲何函數內部對這個參數的修改會體如今外部的緣由了,由於它們都指向同一個對象。

相關文章
相關標籤/搜索