亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

通過實例了解js函數中參數的傳遞

2024-05-06 16:52:11
字體:
來源:轉載
供稿:網友

先看一道JS的筆試題:

var setObj=function(o){o.name="xiaoming";o={};o.name="xiaohong";}var p={name:"xixi",age:24};setObj(p);console.log(p);

答案是{name:xiaoming,age24};

在JavaScript中函數參數默認為引用類型。

一.函數傳遞值類型:

代碼實例如下:

function addNum(num){ num+=10; return num;}var num=10;var result=addNum(num);console.log(num);console.log(result);

以上代碼的彈出值分別為:10和20,下面進行一下分析:

聲明變量num并復制為10,這個是num是一個值類型,當為函數傳遞參數的時候,是將此值復制一份傳遞給函數,所以在函數執行之后,num本身的值并沒有被改變,函數中被改變的值僅僅是一個副本而已。

二.函數傳遞引用類型:

 function setName(obj){ obj.name="青島新銳"; } var web=new Object(); web.name="螞蟻部落"; setName(web); console.log(web.name);

以上代碼的彈出值是:“青島新銳”,下面進行一下分析:

聲明一個對象web,它是一個引用類型,當為函數傳遞參數的時候,是傳遞的web對象的引用,也就是此對象的內存地址,所以在函數中修改屬性的對象就是函數外面創建的對象本身。

三.加深理解:

function setName(obj){  obj.name="青島新銳";  obj=new Object();  obj.name="螞蟻部落";  }  var web=new Object(); setName(web); console.log(web.name);

以上代碼的彈出值是:青島新銳,很多人可能會以為將會彈出“螞蟻部落”,下面進行一下簡單的分析:

在函數外面創建一個對象,并將對象的引用賦值給變量web,web中存儲的是對象在內存中的存儲地址,當為函數傳遞參數的,就是傳遞的在函數外面創建的對象的地址。在函數中,為外面創建的對象創建一個自定義屬性name并賦值為“青島新銳”,然后又創建一個新的對象,并將新對象的地址賦值給obj,這個時候obj指向的并不是函數外面創建的對象,所以外面對象name屬性不會被改變。

這樣寫對于其他語言的程序員來說是很難接受的,我們在實際的開發中避免這樣的寫法,因為這樣會造成全局作用域污染。最近在讀《javascript高級程序設計》時碰到了js傳遞方式的問題,花費了些時間,不過總算明白了。

數據類型

在 javascript 中數據類型可以分為兩類:

  • 基本類型值 primitive type,比如Undefined,Null,Boolean,Number,String。
  • 引用類型值,也就是對象類型 Object type,比如Object,Array,Function,Date等。

變量的復制

眾所周知,js中變量的基本類型和引用類型保存方式是不同的,這也就導致變量復制時也就不同了。如果從一個變量向另一個變量復制基本類型的值時,會將前者的值克隆一個,然后將克隆的值賦值到后者,因此這兩個值是完全獨立的,只是他們的value相同而已。

var num1 = 10;var num2 = num1;console.log(num2);//10

上面的num1中被保存的值為10,當把num1的值賦值給num2時,num2的值也為10。但是這兩個10是完全獨立的,num2中的10只是被克隆出來的,相當于我寫了一個word文檔,把它放到了num1的文件夾中,然后我再復制這個word文檔,就叫word副本吧,然后把這個副本放到num2的文件夾下,這兩個word文檔是完全一樣的,修改任何一個都不會影響兩一個。

num2 += 1;console.log(num1); //10console.log(num2); //11

從上面可以看出修改num2的值,num1的值未發生變化。再來看下引用類型的復制。當從一個變量向另一個變量復制引用類型的值時,同樣也會將存儲在變量對象中的值復制一份放到為新變量分配的空間中。

var obj1 = {name : "111"};var obj2 = obj1;console.log(obj2.name); //111obj2.name = "222";console.log(obj1.name); //222

第一次打印出的結果為“111”,這個我們很容易理解,但是第二次打印出來的是“222”,有點莫名其妙了。這就是引用類型和基本類型的不同之處了。復制對象時并不會在堆內存中新生成一個一模一樣的對象,只是多了一個保存指向這個對象指針的變量罷了。將obj1的值復制給obj2,而這個值的副本實際上是一個指針,這個指針指向存儲在堆中的一個對象,也就是說創建了一個新的內存地址傳給了obj2,obj1和obj2兩個變量同時指向了同一個Object,當去改變這個對象時,他們的值都會改變,也就是說他們中任何一個作出的改變都會反映在另一個身上。下面的簡易圖可能更明了些。

