最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談js中的引用和復制(傳值和傳址)

 更新時間:2016年09月18日 09:51:43   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談js中的引用和復制(傳值和傳址)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

好像一般很少人講到js中的引用和復制,不過弄清楚這個概念可以幫助理解很多東西

先講一下很基礎的東西,看看js中幾種數(shù)據(jù)類型分別傳的什么

引用:對象、數(shù)組、函數(shù)

復制:數(shù)字、布爾

字符串單獨說明,因為它的特殊性,無法確定是傳遞引用還是復制數(shù)值(因為字符串的值是沒法改變的,所以糾結這個問題也是沒意義的)但是用于比較的時候顯然是屬于傳值比較(稍后具體說比較的事)

下面講一下在使用中的具體體現(xiàn)

最普通的使用就是賦值了

var a = 1;
var b = a;  //賦的是a的復制值
b ++;
alert(a);  //"1"  b的修改不影響a
/****************************************/
var a = [1];
var b = a;   //賦的是a的引用 
b[0] ++;
alert(a); //"2"  b的修改對a也有效  不過當然b = [2];這種修改對a是沒用的。

函數(shù)的參數(shù)

傳值的傳遞:傳給函數(shù)的是數(shù)值的一個復制,函數(shù)中對其的修改外部不可見

var a = 1;
var b = 2;
function change(a,b) {
 var c = a;
 a = b;   //用新引用覆蓋
 b = c;
 alert(a);  //"2"     
 alert(b);  //"1"
}
change(a,b);
alert(a);  //"1"     
alert(b);  //"2"

傳址的傳遞:傳給函數(shù)的是數(shù)值的一個引用,函數(shù)中對其屬性的修改外部可見,但用新引用覆蓋其則在外部不可見,比如

var a = [1, 2, 3];
var b = [5, 6];
function change(a,b) {
 a[0] = 4;  //對其屬性的修改外部可見 
 var c = a;
 a = b;   //用新引用覆蓋
 b = c;
 alert(a);  //"5,6"     
 alert(b);  //"4,2,3"
}
change(a,b);
alert(a);  //"4,2,3"
alert(b);   //"5,6"

從結果可以看出a和b并沒有互換   因為用新引用覆蓋在外部不可見 這個很自然 因為函數(shù)只是拿到了引用 并沒有權力更改引用

下面這個就不同了

var a = [1, 2, 3];
var b = [5, 6];
function change() {
 var c = a;
 a[0] = 4;
 a = b;
 b = c;
};
change();
alert(a);  //"5,6"
alert(b);  //"4,2,3"

這里成功實現(xiàn)互換 

又得提到js的塊級作用域了,這個放某些語言里定然是要報未定義錯誤的,因為js沒有塊級作用域,所以它在change里找不到變量a,b就會自覺的到上層去找,所以這里的a,b是全局變量的引用

而上面的那個a,b則是change函數(shù)中的變量,在調用函數(shù)時傳遞了a,b的引用賦給了這兩個變量,但是并不能改變全局中的a,b,這里換個名字大概就好理解多了

這個稍微提下    有些走題了。。。。

回到引用和復制 在比較運算中的注意事項

傳值的比較比較的是數(shù)值 而傳址的比較比較的是引用,引用不同即使數(shù)值相同也不等

1 == 1;  //true
1 === 1;  //true
[0] == [0]; //false
[0][0] == [0][0];  //true
[0][0] === [0][0];  //true
[0].toString() == [0].toString();  //true 

閉包中。。。。

閉包大概是js中最糾結的東西 我們部門面試的經典試題,常考不衰啊。。。。

這里我先不說閉包的東西,只說一下涉及傳值和引用的部分,等我哪天確定自己可以用清晰的條例、簡明的語言、生動的實例徹底的說清楚那個東西,再詳細介紹這個提js不能不提的家伙。。。

閉包中,內部函數(shù)用外部函數(shù)的局部變量使用引用的方式而不是復制

其實這也是理解閉包的一個很重要的部分 可以用這個解釋一個很經典的閉包現(xiàn)象,很多地方在說明閉包的時候都會用到的一個例子

/*構造一個函數(shù),給數(shù)組中的節(jié)點設置事件處理程序,當點擊一個節(jié)點時,alert出節(jié)點的序號*/
var add_handlers = function (nodes) {
  var i;
  for (i = 0, l = nodes.length; i < l; i ++) {
    nodes[i].onclick = function (e) {
      alert(i);  // 當然這里的結果必然是每次alert的都是節(jié)點總數(shù)。。。。
    }
  }
};

