變數與記憶體

2022-09-02 06:12:08 字數 1994 閱讀 7442

基本型別和引用型別的值

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語言根據變數作用域的不同,將變數分為區域性變數和全...