基本型別和引用型別的值
ecmascript變數可能包含兩種不同的資料型別的值:基本型別值和引用型別值。基本型別值指的是那些儲存在棧記憶體中的簡單資料段,即這種值完全儲存在記憶體中的乙個位置。而引用型別值則是指那些儲存在堆記憶體中的物件,意思是變數中儲存的實際上只是乙個指標,這個指標指向記憶體中的另乙個位置,該位置儲存物件。
將乙個值賦給變數時,解析器必須確定這個值是基本型別值,還是引用型別值。基本型別值有以下幾種:undefined、
null
、boolean
、number
和string
。這些型別在記憶體中分別占有固定大小的空間,他們的值儲存在棧空間,我們通過按值來訪問的。
ps:在某些語言中,字串以物件的形式來表示,因此被認為是引用型別。
ecmascript
放棄這一傳統。
如果賦值的是引用型別的值,則必須在堆記憶體中為這個值分配空間。由於這種值的大小不固定,因此不能把它們儲存到棧記憶體中。但記憶體位址大小的固定的,因此可以將記憶體位址儲存在棧記憶體中。這樣,當查詢引用型別的變數時,先從棧中讀取記憶體位址,然後再通過位址找到堆中的值。對於這種,我們把它叫做按引用訪問。
//基本型別和引用型別的變數賦值,總之複製的是棧記憶體裡的值
var box="haha";
var box2=box;
box="hehe";
alert(box);
//haha
alert(box2); //
hehe
var box=
var box2 =box;
box.name="hehe";
alert(box.name);
//hehe
alert(box2.name); //
hehe
傳參
//傳參,所有函式的引數都是按值傳遞的,沒有按引用傳遞
function
box(num)
var num = 50;
alert(box(num));
//60
alert(num); //
50//
這裡傳遞乙個引用型別的引數,但不是按引用傳遞,z兩者不一樣
function
box(obj)
var obj = new
object();
box(obj);
alert(
typeof obj.name); //
haha
//資料型別檢測
//typeof
//instanceof
var box = [1,2,3];
alert(box
instanceof array); //
是否是陣列
var box2 ={};
alert(box2
instanceof object); //
是否是物件
var box3 = /g/;
alert(box3
instanceof regexp); //
是否是正規表示式
var box4 = new string('lee');
alert(box4
instanceof string); //
是否是字串物件
另外注意一下幾點:
//沒有塊級作用域
if(true
)alert(window.box);
//在函式裡,加var就是區域性,不加就是全域性,建議初始化時一定加var
//向上搜尋作用域鏈
var box = "red";
function
get()
alert(get());
C語言,變數與記憶體
符號位 最高位為符號位,正數該位為0,負數該位為1 任何數值在記憶體中都是以補碼的形式儲存的。1 10的二進位制形式 1000 0000 0000 0000 0000 0000 0000 1010 原 2 除符號位取反 1111 1111 1111 1111 1111 1111 1111 0101 ...
C語言基礎 變數與記憶體
在函式定義的變數都是區域性變數,區域性變數是存放在棧中的 1 變數的儲存細節 1 區域性變數是存在棧中,先分配位元組位址大的然後分配位元組位址小的,所有先定義的變數的位址大,後定義變數位址小 2 變數的位址是所占用儲存空間中,位元組位址最小的那個位址編號 2 字元 char c a 1 查ascii...
C語言變數型別與記憶體
摘錄 c語言有豐富的資料型別和運算子,因此計算能力非常強大,計算過程中使用的值一般用變數來儲存。變數也是有分型別的,不同型別的變數有不同的儲存型別 不同的生命週期 不同的作用域,c語言也提供了一些關鍵字來設定變數的屬性 比如設定儲存型別 生命週期 c語言根據變數作用域的不同,將變數分為區域性變數和全...