網(wǎng)絡(luò)上看到一篇文章,《JavaScript 傳遞參數(shù)是值傳遞?還是值傳遞啊?》

          地址:http://www.xiaoxiaozi.com/2010/03/05/1719/

          當(dāng)然看這之前我是很清晰知道基本數(shù)據(jù)類型傳值,引用數(shù)據(jù)類型傳引用。

          剛看了個開頭就有點(diǎn)暈了,文章所說:

          “在本文開頭,首先,十萬以及萬分肯定的說一句,JavaScript 函數(shù)傳遞參數(shù)時,是值傳遞。”

          有興趣的朋友可以去看原文。 我看了之后就順手寫起了示例代碼:

          (1) 典型傳值

          function setName(name)
                      {
                          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

          我想大家對輸出的結(jié)果都沒異議。這也是我記憶中的理解。

          下面帶領(lǐng)大家看一些可能引起大家議論的示例:

          var x = new Object();
                      x.name 
          = "test";
                          
                      
          function setName(obj)
                      {
                          obj 
          = x;
                          alert(obj 
          == x);    // true 因?yàn)樯弦痪溥M(jìn)行了賦值操作
                      }
                      
          var person = new Object();
                      person.name 
          = " hechangmin ";
                      
                      setName(person);
                      alert(person.name); 
          // hechangmin
                      alert(person == x); // false 

          傳進(jìn)去的 person 肯定是 引用數(shù)據(jù)類型。(這點(diǎn)沒歧義)

          進(jìn)去后發(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 傳值 傳引用的文章。

          文章有說傳遞進(jìn)去的引用型參數(shù),在內(nèi)部如果直接對引用參數(shù)賦值。 javascript 會自動生成一份copy ,而不去影響原有的引用。

          ===========

          綜上所述 ,基本就都明白。文章寫到這里基本就接近尾聲,不過這里提到了 javascript string , 下次有機(jī)會總結(jié)關(guān)于 string 的神奇后,再和大家分享交流。

          posted on 2010-03-18 16:12 -274°C 閱讀(7676) 評論(3)  編輯  收藏 所屬分類: web前端


          FeedBack:
          # re: 關(guān)于傳值和傳引用的插曲
          2011-01-22 09:18 | ffff
          fffffff  回復(fù)  更多評論
            
          # re: 關(guān)于傳值和傳引用的插曲
          2011-01-22 09:23 | ffff
          這個很容易理解嘛,
          在函數(shù)里,那個obj不是被換成x了嗎?
          本來obj是保存person的引用,當(dāng)執(zhí)行了obj=x;時,obj就被改編成保存x的引用了。根本就沒有什么特別需要強(qiáng)調(diào)的吧?  回復(fù)  更多評論
            
          # re: 關(guān)于傳值和傳引用的插曲
          2014-07-11 09:24 | bandit
          大家不要看這篇文章 本來很簡單的事情反而被博主繞復(fù)雜了,  回復(fù)  更多評論
            

          常用鏈接

          留言簿(21)

          隨筆分類(265)

          隨筆檔案(242)

          相冊

          JAVA網(wǎng)站

          關(guān)注的Blog

          搜索

          •  

          積分與排名

          • 積分 - 914173
          • 排名 - 40

          最新評論

          主站蜘蛛池模板: 辽阳县| 永丰县| 松桃| 吉林省| 荆州市| 石嘴山市| 理塘县| 卓资县| 尖扎县| 灯塔市| 钟祥市| 宁明县| 乐山市| 隆昌县| 通海县| 丹寨县| 洪江市| 富顺县| 浦北县| 乐昌市| 隆安县| 胶南市| 孟州市| 晋州市| 宾川县| 冷水江市| 民权县| 塔城市| 霍邱县| 丽江市| 无为县| 万州区| 沁源县| 上蔡县| 九龙县| 富宁县| 瓦房店市| 九江市| 丰都县| 盐津县| 湾仔区|