<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      javascript中所有函數參數都是按值傳遞

      在看《JavaScript高級程序設計》(第三版)的時候,傳遞參數這一節,里面提到

      ECMAScript中所有函數的參數都是按值傳遞的

      它自己的解釋是,

      把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。
      基本類型值的傳遞如同基本類型變量的復制一樣,
      而引用類型值的傳遞,則如同引用類型變量的復制一樣。

      我們先明白幾個概念,之后再討論。

      數據類型

      基本數據類型,有6種,Undefined、Null、Boolean、Number、String、Symbol

      引用類型,Object、Array、Date、RegExg、Function等

      數據類型介紹,可以參考JavaScript數據類型的非常6+1

      內存空間

      var a = 2
      var b = 'abc'
      var c = true
      var d = {value : 1}
      var e = [1, 2, 3]
      

      定義的以上幾個變量,在內存中,所占用的空間如圖示意:

      內存空間示意圖

      基礎數據類型值,在棧中存儲實際的值。引用數據類型值,在棧中存儲引用地址值,在堆中存儲實際的值。

      賦值拷貝/復制

      基礎數據類型,賦值拷貝,拷貝實際值

      
      var a = 1
      
      var b = a
      
      b = 2
      
      console.log(a) // 1
      
      

      引用類型,賦值拷貝,拷貝引用地址,淺拷貝。可以參考javascript中的淺拷貝ShallowCopy與深拷貝DeepCopy

      
      var a = {value : 1}
      
      var b = a
      
      b.value = 2
      
      console.log(a.value) // 2
      
      

      舉例分析

      明白了以上幾個概念,我們再來說說,把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。也就是一個賦值復制過程。我們舉幾個例子分析下。

      1. 傳遞基礎類型,函數中不修改參數類型

      
      var a = 1
      
      function func(o) {
      
          o = 2
      
          console.log(o)
      
      }
      
      func(a) // 2
      
      console.log(a) // 1
      
      

      這里的func函數,傳遞了一個參數o,而參數實際上是函數的局部變量。那么,我們就可以修改函數

      
      var a = 1
      
      function func() {
      
          var o = a // 函數內部的參數變量,賦值函數外部的值
      
          o = 2 // 修改內部變量的值
      
          console.log(o)
      
      }
      
      func(a) // 2
      
      console.log(a) // 1
      
      

      可以得到相同的結果。他們在內存中的變化,如圖示意:
      傳遞基礎類型,函數中不修改類型

      從以上圖中,我們能清楚的看出,變量a一直等于1,而變量o,由于賦值之后,復制了a的實際值,在內存中開辟了空間,存儲在棧中。再執行func函數,修改變量o的值,只會影響其自身。

      2. 傳遞基礎類型,函數中修改類型

      
      var a = 1
      
      function func(o) {
      
          o = {value : 1}
      
          console.log(o)
      
      }
      func(a) // {value: 1}
      
      console.log(a) // 1
      
      

      同理,我們也可以修改這里的函數

      
      var a = 1
      
      function func() {
      
          var  o = a // 函數內部的參數變量,賦值函數外部的值
      
          o = {value : 1} // 修改內部變量的值
      
          console.log(o)  // {value: 1}
      
      }
      func() // {value: 1}
      
      console.log(a) // 1
      
      

      內存中的變化示意圖:
      傳遞基礎類型,函數中修改類型

      從以上圖中,我們能清楚的看出,變量a一直等于1,而變量o,由于內部參數賦值之后,復制了a的實際值,在內存中開辟了空間,存儲在棧中。再執行func函數,修改變量o的值,只會影響其自身。

      3. 傳遞引用類型,函數中不修改類型

      
      var a = { value : 1 }
      
      function func(o) {
      
          o.value = 2
      
          console.log(o)
      
      }
      
      func(a) // { value : 2}
      
      console.log(a) // {value : 2}
      
      

      同理,我們也可以修改這里的函數

      
      var a = { value : 1 }
      
      function func() {
      
          var  o = a // 函數內部的參數變量,賦值函數外部的值
      
          o.value = 2 // 修改內部變量的值
      
          console.log(o)  // {value: 2}
      
      }
      func() // {value: 2}
      
      console.log(a) // {value: 2}
      
      

      內存中的變化示意圖:
      傳遞引用類型,函數中不修改類型

      從以上圖中,我們能清楚的看出,由于變量a是引用類型,通過函數內部參數的賦值復制,傳遞了引用地址值,那么變量ao會指向同一個內存對象。再執行func函數,修改變量o在堆內存中的值,并沒有修改在棧中的引用地址的值。這樣,由于變量o和變量a使用的是同一個引用地址,也就是同一個堆內存中的值,那么變量a的值,也就會隨著變量o的變化而變化了。

      4. 傳遞引用類型,函數中修改類型

      
      var a = {value : 1 }
      
      function func(o) {
      
          o = 2
      
          console.log(o)
      
      }
      
      func(a) // 2
      
      console.log(a) // { value : 1}
      
      

      接下來,我們也可以修改這里的函數

      
      var a = { value : 1 }
      
      function func() {
      
          var  o = a // 函數內部的參數變量,賦值函數外部的值
      
          o = 2 // 修改內部變量的值
      
          console.log(o)  // 2
      
      }
      func() // 2
      
      console.log(a) // {value: 1}
      
      

      內存中的變化示意圖:
      傳遞引用類型,函數中修改類型

      由于變量a是引用類型,通過函數內部參數的賦值復制,傳遞了引用地址值,那么變量ao會指向同一個內存對象。再執行func函數時,改變了變量o的數據類型,變成了基礎數據類型,也就切斷了引用。這樣,變量ao就沒有關系了。

      總結

      JavaScript中所有函數參數都是按值傳遞的。基本類型值,傳遞的是實際值,引用類型,傳遞的是引用地址值。

      update 2020-11-17:
      基本類型值作為參數傳遞,經過函數處理,不會修改函數外的基本類型的值。
      引用類型值作為參數傳遞,經過函數處理,有可能會修改函數外的引用類型的值

      參考

      JavaScript深入之參數按值傳遞

      內存空間詳解

      posted @ 2018-08-18 17:06  weiqinl  閱讀(2091)  評論(1)    收藏  舉報
      主站蜘蛛池模板: 国内精品久久久久精免费| 成年女人碰碰碰视频播放| 40岁成熟女人牲交片20分钟| 亚洲AV无码秘?蜜桃蘑菇| 亚洲AV无码一二区三区在线播放| 无码人妻斩一区二区三区| 18禁免费无码无遮挡不卡网站| 国产欧亚州美日韩综合区| 国产精品中文字幕一二三| 国产麻豆91网在线看| 精品无码国产日韩制服丝袜| 国产jizzjizz视频| 国产午夜亚洲精品不卡下载| 博湖县| 国产精品色内内在线播放| 国产色无码精品视频免费| 日韩少妇内射免费播放| 在线观看视频一区二区三区| 人妻夜夜爽天天爽三区麻豆av| 国产精品高潮无码毛片| 白河县| 久久国产精品精品国产色| 国产精品久久中文字幕| 国产女人高潮视频在线观看| 亚洲综合不卡一区二区三区 | 中文字幕精品人妻丝袜| 少妇人妻av无码专区| 东京热无码av男人的天堂| 午夜成人性爽爽免费视频| 无码国内精品人妻少妇| 免费无码VA一区二区三区| 成人3D动漫一区二区三区| 亚洲精品无码高潮喷水A| 国产AV无码专区亚洲AV漫画| 国内极度色诱视频网站| 久久国内精品自在自线91| 国产综合色产在线视频欧美| 通河县| 精品国产女同疯狂摩擦2| 久久亚洲中文字幕伊人久久大| 国产超碰无码最新上传|