關於值引用的小總結

2021-10-01 19:50:28 字數 1226 閱讀 8554

原始值和引用值

在 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 ...