在ecmascript中,變數可以存放兩種型別的值,即原始值和引用值
根據資料型別不同,有的變數儲存在棧中,有的儲存在堆中。具體區別如下:
原始變數及他們的值儲存在棧中,當把乙個原始變數傳遞給另乙個原始變數時,是把乙個棧房間的東西複製到另乙個棧房間,且這兩個原始變數互不影響。
引用值是把 引用變數的名稱儲存在棧中,但是把其實際物件儲存在堆中,且存在乙個指標由變數名指向儲存在堆中的實際物件,當把引用物件傳遞給另乙個變數時,複製的其實是指向實際物件的指標,此時 兩者指向的 是同乙個資料,若通過方法改變其中乙個變數的值,則訪問另乙個變數時,其值也會隨之加以改變;但若不是通過方法 而是通過 重新賦值 此時 相當於 重新開了乙個房間 該值的原指標改變 ,則另外乙個 值 不會隨他的改變而改變。
看示例:
用圖來表示 結果如下:var a="hello";
var b=a;
a="world";
alert(a);
//world
alert(b);//
hello
var arr=[1,3];
arr1=arr;
arr.push(5);
alert(arr)
//1,3,5
alert(arr1);//
1,3,5
arr=[7,8];
alert(arr);
//7,8
alert(arr1);//
1,3,5
原始變數的值互不影響,引用變數arr和arr1指向的為同一物件,所以當對arr通過方法改變其值時(堆房間裡的資料發生變化),訪問arr1的資料時就會訪問到改變後的物件
通過非方法來改變引用變數的值時,會為該引用變數重新建立乙個堆房間,此時指標也會發生變化:
總結:
number、stirng、boolean、null、underfined這些基本資料型別,他們的值直接儲存在棧中;
object、function、array、date、regexp這些引用型別,他們的引用變數儲存在棧中,通過指標指向儲存在堆中的實際物件
個人理解~~~~若有錯,請指出o(∩_∩)o~
更多專業前端知識,請上
【猿2048】www.mk2048.com
Js 中的原始值和引用值
最近開始注重自己的基礎知識,以前總是覺得自己什麼都要會一點,不精也沒關係,現在想想,感覺這種想法是錯誤的。一些最基本的基礎底層知識還是要很紮實的。原始值即一些代表原始資料型別的值,也叫基本資料型別,首先說一下js中有哪些原始值,number,string,boolean,null,undefined...
JS變數的原始值和引用值
原始值型別 undefined null boolean number 和 string 型 引用值型別 object,array 函式 儲存在堆 heap 中的物件 什麼是棧?由作業系統自動分配釋放 存放函式的引數值,區域性變數的值等,存放一些基礎型別。什麼是堆?是為動態分配預留的記憶體空間 你可...
ECMAScript 原始值和引用值
原始值 儲存在棧 stack 中的簡單資料,直接儲存在變數訪問的位置 引用值 儲存在堆 heap 中的物件,儲存在變數處的值是乙個指標,指向儲存物件的記憶體處 為變數賦值時,ecmascript的解釋程式必須判斷該值是原始型別還是引用型別 ecmascript把字串看作引用型別 引用型別的引用值大小...