很重要的一點是注意變量是否是在其所屬范圍的開始處聲明的有時這會導致意想不到的情況
tweak();
var aNumber = ;
function tweak() {
var newThing = ; // 顯式聲明 newThing 變量
// 本語句將未定義的變量賦給 newThing因為已有名為 aNumber 的局部變量
newThing = aNumber;
//下一條語句將值 賦給局部的 aNumberaNumber = ;
if (false) {
var aNumber; // 該語句永遠不會執行
aNumber = ; // 該語句永遠不會執行
} // 條件語句結束
} // 該函數定義結束
當 JScript 運行函數時首先查找所有的變量聲明
var someVariable;
並以未定義的初始值創建變量如果變量被聲明時有值
var someVariable = something;
那麼該變量仍以未定義的值初始化並且只有在運行了聲明行時才被聲明值取代假如曾經被聲明過
JScript 在運行代碼前處理變量聲明所以聲明是位於一個條件塊中還是其他某些結構中無關緊要JScript 找到所有的變量後立即運行函數中的代碼如果變量是在函數中顯式聲明的 ? 也就是說如果它出現於賦值表達式的左邊但沒有用 var 聲明 ? 那麼將把它創建為全局變量
復制傳遞和比較數據
在 JScript 中對數據的處理取決於該數據的類型
按值和按引用的比較
Numbers 和 Boolean 類型的值 (true 和 false) 是按值來復制傳遞和比較的當按值復制或傳遞時將在計算機內存中分配一塊空間並將原值復制到其中然後即使更改原來的值也不會影響所復制的值(反過來也一樣)因為這兩個值是獨立的實體
對象數組以及函數是按引用來復制傳遞和比較的 當按地址復制或傳遞時實際是創建一個指向原始項的指針然後就像拷貝一樣來使用該指針如果隨後更改原始項則將同時更改原始項和復制項(反過來也一樣)實際上只有一個實體復本並不是一個真正的復本而只是該數據的又一個引用
當按引用比較時要想比較成功兩個變量必須參照完全相同的實體例如兩個不同的 Array 對象即使包含相同的元素也將比較為不相等要想比較成功其中一個變量必須為另一個的參考要想檢查兩個數組是否包含了相同的元素比較 toString() 方法的結果
最後字符串是按引用復制和傳遞的但是是按值來比較的請注意假如有兩個 String 對象(用 new String(something) 創建的)按引用比較它們但是如果其中一個或者兩者都是字符串值的話按值比較它們
注意 鑒於 ASCII和 ANSI 字符集的構造方法按序列順序大寫字母位於小寫字母的前面例如 Zoo 小於 aardvark如果想執行不區分大小寫的匹配可以對兩個字符串調用 toUpperCase() 或 toLowerCase()
傳遞參數給函數
按值傳遞一個參數給函數就是制作該參數的一個獨立復本即一個只存在於該函數內的復本即使按引用傳遞對象和數組時如果直接在函數中用新值覆蓋原先的值在函數外並不反映新值只有在對象的屬性或者數組的元素改變時在函數外才可以看出
例如(使用 IE 對象模式)
// 本代碼段破壞(覆蓋)其參數所以
// 調用代碼中反映不出變化
function Clobber(param)
{
// 破壞參數在調用代碼中
// 看不到
param = new Object();
parammessage = This will not work;
}
// 本段代碼改變參數的屬性
// 在調用代碼中可看到屬性改變
function Update(param)
{
// 改變對象的屬性
// 可從調用代碼中看到改變
parammessage = I was changed;
}
// 創建一個對象並賦給一個屬性
var obj = new Object();
objmessage = This is the original;
// 調用 Clobber並輸出 objmessage注意它沒有發生變化
Clobber(obj);
windowalert(objmessage); // 仍然顯示 This is the original
// 調用 Update並輸出 objmessage注意它已經被改變了
Update(obj);
windowalert(objmessage); // 顯示 I was changed
檢驗數據
當按值進行檢驗時是比較兩個截然不同的項以查看它們是否相等通常該比較是逐字節進行的當按引用進行檢驗時是看這兩項是否是指向同一個原始項的指針如果是則比較結果是相等如果不是即使它們每個字節都包含完全一樣的值比較結果也為不相等
按引用復制和傳遞字符串能節約內存但是由於在字符串被創建後不能進行更改因此可以按值進行比較這樣可以檢查兩個字符串是否包含相同的內容即使它們是完全獨立產生的
[] []
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/20709.html