js函數,參數,傳遞

函數參數的傳遞

《js高級程序設計》上是這樣敘述參數傳遞的:所有函數的參數都是按值傳遞的,也就是說把函數外部的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。所以如果能理解變量的復制,那么參數的傳遞也就很簡單了。還是先從基本類型舉例說明吧。

var count = 10;function num(num1){num1 = 1;return num1;}var result = num(count1);console.log(result);//1console.log(count);//10,并未變成1

這個例子很容易理解,實際就是創建了一個count的副本,然后把count的值傳入參數中,因為函數中定義了參數的值,所以1就將10覆蓋了,最后的result返回1,而count并未發生變化??匆粋€有關傳遞對象的例子。

var person = {name : "Tom"};function obj(peo){peo.name = "Jerry";return peo;}var result = obj(person);console.log(result.name);// Jerryconsole.log(person.name);// Jerry

在上面的例子中,把person復制傳入obj()中,peo和person指向了同一個對象,而在peo中修改了name屬性,其實修改了它們共同指向的對象的name屬性,相對應的外部person所引用的name屬性也就改變了,所以打印出來的為Jerry。其實這個乍一看,感覺引用類型的參數是按照引用傳遞的,這就是我最初犯得錯誤。再來看一個例子。

var person = {name : "Tom"}; function obj(peo){peo = {name : "Jerry"};return peo;}var result = obj(person);console.log(result.name);// Jerryconsole.log(person.name);// Tom

上面的例子中,在函數中重新定義了一個對象,也就是現在堆內存中有兩個對象,外部的person指向的是老的對象,被傳入參數后指向的是新定義的對象,所以調用后返回的值是新定義的對象的值。如果是參數是按引用傳遞的,那么person.name打印出來的結果為Jerry,從這點可以得出參數是按值傳遞的(有的地方叫做按共享傳遞)。

我們拿老羅推薦的《人類簡史》把它形象化,描述的不太好。簡史的第一章標題是“認知革命”,我們把它名字改為“person”根據后面的頁碼數可以直接找到“認知革命”的內容“也就是peoson所指向的對象”,第二章是“農業革命”,我們把它為“result”,其分目錄有一節“記憶過載”(改名為“peo”),同樣可以直接根據頁碼找到這一節內容。

現在我們把“person”復制到“peo”中,第二章中的“peo”這一節就變成了“person”,而我們根據第一章中的“peoson”找到的還是第一章的內容,這是因為它們指向了不同的內容板塊,互不干擾。在這里,堆內存就是每章的內容,而第一章和第二章內容是2個不同的對象,而這兩者互不相干,因此打印外部person.name時,結果仍是以前的對象的屬性值。

結論

