4.1 基本類型與引用類型
- 基本類型值指的是簡單的數(shù)據(jù)段,而引用類型值指那些可能由多個值構(gòu)成的對象惠啄。
- 基本數(shù)據(jù)類型: Undefined 慎恒、 Null 、 Boolean 撵渡、 Number 和 String
- 基本類型按值訪問融柬,可以直接操作保存在變量中的實(shí)際值
- 引用類型按引用訪問,因?yàn)镴S不允許直接訪問內(nèi)存中的對象
4.1.1 動態(tài)屬性
var person = new Object();
person.name = "Nicholas";
alert(person.name); //"Nicholas"
//引用類型值可以動態(tài)地添加屬性趋距,以便將來使用
var name = "Nicholas";
name.age = 27;
alert(name.age); //undefined
//基本類型不能動態(tài)添加屬性
4.1.2 復(fù)制變量值
var num1 = 5;
var num2 = num1;
//num1與num2中的 5 是完全獨(dú)立的
var obj1 = new Object();
var obj2 = obj1;
obj1.name = "Nicholas";
alert(obj2.name); //"Nicholas"
//obj1與obj2 始終指向的是一個對象粒氧,復(fù)制的僅是對象地址(指針)
4.1.3 傳遞參數(shù)
- ECMAScript中的函數(shù)都是按值傳遞
- 變量傳到函數(shù)里會復(fù)制給一個局部變量(arguments對象中的一個元素),函數(shù)執(zhí)行結(jié)束立即后銷毀
function setName(obj) {
obj.name = "Nicholas"; //obj為外部person對象引用
obj = new Object(); //重寫的obj為局部變量节腐,執(zhí)行結(jié)束后銷毀
obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name); //"Nicholas"
4.1.4 檢測類型
//typeof 檢測基本類型很好外盯,檢測引用類型用處不大
alert(typeof "Nicholas"); //string
alert(typeof []); //object
alert(typeof {}); //object
//instanceof 根據(jù)原型鏈識別
'Nicholas' instanceof String //true
[] instanceof Object //true
[] instanceof Array //true
4.2 執(zhí)行環(huán)境及作用域
- 執(zhí)行環(huán)境(簡稱環(huán)境),執(zhí)行環(huán)境決定了變量和方法是否有權(quán)訪問其他數(shù)據(jù)翼雀,定義它們各自的行為
- 每個環(huán)境都有一個與之關(guān)聯(lián)的變量對象饱苟,環(huán)境中定義的變量和函數(shù)都保存在這對象中
- 全局執(zhí)行環(huán)境,即最外圍的環(huán)境狼渊,在wab瀏覽器中是window對象箱熬,瀏覽器、網(wǎng)頁關(guān)閉后銷毀
- 局部執(zhí)行環(huán)境,即每個函數(shù)自己的環(huán)境城须,當(dāng)函數(shù)執(zhí)行完畢后銷毀
- 當(dāng)代碼在環(huán)境中執(zhí)行時护锤,會創(chuàng)建一個作用域鏈。作用域鏈讓環(huán)境中有權(quán)訪問的屬性和方法能有序的訪問
- 作用域的前端酿傍,始終是當(dāng)前執(zhí)行環(huán)境的變量對象烙懦,如果是局部環(huán)境,則將活動對象作為變量對象
- 活動對象最開始只包含一個變量赤炒,arguments對象氯析,之后在函數(shù)中創(chuàng)建的變量和方法都在活動對象中
//全局環(huán)境 window
//作用域鏈:首位:全局環(huán)境的變量對象(屬性:color,changeColor)
var color = "blue";
//局部環(huán)境 changeColor
//作用域鏈:
//首位:局部環(huán)境的活動對象 (屬性:arguments)
//次位:全局環(huán)境的變量對象 (屬性:color莺褒,changeColor)
function changeColor(){
if (color === "blue"){
//首位中不存在color屬性掩缓,向次位中尋找
color = "red";
} else {
color = "blue";
}
}
changeColor();
alert("Color is now " + color); //'red'
4.2.1 延長作用域鏈
這兩個語句都會在作用域鏈的前端添加一個變量對象:
- try-catch 語句的 catch 塊;
- with 語句 (有兼容問題遵岩,不建議使用)
4.2.2 沒有塊級作用域
- if / for 語句都沒有塊作用域
- var 聲明的變量會自動被添加到最接近的環(huán)境中
- 如果初始化變量時沒有使用 var 聲明你辣,該變量會自動被添加到全局環(huán)境
- 讀取或?qū)懭胱兞繒r程序會從作用域鏈的前端開始,向上逐級查詢與給定名字匹配的標(biāo)識符
//if 語句沒有塊作用域
if (true) {
var color = "blue";
}
alert(color); //"blue"
//for 語句沒有塊作用域
for (var i=0; i < 10; i++){
doSomething(i);
}
alert(i); //10
//sum 沒有使用 var 聲明尘执,被添加到全局環(huán)境
function add(num1, num2) {
sum = num1 + num2;
return sum;
}
var result = add(10, 20); //30
alert(sum); //30
4.2 垃圾回收
略..