亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(shí)間:2016年09月18日 09:51:43   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇淺談js中的引用和復(fù)制(傳值和傳址)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

好像一般很少人講到j(luò)s中的引用和復(fù)制,不過(guò)弄清楚這個(gè)概念可以幫助理解很多東西

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

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

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

字符串單獨(dú)說(shuō)明,因?yàn)樗奶厥庑?,無(wú)法確定是傳遞引用還是復(fù)制數(shù)值(因?yàn)樽址闹凳菦](méi)法改變的,所以糾結(jié)這個(gè)問(wèn)題也是沒(méi)意義的)但是用于比較的時(shí)候顯然是屬于傳值比較(稍后具體說(shuō)比較的事)

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

最普通的使用就是賦值了

var a = 1;
var b = a;  //賦的是a的復(fù)制值
b ++;
alert(a);  //"1"  b的修改不影響a
/****************************************/
var a = [1];
var b = a;   //賦的是a的引用 
b[0] ++;
alert(a); //"2"  b的修改對(duì)a也有效  不過(guò)當(dāng)然b = [2];這種修改對(duì)a是沒(méi)用的。

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

傳值的傳遞:傳給函數(shù)的是數(shù)值的一個(gè)復(fù)制,函數(shù)中對(duì)其的修改外部不可見(jiàn)

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ù)值的一個(gè)引用,函數(shù)中對(duì)其屬性的修改外部可見(jiàn),但用新引用覆蓋其則在外部不可見(jiàn),比如

var a = [1, 2, 3];
var b = [5, 6];
function change(a,b) {
 a[0] = 4;  //對(duì)其屬性的修改外部可見(jiàn) 
 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"

從結(jié)果可以看出a和b并沒(méi)有互換   因?yàn)橛眯乱酶采w在外部不可見(jiàn) 這個(gè)很自然 因?yàn)楹瘮?shù)只是拿到了引用 并沒(méi)有權(quán)力更改引用

下面這個(gè)就不同了

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"

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

又得提到j(luò)s的塊級(jí)作用域了,這個(gè)放某些語(yǔ)言里定然是要報(bào)未定義錯(cuò)誤的,因?yàn)閖s沒(méi)有塊級(jí)作用域,所以它在change里找不到變量a,b就會(huì)自覺(jué)的到上層去找,所以這里的a,b是全局變量的引用

而上面的那個(gè)a,b則是change函數(shù)中的變量,在調(diào)用函數(shù)時(shí)傳遞了a,b的引用賦給了這兩個(gè)變量,但是并不能改變?nèi)种械腶,b,這里換個(gè)名字大概就好理解多了

這個(gè)稍微提下    有些走題了。。。。

回到引用和復(fù)制 在比較運(yùn)算中的注意事項(xiàng)

傳值的比較比較的是數(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中最糾結(jié)的東西 我們部門面試的經(jīng)典試題,??疾凰グ?。。。。

這里我先不說(shuō)閉包的東西,只說(shuō)一下涉及傳值和引用的部分,等我哪天確定自己可以用清晰的條例、簡(jiǎn)明的語(yǔ)言、生動(dòng)的實(shí)例徹底的說(shuō)清楚那個(gè)東西,再詳細(xì)介紹這個(gè)提js不能不提的家伙。。。

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

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

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

為什么每次alert的都是節(jié)點(diǎn)總數(shù) 而不是預(yù)期的序號(hào)呢,這個(gè)如果用復(fù)制和引用解釋就相當(dāng)容易了

因?yàn)閮?nèi)部函數(shù)在使用外部變量時(shí)使用引用的方式而不是復(fù)制,就是說(shuō)我給每個(gè)節(jié)點(diǎn)設(shè)置onclick事件的時(shí)候?qū)的引用傳遞給了alert,當(dāng)我點(diǎn)擊節(jié)點(diǎn)觸發(fā)onclick事件的時(shí)候,i的值已經(jīng)變成了節(jié)點(diǎn)總數(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);
  }
};

