<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        JavaScript參數傳遞中值和引用的一種理解的詳細介紹

        來源:懂視網 責編:小采 時間:2020-11-27 20:24:30
        文檔

        JavaScript參數傳遞中值和引用的一種理解的詳細介紹

        JavaScript參數傳遞中值和引用的一種理解的詳細介紹:值(value)和引用(reference)是各種編程語言老生常談的話題,js也不例外。我將剖析一個例子的實際運行過程,跟大家分享我對js參數傳遞中的值和引用的理解。參考官網數據類型的兩種分類,本文將這兩種分類簡稱為基本類型(boolean, null, undef
        推薦度:
        導讀JavaScript參數傳遞中值和引用的一種理解的詳細介紹:值(value)和引用(reference)是各種編程語言老生常談的話題,js也不例外。我將剖析一個例子的實際運行過程,跟大家分享我對js參數傳遞中的值和引用的理解。參考官網數據類型的兩種分類,本文將這兩種分類簡稱為基本類型(boolean, null, undef
        值(value)和引用(reference)是各種編程語言老生常談的話題,js也不例外。

        我將剖析一個例子的實際運行過程,跟大家分享我對js參數傳遞中的值和引用的理解。

        參考官網數據類型的兩種分類,本文將這兩種分類簡稱為基本類型(boolean, null, undefined, string, number, symbol)和object類型。

        首先,用一個example 演示參數傳遞的應用:

        var obj = {};
        obj.inner = 10;
        
        var num = 10;
        var str = 'Hello';
        var boo = true;
        var oth = null;
        var und = undefined;
        var sym = Symbol('foo');
        
        function passingobject(myobj){
         myobj.inner = 1 + myobj.inner ; 
        }
        
        function passingvalue(myvalue){
         switch(typeof myvalue){
         case 'number':
         myvalue = myvalue + 1;
         break;
         case 'string':
         myvalue = 'I am a new string now!';
         break;
         case 'boolean':
         myvalue= false;
         break;
         default:
         myvalue = 'Null, Undefined, or Symbol';
         }
         }
        
         console.log("before num = " + num); // before num = 10
         passingvalue(num);
         console.log("after num = " + num); // after num = 10
         console.log("before str = " + str); // before str = Hello
         passingvalue(str);
         console.log("after str = " + str); // after str = Hello
         console.log("before boo = " + boo); // before boo = true
         passingvalue(boo);
         console.log("after boo = " + boo); // after boo = false
         console.log("before oth = " + oth); // before oth = null
         passingvalue(oth);
         console.log("after oth = " + oth); // after oth = null
         console.log("before und = " + und); // before und = undefined
         passingvalue(und);
         console.log("after und = " + und); // after und = undefined
         console.log(sym); // Symbol(foo)
         passingvalue(sym);
         console.log(sym); // Symbol(foo)
         console.log("before obj.inner = " + obj.inner); // before obj.inner = 10
         passingobject(obj); // after obj.inner = 11
         console.log("after obj.inner = " + obj.inner);

        從example 1 的結果似乎可以總結出以下兩條結論:

        1. 傳遞的數據類型為基本類型(number, string boolean, null, undefined, symbol),在參數傳遞過程中,函數內部對傳遞值的操作并不影響原始值。

        2. 傳遞的數據類型為object, 在參數傳遞過程中,函數內部對傳遞值的操作會導致原始值的改變。

        然而, 有沒有其他特殊情況呢?

        有一種在stackoverflow討論很火熱的用法,跟結論二背道而行。example 2。

         1 function changeStuff(a, b, c)
         2 {
         3 a = a * 10;
         4 b.item = "changed";
         5 c = {item: "changed"};
         6 }
         7 
         8 var num = 10;
         9 var obj1 = {item: "unchanged"};
        10 var obj2 = {item: "unchanged"};
        11 
        12 console.log(obj1.item); // unchanged
        13 console.log(obj2.item); // unchanged
        14 changeStuff(num, obj1, obj2);
        15 console.log(obj1.item); // changed
        16 console.log(obj2.item); // unchanged

        example 2中, obj2.item并沒有被函數changeStuff改變。changeStuff內部同樣改變了b、c的值,為什么obj1被改變了(L15)而obj2沒有被改變呢?

        我用js的執行上下文對這種現象進行解釋,如圖。

        在js運行過程中,編輯器動態生成執行上下文(execution context),example 2中,首先生成global的執行上下文和changeStuff的執行上下文。

        執行到changeStuff(num, obj1, obj2)的時候, a, b, c指向參數num, obj1, obj2,a和num指向10, b跟obj1指向同一個值,c跟obj2指向同一個值。

        執行step 1的時候,對a重新賦值,為a賦值前的10倍,從此a與num毫無關系。

        執行step 2的時候,對b所指向的值的item屬性進行重新賦值,這個賦值只改變了item的值, 而obj1和b仍然指向同一個值。

        執行step 3的時候,對c重新賦值,從此c與obj2再無瓜葛,因此即使c有一個叫item的屬性,與obj2的item屬性有著各自的值,并沒有影響obj2.item。

        也就是說,js函數參數傳遞過程中,若函數內部對參數重新賦值,這個賦值過程不會影響原始變量的值。

        這也很好地解釋了基本類型的參數變量(結論1)不會受影響的現象,基本類型的參數變量每一次改變都是一次全新賦值,對原始變量不會造成影響。

        總結

        在js函數傳遞中,當基本類型(number, string, boolean, null, undefined, symbol)變量作為參數傳遞時,函數內部對參數的任何操作都不會改變變量的值。

        當object類型變量作為參數傳遞時,函數內部對參數的操作會影響變量的值,除非函數內部對參數重新賦值(任何類型的值)。

        Thank you!

        Feel free to contact me if you have any question!

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        JavaScript參數傳遞中值和引用的一種理解的詳細介紹

        JavaScript參數傳遞中值和引用的一種理解的詳細介紹:值(value)和引用(reference)是各種編程語言老生常談的話題,js也不例外。我將剖析一個例子的實際運行過程,跟大家分享我對js參數傳遞中的值和引用的理解。參考官網數據類型的兩種分類,本文將這兩種分類簡稱為基本類型(boolean, null, undef
        推薦度:
        標簽: js java 參數
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 国产最新凸凹视频免费| 国产午夜鲁丝片AV无码免费| 67pao强力打造高清免费| 免费在线观看h片| 四虎影视永久免费观看网址| 亚洲欧美成人av在线观看| 国产99久久久国产精免费| 日韩免费高清大片在线| 精品国产麻豆免费网站| 亚洲日本va中文字幕久久| 亚洲国产成人精品久久| 免费一区二区三区在线视频| 精品熟女少妇a∨免费久久| 一本久到久久亚洲综合| 亚洲综合色丁香麻豆| 免费看美女午夜大片| 亚洲无码视频在线| 亚洲精品成a人在线观看☆| 久久精品毛片免费观看| 国产精品亚洲片在线va| 成全视频在线观看免费| 日日夜夜精品免费视频| 亚洲嫩草影院在线观看| 日韩免费人妻AV无码专区蜜桃| 亚洲国产成人精品电影| 四虎成人精品在永久免费 | 亚洲人妖女同在线播放| 日韩电影免费在线观看视频| 又硬又粗又长又爽免费看| 高清国语自产拍免费视频国产| 特级毛片爽www免费版| 亚洲AV无码专区在线播放中文 | 好爽又高潮了毛片免费下载| 亚洲综合精品香蕉久久网97| eeuss在线兵区免费观看| 亚洲AV无码成人专区片在线观看 | 亚洲国模精品一区| 黄页免费视频播放在线播放| 精品久久久久久久免费人妻| 中文成人久久久久影院免费观看| 亚洲麻豆精品国偷自产在线91|