使用非primitive value在Javascript中需要注意的地方
Fri, 06 Oct 2006 13:14:33 +0800ECMA-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物件變數。