複製、傳遞和比較資料
JScript 複製、傳遞和比較資料的方式是根據資料的儲存方式而定,而儲存資料的方式是根據資料型別而定。 JScript 可以使用傳值方式或傳址方式來儲存資料。
傳值方式與傳址方式的比較
JScript 是以「傳值方式」來複製、傳遞和比較數字和布林值 (true 和 false)。 這項處理會在電腦記憶體中配置一個空間,然後將原始的值複製進去。 對來源的變更不會影響複本 (反之亦然),因為兩者是分離的實體。 如果兩個數字或兩個布林值有相同的值,則視為兩者相等。
JScript 則以「傳址方式」來複製、傳遞和比較物件、陣列和函式。 本處理基本上會建立原始項目的參考,然後將參考當做複本。 對來源的變更,會改變來源和複本 (反之亦然)。 真正的實體只有一個,複本只是資料的另一個參考。
如果要成功地以傳址方式來作比較,這兩個變數必須確實地參考完全相同的實體。 例如,即使兩個不同的 Array 物件包含相同的元素,但是比較起來永遠不相等。 為了讓比較成功,其中一個變數必須是另一個變數的參考。 若要查看兩個陣列是否有相同的元素,請比較 toString() 方法的結果。
最後,JScript 會以傳址方式來複製和傳遞字串。 根據字串是否為物件而決定比較字串的方式。 兩個 String 物件 (以 new String ("something") 建立) 是以傳址方式進行比較, 而如果其中的一個 (或兩個) 字串是常值或原始字串值,則以傳值方式來比較。 如需詳細資訊,請參閱 JScript 設定和相等。
注意事項 |
---|
ASCII 和 ANSI 字元集是依序將大寫字母置於小寫字母之前的方式建構而成。 例如經過比較之後,"Zoo" 會小於 "aardvark"。如果您想要執行不區分大小寫的比對,可以在兩個字串上呼叫 toUpperCase() 或 toLowerCase()。 |
函式參數
當 JScript 以傳值方式將參數傳遞給函式時,就是製作了只存在於函式內部之該參數的個別複本。 雖然物件和陣列是以傳址方式來傳遞,但如果您直接在函式中以新值來覆寫它們,則新值並不會反映到函式以外。 只有對物件屬性或陣列元素的變更才能在函式以外顯示。
例如,以下程式有兩個函式。 第一個函式會覆寫輸入參數,此參數能避免進一步變更參數而影響到原始輸入引數。 第二個函式會變更物件的屬性,而不用覆寫物件。
function clobber(param) {
// Overwrite the parameter; this will not be seen in the calling code
param = new Object();
param.message = "This will not work.";
}
function update(param) {
// Modify the property of the object; this will be seen in the calling code.
param.message = "I was changed.";
}
// Create an object, and give it a property.
var obj = new Object();
obj.message = "This is the original.";
// Call clobber, and print obj.message.
clobber(obj);
print(obj.message);
// Call update, and print obj.message.
update(obj);
print(obj.message);
本程式碼的輸出為:
This is the original.
I was changed.
資料比較
JScript 可以使用傳值方式或傳址方式來比較資料。 如果要用傳值方式來作測試,JScript 會比較兩個不同的項目,以便決定他們是否相等。 通常,這個比較是以逐位元組的基礎來執行的。 當用傳址方式來測試時,則會檢查這兩個項目是否參考相同的項目。 如果是的話,則它們會比較為相等。如果不是的話,即使它們逐一位元組都包含完全相同的值,比較結果仍是不相等。
根據字串是否為物件,決定字串使用傳值方式或傳址方式進行比較。 如果兩個字串都是 String 物件,就根據傳址方式來比較字串,否則用傳值方式來比較。 如果有兩個字串是分別建立,但擁有相同的內容,這樣可讓它們的比較結果為相同。 如果要比較兩個 String 物件的值,可以先利用 toString 或 valueOf 方法將物件轉換成非物件字串,然後比較兩者的結果字串。 如需詳細資訊,請參閱 JScript 設定和相等。