使用非primitive value在Javascript中需要注意的地方

 Fri, 06 Oct 2006 13:14:33 +0800

ECMA-262定義了幾個Primitive Value的型別,使用primitive value型別與其他物件在處理程序上會稍有不同。

這幾個型別包括:Undefined, Null, Boolean, Number, or String

使用變數的時候,如果是其值是primary value的話,不會出現問題:

function change (b, c) {
b = c;
}
var a = 1;
change(a, 2);
alert(a);

變數a的值仍然是1

但是改成自訂物件時就會有些不同:

function a (init) {
this.init = init;
}
function change(c, d) {
c.init = d;
}
var b = new a(1);
change(b,2);
alert(b.init);

結果b.init的值會變成2。

即使是dom物件也有相同的效果:

function change(c,d) {
c.innerHTML=d;
}
var a = document.getElementById("test");
a.innerHTML = "before";
alert("pause");
change(a, "after");

可以看到,假設有一個<div id="test"></div>,之前的內容是before,之後就會被change函數改成after。

會發現這個問題,是因為自己定義了Point,然後把他當作參數傳給一些函數做處理,結果出現了一些非預期的結果。因為傳進去的變數被當作參數再assign給別的物件,結果這個物件改變時,也改變了當作參數傳進去的Point變數(這些變數是一些初始值,不能被改的)。解決的方式變成要在函數的參數中使用new Point來傳進去一個新的Point物件變數。