1.JavaScript的變數類型
JavaScript的變數分為基本類型和參考型別.基礎資料型別 (Elementary Data Type)是直接存在棧空間的簡單資料區段,這種類型直接將值儲存在記憶體的某個位置.引用資料類型儲存的是指向實際儲存於堆記憶體中的對象的地址.
JavaScript中的基礎資料型別 (Elementary Data Type)共有五種:Number,Null,Undefined,Boolean和String.需要注意的是,js中的String是基礎資料型別 (Elementary Data Type).
對於基本類型變數的訪問,是按值訪問的,而對於引用變數的訪問是按引用訪問的.
2.動態屬性
對於引用資料類型的變數,可以對其添加屬性和方法,也可以刪除屬性和方法,例如:
1 var p = new Object();
2 p.name = "張三";
3 alert(p.name);//張三
但是對於基礎資料型別 (Elementary Data Type)來說,這樣是不允許的,如下:
1 var str = "張三";
2 str.age = 20;
3 alert(str.age);//undefined
3.複製變數值 對於基本類型的變數,從一個變數向另一個變數複製,實際上是將第一個變數儲存的值複製給另一個變數。因此,複製完成之後,對第一個變數進行修改,修改操作不會影響另一個變數的值。例如;
1 var num1 = 1;
2 var num2 = num1;
3 alert(num2);//1
4 num1 = 2;
5 alert(num2);//1
但是對於引用資料類型,將一個變數複製給另一個變數,實際上是儲存第一個變數所儲存的地址拷貝給另一個變數,換句話說,這兩個變數之後就指向同一塊記憶體空間。因此,接下來對第一個變數的操作也會影響第二個變數。例如:
1 var p1 = newObject();
2 p1.name = "張三";
3 p1.age = 20;
4 var p2 = p1;
5 alert(p2.age);//20
6 p1.age = 30;
7 alert(p2.age);//30
4.參數傳遞 JavaScript的參數傳遞全部是按值傳遞。也就是說,將函數外部的值複製給函數的參數。對於基本類型來說,和變數的複製是一樣的,對於引用資料類型,則如同引用資料類型的複製一樣。下面分別舉例說明:
1 function inc(num) {
2 num += 1;
3 }
4 var i = 10;
5 alert(i);//10
6 inc(i);
7 alert(i);//10 對於基本類型變數i,將其傳遞給函數inc,實際上是將其值10傳遞給函數inc的參數,在函數內部,對其內部的變數進程加1操作,因此不會影響i。再看下面的代碼:
1 function setName(obj) {
2 obj.name = "張三";
3 }
4 var person = newObject();
5 setName(person);
6 alert(person.name);//張三 將person傳遞給函數setName,於是將person所指向的堆記憶體位址傳遞給函數的參數,因此,參數指向的記憶體和person指向的記憶體是同一個地址。因此在函數內部修改該地址指向對象的內容也會反映到person上來。 5.檢測變數的類型 檢測基本類型,使用typeof運算子即可,例如:
1 var s = "張三";
2 var b = true;
3 var i = 20;
4 var u;
5 var n = null;
6 var o = new Object();
7 alert(typeof s);//string
8 alert(typeof b);//boolean
9 alert(typeof i); //number
10 alert(typeof u); //undefined
11 alert(typeof n); //object
12 alert(typeof o); //object
但是,在檢測引用資料類型方面,typeof並不給力,需要使用instanceof運算子:
1 alert(person instanceof Object);//person是不是Object類型的?
6.變數範圍
js的範圍主要有兩種:全域範圍和局部範圍。值得一提的是,在js中,沒有塊級作用於。例如:
1 for(var i = 0; i < 10; i++) {
2 //do sth
3 }
4 alert(i);//10 以上面的代碼為例,for語句塊不存在一個特別的範圍,因此在for迴圈之外,i依然可以被訪問到。同理,對於if-else語句也是這樣的。
1 if(true) {
2 color = "red";
3 }
4 alert(color);//red
但是還是有辦法臨時的增加一種新的範圍,主要體現在try-catch和with語句。
參考書:《JavaScript進階程式設計》