原始值和引用值
在 ecmascript 中,變數可以存在兩種型別的值,即原始值和引用值。
原始值儲存在棧(stack)中的簡單資料段,也就是說,它們的值直接儲存在變數訪問的位置。
引用值儲存在堆(heap)中的物件,也就是說,儲存在變數處的值是乙個指標(point),指向儲存物件的記憶體處。
為變數賦值時,ecmascript 的解釋程式必須判斷該值是原始型別,還是引用型別。要實現這一點,解釋程式則需嘗試判斷該值是否為 ecmascript 的原始型別之一,即 undefined、null、boolean、number 和 string 型。由於這些原始型別佔據的空間是固定的,所以可將他們儲存在較小的記憶體區域 - 棧中。這樣儲存便於迅速查尋變數的值。
在許多語言中,字串都被看作引用型別,而非原始型別,因為字串的長度是可變的。ecmascript 打破了這一傳統。
如果乙個值是引用型別的,那麼它的儲存空間將從堆中分配。由於引用值的大小會改變,所以不能把它放在棧中,否則會降低變數查尋的速度。相反,放在變數的棧空間中的值是該物件儲存在堆中的位址。位址的大小是固定的,所以把它儲存在棧中對變數效能無任何負面影響。如下圖所示:
下邊就陣列和物件舉兩個例子說明一下
物件的::::
var obj=
var obj2=obj;
var obj3= obj;
obj2.age = 24;
console.log(obj3.age) //24
思考乙個問題?
物件之間賦值 賦的是什麼???
直接存值和存值的位址有個很關鍵的區別,
直接存值的話,這個值只會有乙個引用,
但是存位址的話,同乙個值可能有多個引用,存的東西變了之後,所有有引用的地方就都變了。
上邊**可以用乙個圖來說明一下:
從圖中可以看出,被賦值的兩個物件obj2和obj3執行的是同乙個引用位址,所以修改任乙個變數,都會作用到所有變數。
陣列和物件的展現方法一樣,所以特別注意一點:
操作乙個陣列會影響原陣列,或者其他陣列的數值,所以不想改變陣列的時候,應該使用json.stringfy(json.parse(arr))
關於引用的總結
1.什麼是 引用 申明和使用 引用 要注意哪些問題?答 引用就是某個目標變數的 別名 alias 對應用的操作與對變數直接操作效果完全相同。申明乙個引用的時候,切記要對其進行初始化。引用宣告完畢後,相當於目標變數名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變數名的別名。宣告乙個引用...
關於C 值型別,引用型別,值傳遞,引用傳遞
說到引數傳遞,必須得弄清值型別和引用型別 為了容易表達,我暫且命名存放在堆中的內容為堆中物件,存放在棧上的內容為棧中物件。值型別存放在棧中,直接訪問。如果有 int a 0 int b a 就產生了兩個棧中物件。引用型別需要在堆中顯式分配,且不能直接訪問,需要在棧中分配乙個棧中物件 c 叫指標,c ...
Python引用傳值總結
python函式的引數傳值使用的是引用傳值,也就是說傳的是引數的記憶體位址值,因此在函式中改變引數的值,函式外也會改變。這裡需要注意的是如果傳的引數型別是不可改變的,如string型別 元組型別,函式內如需改變引數的值,則相當於重新新建了乙個物件。新增了乙個string型別的元素新增到末尾 def ...