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