日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

传递参数的2种情况的理解。

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 传递参数的2种情况的理解。 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近差不多一個月沒寫博客了,主要的原因是目前在使用 Markdown 寫學到的一些心得,一方面方便記筆記,另一方面頁面排版更加的美觀。

個人筆記站點 : https://yewenxiang23.github.io


碰到的問題:

今天碰到一個關于傳遞參數的問題,想了一下午,終于想通了,打算總結記錄一下:

解決的思路:傳參是值復制的一個過程,傳遞的是值,

1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 obj = new Object(); 4 obj.name = "ye"; 5 } 6 var person = new Object(); 7 setName(person); 8 console.log(person.name); //yewenxiang

上面的代碼輸出了 "yewenxiang",而不是"ye"。感覺非常的怪異,下面來對于傳遞參數做一個總結。


?

傳遞參數:

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

   也就是說,把函數的值復制給函數內部的參數,就和把值從一個變量復制到另一個變量一樣。

值有兩種類型:

  • 基本類型:值保存在棧內存中,復制的時候也是把值同時也復制了一份。
  • 引用類型:值保存在堆內存中,棧內存中保存的只是指向堆內存中值的一個指針,復制的時候紙箱基本類型傳參:

例子就拿 《javascript高級程序設計》上的例子來說

基本類型的值傳參:

1 function addTen(num){ 2 num += 10; 3 return num; 4 } 5 var count = 20; 6 var result = addTen(count); 7 console.log(count); //20 8 console.log(result); //30

函數 addTen() 有一個num 參數,而參數實際上是函數的局部變量。在調用這個函數,并傳入參數 count時。由于 count的值為20,傳遞參數的過程是一個值得復制過程,也就是把 count 的值20,復制給了參數(函數的局部變量) num = 20。在堆內存中存在了 count=20 和num=20,兩個變量是互相不干擾的。

引用類型的值傳參:

1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 } 4 var person = new Object(); 5 setName(person); 6 console.log(person.name); //"yewenxiang"

這個例子中傳入了一個 person 對象,也就是引用類型,引用類型的復制和基本類型的復制不同,復制的是棧內存 變量person 中保存的地址,這個地址也指向堆內存中同一個對象。所以修改了函數局部變量 obj的name屬性為"yewenxiang" ,person.name也變為了"yewenxiang"。

證明參數是按值傳遞的一個例子:

1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 obj = new Object(); 4 obj.name = "ye"; 5 } 6 var person = new Object(); 7 setName(person); 8 console.log(person.name);

這是我碰到的問題,開始我想的是輸出 "ye" ,為什么會輸出 "yewenxiang"呢。明明obj代表的是person這個對象,而函數內部賦值之后又重新構造了一個新對象并賦值為 "ye",所以應該輸出 "ye"啊,為什么不是呢?那肯定是想錯了嘛。廢話少說 直接上圖:

上面3.4行代碼執行之前:

3.4行代碼執行之后:

由于obj為函數的局部變量,那么我們如何證明呢?

1 function setName(obj){ 2 obj.name = "yewenxiang"; 3 console.log(obj.name); //yewenxiang 4 obj = new Object(); 5 obj.name = "ye"; 6 console.log(obj.name); //ye 7 } 8 var person = new Object(); 9 setName(person); 10 console.log(person.name); //yewenxiang 11 console.log(obj.name); //報錯

這樣就證明了我的想法是正確的。

?

   

?

轉載于:https://www.cnblogs.com/yewenxiang/p/6337961.html

總結

以上是生活随笔為你收集整理的传递参数的2种情况的理解。的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。