1、在 javascript 中數據類型能夠分爲兩類:javascript
2、聲明變量時不一樣的內存分配java
3、不一樣的內存分配機制也帶來了不一樣的訪問機制函數
在javascript中是不容許直接訪問保存在「堆」內存中的對象的,因此在訪問一個對象時,首先獲得的是這個對象在堆內存中的地址,而後再按照這個地址去得到這個對象中的值,這就是傳說中的按引用訪問。而原始類型的值則是能夠直接訪問到的。性能
一、複製變量時的不一樣spa
2.參數傳遞的不一樣指針
首先咱們應該明確一點:ECMAScript中全部函數的參數都是按值來傳遞的。可是爲何涉及到原始類型與引用類型的值時仍然有區別呢,還不就是由於內存分配時的差異。 (這個複製變量時遵循的機制徹底同樣)code
因此,若是是按引用傳遞的話,是把第二格中的內容(也就是變量自己)整個傳遞進去(就不會有第四格的存在了)。但事實是變量把它裏面的值傳遞(複製)給了參數,讓這個參數也指向原對象。所以若是在函數內部給這個參數賦值另外一個對象時,這個參數就會更改它的值爲新對象的內存地址指向新的對象,但此時原來的變量仍然指向原來的對象,這時候他們是相互獨立的;但若是這個參數是改變對象內部的屬性的話,這個改變會體如今外部,由於他們共同指向的這個對象被修改了呀!來看下面這個例子吧:(傳說中的call by sharing)對象
var obj1 = { value:'花點時間1' }; var obj2 = { value:'花點時間2' }; function changeStuff(obj){ obj.value = '花點時間3'; obj = obj2; return obj.value; } var foo = changeStuff(obj1); console.log(foo);// '花點時間2' 參數obj指向了新的對象obj2 console.log(obj1.value);//'花點時間3',形參obj和對象obj1指向了共同的內存地址,obj改變後,堆(heap)內存中的對象改變,所以obj1的值也發生了改變。