這樣修改后之所以正確是因?yàn)榇藭r(shí)傳進(jìn)去的是i的值的復(fù)制,其實(shí)和普通函數(shù)是一樣的,不要因?yàn)榧恿碎]包就迷糊了,回歸本源去思考就明白了,本源就是上面講到的傳址的傳遞

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

關(guān)鍵是要放下所有的浮華,回歸最本質(zhì)。。。又跑題了。。。

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

相關(guān)文章

  • 微信小程序進(jìn)入廣告實(shí)現(xiàn)代碼實(shí)例

    微信小程序進(jìn)入廣告實(shí)現(xiàn)代碼實(shí)例

    這篇文章主要介紹了微信小程序進(jìn)入廣告實(shí)現(xiàn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Javascript基于對(duì)象三大特性(封裝性、繼承性、多態(tài)性)

    Javascript基于對(duì)象三大特性(封裝性、繼承性、多態(tài)性)

    這篇文章主要介紹了Javascript基于對(duì)象三大特性,包括封裝性、繼承性、多態(tài)性,感興趣的小伙伴們可以參考一下
    2016-01-01
  • JS基于ES6新特性async await進(jìn)行異步處理操作示例

    JS基于ES6新特性async await進(jìn)行異步處理操作示例

    這篇文章主要介紹了JS基于ES6新特性async await進(jìn)行異步處理操作,結(jié)合實(shí)例形式分析了async await進(jìn)行異步處理操作的相關(guān)原理、步驟與注意事項(xiàng),需要的朋友可以參考下
    2019-02-02
  • Bootstrap基本樣式學(xué)習(xí)筆記之表格(2)

    Bootstrap基本樣式學(xué)習(xí)筆記之表格(2)

    Bootstrap提供了一個(gè)清晰的創(chuàng)建表格的布局,這篇文章主要介紹了Bootstrap學(xué)習(xí)筆記之表格基本樣式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • JavaScript實(shí)現(xiàn)二維坐標(biāo)點(diǎn)排序效果

    JavaScript實(shí)現(xiàn)二維坐標(biāo)點(diǎn)排序效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)二維坐標(biāo)點(diǎn)排序效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Bootstrap輪播圖的使用和理解4

    Bootstrap輪播圖的使用和理解4

    這篇文章主要為大家詳細(xì)介紹了關(guān)于Bootstrap輪播圖的使用和理解的學(xué)習(xí)記錄,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • javascript中的隱式調(diào)用

    javascript中的隱式調(diào)用

    本篇文章給大家詳細(xì)介紹了javascript中的隱式調(diào)用相關(guān)知識(shí)點(diǎn),對(duì)此有興趣的可以跟著小編一起學(xué)習(xí)下。
    2018-02-02
  • JavaScript實(shí)現(xiàn)五子棋游戲的方法詳解

    JavaScript實(shí)現(xiàn)五子棋游戲的方法詳解

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)五子棋游戲的方法,結(jié)合實(shí)例形式詳細(xì)分析了javascript實(shí)現(xiàn)五子棋游戲的具體步驟、原理與相關(guān)操作技巧,需要的朋友可以參考下
    2019-07-07
  • 在JavaScript中獲取請(qǐng)求的URL參數(shù)[正則]

    在JavaScript中獲取請(qǐng)求的URL參數(shù)[正則]

    在ASP.NET后臺(tái)代碼中,對(duì)于這樣的URL請(qǐng)求地址:http://www.abc.com?id=001,我們可以通過(guò)Request.QueryString["id"]的方法很容易的獲取到URL中請(qǐng)求的參數(shù)的值,但是要在前臺(tái)js代碼中獲取請(qǐng)求的參數(shù)的值,應(yīng)該怎么做呢?
    2010-12-12
  • JavaScript編寫檢測(cè)用戶所使用的瀏覽器的代碼示例

    JavaScript編寫檢測(cè)用戶所使用的瀏覽器的代碼示例

    這篇文章主要介紹了JavaScript編寫檢測(cè)用戶所使用的瀏覽器的代碼示例,這樣就可以根據(jù)用戶的瀏覽狀態(tài)來(lái)調(diào)整桌面版移動(dòng)版或者兼容性的頁(yè)面,需要的朋友可以參考下
    2016-05-05

最新評(píng)論