為什么每次alert的都是節(jié)點總數(shù) 而不是預期的序號呢,這個如果用復制和引用解釋就相當容易了

因為內部函數(shù)在使用外部變量時使用引用的方式而不是復制,就是說我給每個節(jié)點設置onclick事件的時候將i的引用傳遞給了alert,當我點擊節(jié)點觸發(fā)onclick事件的時候,i的值已經變成了節(jié)點總數(shù)。。。

var add_handlers = function (nodes) {
  var i;
  for (i = 0, l = nodes.length; i < l; i ++) {
 
    nodes[i].onclick = function (i) {
      return function(){
      alert(i);  
      }
 }(i);
  }
};

這樣修改后之所以正確是因為此時傳進去的是i的值的復制,其實和普通函數(shù)是一樣的,不要因為加了閉包就迷糊了,回歸本源去思考就明白了,本源就是上面講到的傳址的傳遞

順便提一句,不要被閉包這個古怪的名字唬住了,其實它和我們平時用的函數(shù)原理是一樣的,拋開那些“更長的生命周期”“保護私有變量”等閉包所謂的特性,把它當成一個普通的函數(shù)(也可以換個角度把全局函數(shù)看成一個特殊的閉包),很容易就可以理解了

關鍵是要放下所有的浮華,回歸最本質。。。又跑題了。。。

以上這篇淺談js中的引用和復制(傳值和傳址)就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • 微信小程序下拉刷新PullDownRefresh的使用方法

    微信小程序下拉刷新PullDownRefresh的使用方法

    這篇文章主要給大家介紹了關于微信小程序下拉刷新PullDownRefresh的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-11-11
  • 基于JavaScript實現(xiàn)的順序查找算法示例

    基于JavaScript實現(xiàn)的順序查找算法示例

    這篇文章主要介紹了基于JavaScript實現(xiàn)的順序查找算法,結合實例形式分析了javascript順序查找的原理、實現(xiàn)技巧與相關注意事項,需要的朋友可以參考下
    2017-04-04
  • js實現(xiàn)多張圖片延遲加載效果

    js實現(xiàn)多張圖片延遲加載效果

    這篇文章主要為大家詳細介紹了js實現(xiàn)多張圖片延遲加載效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • JS逆向之加密參數(shù)定位

    JS逆向之加密參數(shù)定位

    越來越多的網站進行數(shù)據(jù)傳輸時不使用明文傳輸,本文主要介紹了JS逆向之加密參數(shù)定位,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-01-01
  • js中的如何定位固定層的位置

    js中的如何定位固定層的位置

    這篇文章主要介紹了js中的如何定位固定層的位置,需要的朋友可以參考下
    2014-06-06
  • JS表單提交中onsubmit事件return的作用詳解

    JS表單提交中onsubmit事件return的作用詳解

    這篇文章主要為大家介紹了JS表單提交中onsubmit事件return的作用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • 基于JS實現(xiàn)快速讀取TXT文件

    基于JS實現(xiàn)快速讀取TXT文件

    這篇文章主要介紹了基于JS實現(xiàn)快速讀取TXT文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-08-08
  • html中使用javascript調用本地程序(exe、doc等)實現(xiàn)代碼

    html中使用javascript調用本地程序(exe、doc等)實現(xiàn)代碼

    調用本地程序(exe,doc等)使用html中的javascript實現(xiàn),不可思議吧,接下來為大家詳細介紹下,感興趣的朋友可以參考下哈
    2013-04-04
  • 深入理解redux之compose的具體應用

    深入理解redux之compose的具體應用

    這篇文章主要介紹了深入理解redux之compose的具體應用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-01-01
  • 詳解如何使用webpack打包多頁jquery項目

    詳解如何使用webpack打包多頁jquery項目

    這篇文章主要介紹了詳解如何使用webpack打包多頁jquery項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-02-02

最新評論

天水市| 宣汉县| 稻城县| 泰州市| 新巴尔虎右旗| 元朗区| 温泉县| 临泽县| 普宁市| 桐城市| 塔河县| 三穗县| 桦甸市| 印江| 连州市| 嵊州市| 台东市| 石阡县| 涿州市| 沈丘县| 昭通市| 仪征市| 扶沟县| 罗平县| 西乌| 平顺县| 洛隆县| 都安| 铜鼓县| 怀来县| 徐汇区| 通山县| 崇阳县| 靖西县| 水城县| 炉霍县| 绿春县| 泸西县| 定日县| 文山县| 新蔡县|