地址:http://www.xiaoxiaozi.com/2010/03/05/1719/
當然看這之前我是很清晰知道基本數(shù)據(jù)類型傳值,引用數(shù)據(jù)類型傳引用。
剛看了個開頭就有點暈了,文章所說:
“在本文開頭,首先,十萬以及萬分肯定的說一句,JavaScript 函數(shù)傳遞參數(shù)時,是值傳遞。”
有興趣的朋友可以去看原文。 我看了之后就順手寫起了示例代碼:
(1) 典型傳值
function setName(name)
{
name = "test";
}
var person = new Object();
person.name = " hechangmin ";
setName(person.name);
alert(person.name); // hechangmin
{
name = "test";
}
var person = new Object();
person.name = " hechangmin ";
setName(person.name);
alert(person.name); // hechangmin
(2) 典型的傳引用
function setName(obj)
{
obj.name = "test";
}
var person = new Object();
person.name = " hechangmin ";
setName(person);
alert(person.name); // test
{
obj.name = "test";
}
var person = new Object();
person.name = " hechangmin ";
setName(person);
alert(person.name); // test
我想大家對輸出的結(jié)果都沒異議。這也是我記憶中的理解。
下面帶領(lǐng)大家看一些可能引起大家議論的示例:
var x = new Object();
x.name = "test";
function setName(obj)
{
obj = x;
alert(obj == x); // true 因為上一句進行了賦值操作
}
var person = new Object();
person.name = " hechangmin ";
setName(person);
alert(person.name); // hechangmin
alert(person == x); // false
x.name = "test";
function setName(obj)
{
obj = x;
alert(obj == x); // true 因為上一句進行了賦值操作
}
var person = new Object();
person.name = " hechangmin ";
setName(person);
alert(person.name); // hechangmin
alert(person == x); // false
傳進去的 person 肯定是 引用數(shù)據(jù)類型。(這點沒歧義)
進去后發(fā)現(xiàn) 給引用賦以新值 x 。函數(shù)內(nèi)部 alert(obj == x); 也輸出了 true
說明賦值是成功的。
而函數(shù)執(zhí)行完畢,發(fā)現(xiàn)值依然沒變。 就這個結(jié)果來看,說是傳值還真沒什么說不過去的。
但是我隨后在 http://www.aygfsteel.com/magicdoom/archive/2006/02/27/32555.html (建議有興趣的朋友可以看看)找到一篇講 javascript 傳值 傳引用的文章。
文章有說傳遞進去的引用型參數(shù),在內(nèi)部如果直接對引用參數(shù)賦值。 javascript 會自動生成一份copy ,而不去影響原有的引用。
===========
綜上所述 ,基本就都明白。文章寫到這里基本就接近尾聲,不過這里提到了 javascript string , 下次有機會總結(jié)關(guān)于 string 的神奇后,再和大家分享交流。