JavaScript變數與範圍
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進階程式設計》 原文:http://www.cnblogs.com/wawlian/archive/2012/02/18/2357271.html1.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進階程式設計》 原文:http://www.cnblogs.com/wawlian/archive/2012/02/18/2357271.html