總而言之,在js中參數都是按值傳遞的。我寫例子粗糙了些,《javascript高級程序設計》中的例子描述的更清晰一些,更易理解。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色狠狠av一区二区三区香蕉蜜桃| 亚洲美女久久久| 国内精品视频在线| 麻豆国产精品va在线观看不卡| 在线观看免费高清视频97| 日韩中文字幕不卡视频| 欧美视频精品一区| 久久成年人视频| 97免费视频在线播放| 精品综合久久久久久97| 日韩成人中文字幕在线观看| 国产日本欧美视频| 成人欧美一区二区三区黑人| 久久久久这里只有精品| 久久精品成人动漫| 欧美激情免费看| 91久久精品美女高潮| 亚洲精品美女免费| 亚洲精品日韩av| 精品国产自在精品国产浪潮| 成人黄色av网站| 欧美孕妇与黑人孕交| 亚洲天堂男人天堂女人天堂| 亚洲精品色婷婷福利天堂| 精品久久久久久国产91| 国产视频精品自拍| 欧美黑人狂野猛交老妇| 亚洲欧美综合区自拍另类| 久久久久久久一| 亚洲精品一区二区网址| 国模gogo一区二区大胆私拍| 亚洲欧美激情在线视频| 国产区精品视频| 中文字幕欧美精品日韩中文字幕| 清纯唯美亚洲激情| 欧美日韩成人在线播放| 九九久久久久久久久激情| 国产精品一区二区性色av| 国产成人精品视频在线| 久久久久久久久久久国产| 欧美成人午夜激情在线| 国产97在线视频| 97在线视频精品| 国产精品露脸自拍| 91在线观看免费| 亚洲无av在线中文字幕| 91丨九色丨国产在线| 色妞欧美日韩在线| 伦伦影院午夜日韩欧美限制| 国产亚洲精品久久| 中文字幕视频在线免费欧美日韩综合在线看| 91视频-88av| 2018中文字幕一区二区三区| 98精品国产高清在线xxxx天堂| 国产精品福利片| 亚洲精品乱码久久久久久金桔影视| 国产精品久久久久久久久粉嫩av| 日韩国产在线播放| 成人精品一区二区三区电影免费| 国产欧美欧洲在线观看| 亚洲曰本av电影| 欧美最顶级丰满的aⅴ艳星| 久久精品中文字幕电影| 久久久女人电视剧免费播放下载| 亚洲美腿欧美激情另类| 久久久久久久久久久人体| www.亚洲免费视频| 亚洲欧美中文字幕在线一区| 黄色成人在线播放| 国内偷自视频区视频综合| 亚洲精品av在线| 狠狠躁夜夜躁人人躁婷婷91| 久久夜色撩人精品| 狠狠色狠狠色综合日日小说| 久久福利视频导航| 亚洲一区二区免费在线| 欧美黄色性视频| 日韩欧美亚洲一二三区| 国产一区二区三区网站| 91精品国产综合久久香蕉922| 精品久久久久久久久久国产| 久久久亚洲成人| 国产精品1区2区在线观看| 国产在线视频不卡| 成人黄色av网| 欧美日韩国产区| 国产精品主播视频| 国产女精品视频网站免费| 国产主播精品在线| 日韩电影网在线| 国产啪精品视频| 亚洲成**性毛茸茸| 51视频国产精品一区二区| 欧美性生交大片免网| 一区二区三区在线播放欧美| 欧美久久精品一级黑人c片| 国产精品尤物福利片在线观看| 亚洲图片在区色| 日韩美女写真福利在线观看| 成人国产精品一区| 国产日韩在线一区| 欧美大胆a视频| 国内精品久久久久影院优| 在线成人免费网站| 国产精品欧美一区二区| 日本精品在线视频| 4438全国成人免费| 亚洲午夜女主播在线直播| 国产日韩欧美中文| 成人天堂噜噜噜| 北条麻妃在线一区二区| 国产一区二区三区三区在线观看| 国产精品91一区| 欧美在线精品免播放器视频| 欧美久久精品午夜青青大伊人| 456亚洲影院| 亚洲人成伊人成综合网久久久| 久久综合伊人77777蜜臀| 色噜噜狠狠狠综合曰曰曰88av| 国产精品极品美女在线观看免费| 91网站在线看| 亚洲乱码国产乱码精品精天堂| 午夜精品一区二区三区视频免费看| 中文字幕久精品免费视频| 2019国产精品自在线拍国产不卡| 91探花福利精品国产自产在线| 亚洲欧洲国产一区| 久久综合久中文字幕青草| 欧美老女人在线视频| 日韩在线视频二区| 久久免费少妇高潮久久精品99| 日韩福利在线播放| 国产精品久久99久久| 欧美另类极品videosbestfree| 久久大大胆人体| 日韩美女免费视频| 国产小视频91| 亚洲精品国偷自产在线99热| www欧美日韩| 久久综合久久八八| 色偷偷88888欧美精品久久久| 亚洲第一中文字幕在线观看| 97免费视频在线播放| 日韩电影免费观看在线| 欧美日韩在线免费观看| 欧美在线观看网站| 国产亚洲视频中文字幕视频| 国产欧美日韩亚洲精品| 91久久综合亚洲鲁鲁五月天| 亚洲天堂第二页| 欧美成人午夜激情在线| 国外成人性视频| 久久视频中文字幕| 51久久精品夜色国产麻豆| 欧美黑人极品猛少妇色xxxxx| 91精品国产91久久久久| 欧美黑人性生活视频| 欧美激情啊啊啊| 欧美在线观看网站| www亚洲欧美| 国产在线观看不卡| 日韩av在线一区二区| 欧美人在线视频| 日韩美女在线看|