首頁 web前端 js教程 javascript的變數、傳值、傳址、參數之間關係_jquery

javascript的變數、傳值、傳址、參數之間關係_jquery

May 16, 2016 pm 03:48 PM
javascript 傳值 參數 變數

先把收穫晾一下:

1.javascrip變數包含兩種類型的值,一種是引用型別的值,一種是基本型別的值。引用型別包括:Array,Object,Function(可以這麼理解,非基本型別的都是引用型別);5種基本型別包括:undefined,null,string,boolean,number

2.函數的參數的傳遞的機制是複製變數值。

書上說:」把函數外部的值複製給函數內部的參數,就和把值從一個變數複製給另一個變數一樣。基本型別的傳遞如同基本型別變數的複製一樣,而引用型別的則如同引用類型變數的複製一樣。

」當一個變數複製引用型別的值時,同樣也會將儲存在變數物件中的值複製一份放到為新變數指派的空間。不同的是這個值的副本其實是一個指標,而這個指標指向儲存在堆中的一個物件。

【注意:複製引用類型的值,才是傳址】

3.參數其實是函數的局部變數。

----------------------------------------------- -----------------------------

基本概念的解釋:

傳值:把A的數值傳到B,改變B,A不會跟著變,B存的是跟A一樣的值;

傳址:把A的位址傳到B,改變B,A同時跟著變,B存的只是A的位址(類似電腦的捷徑)。


一個具有值型別(value type)的資料存放在堆疊內的變數中。即在堆疊中分配記憶體空間,直接儲存所包含的值,其值就代表資料本身。值類型的資料具有較快的存取速度。

一個具有引用類型(reference type)的資料並不駐留在堆疊中,而是儲存於堆中。即是在堆中分配記憶體空間,不直接儲存所包含的值,而是指向所要儲存的值,其值代表的是所指向的位址。當存取具有引用類型的資料時,需要到堆疊中檢查變數的內容,該變數引用堆中的一個實際資料。引用類型的資料比值類型的資料具有更大的儲存規模和較低的存取速度。

----------------------------------------------- -----------------------------

下面是三個問題。

【問題1】:

為什麼change(a)函數執行完之後,外面的a沒有受干擾呢?

<script>
var a = [1, 2, 3];
function change(a) {
 console.log(a);//[1,2,3]
 a = 2;   //传值
 console.log(a);//2
}
change(a);
console.log(a);  //[1,2,3] 
</script>

登入後複製
問題1解答:因為change(a)的執行過程是這樣的,先將物件a(陣列)傳入到change以後,被複製給change的參數a。而後a=2是一個賦值語句,變成傳值。此時a=2是值類型,並不涉及引用位址的問題。所以並沒有影響外在的a。

【問題2】:

為什麼change(a)函數執行完之後,外面的a受到干擾呢?

<script>
 var a = [1, 2, 3];
 function change() { 
  a = 2;//传值
 }
 change();
 console.log(a);  //2 
</script>

登入後複製
 問題2解答:當執行change()的時候,函數在自己的執行環境中找尋作用域鏈,活動物件(activation object)並不包含變數a,於是沿著作用域鏈往上找,找到全域執行環境,發現變數a,於是此時函數內部的a和外部a在記憶體上是同一個位址,自然函數內部a變了,外部也會跟著變。

解析:問題2和問題1的差別在於,問題2並沒有引入參數,所以不涉及複製變數的事情。

【問題3】:

為什麼change(a)函數執行完之後,外面的a受到干擾呢?

<script>
 var a = [1, 2, 3];
 function change(b) { 
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[2,2,3]
</script>

登入後複製
問題3解答:這個和問題1非常類似,唯獨不一樣的就是a=2,換成了b[0]=2,我一開始也很疑惑,不說複製嗎?參數b應該是複製值,怎麼會影響到外面的a呢?

的確,change函數執行時,參數b是a的複製值。因為a是引用類型,所以在函數內部是b和a按引用來存取的是一個位址的物件。 b[0]=2的出現,並不影響在函數內部b和a所引用的是同一個物件。

【問題4】:

為什麼change(a)函數執行完之後,外面的a沒有受到干擾呢?

 var a = [1, 2, 3];
 function change(b) { 
  console.log(b);//[1,2,3]
  b=2;
  b[0] = 2;
 }
 change(a);
 console.log(a);  //[1,2,3]

登入後複製
 問題4解答:change(b)執行過程是這樣的,a物件傳入change函數,將值和位址複製給b。 b=2這句,此時b變成值型了,不涉及地址引用的問題,之後b[0]=2這句其實毫無意義,因為此時b已經不是數組了,自然不具有b[0]這樣的索引方式。所以b與a的地址引用關係其實在b=2之後就消失了。此時外界的a仍是[1,2,3];

以上所述就是本文的全部內容了,希望大家能夠喜歡。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1664
14
CakePHP 教程
1421
52
Laravel 教程
1315
25
PHP教程
1266
29
C# 教程
1239
24
C++ 函式參數型別安全檢查 C++ 函式參數型別安全檢查 Apr 19, 2024 pm 12:00 PM

C++參數類型安全檢查透過編譯時檢查、執行時間檢查和靜態斷言確保函數只接受預期類型的值,防止意外行為和程式崩潰:編譯時類型檢查:編譯器檢查類型相容性。運行時類型檢查:使用dynamic_cast檢查類型相容性,不符則拋出異常。靜態斷言:在編譯時對型別條件進行斷言。

i9-12900H參數評測大全 i9-12900H參數評測大全 Feb 23, 2024 am 09:25 AM

i9-12900H是14核心的處理器,使用的架構和工藝都是全新的,線程也很高,整體的工作都是很優秀的,一些參數都有提升特別的全面,是可以給用戶們帶來極佳體驗的。 i9-12900H參數評測大全評測:1、i9-12900H是14核心的處理器,採用了q1架構以及24576kb的製程工藝,提升到了20個執行緒。 2.最大的CPU頻率是1.80!5.00ghz,整體主要取決於工作的負載。 3.相比較價位來說還是特別合適的,性價比很不錯,對於一些需要正常使用的伙伴來說非常的合適。 i9-12900H參數評測大全性能跑分

如何使用Ajax從PHP方法取得變數? 如何使用Ajax從PHP方法取得變數? Mar 09, 2024 pm 05:36 PM

使用Ajax從PHP方法取得變數是Web開發中常見的場景,透過Ajax可以實作頁面無需刷新即可動態取得資料。在本文中,將介紹如何使用Ajax從PHP方法中取得變量,並提供具體的程式碼範例。首先,我們需要寫一個PHP檔案來處理Ajax請求,並傳回所需的變數。下面是一個簡單的PHP檔案getData.php的範例程式碼:

Python 語法的心智圖:深入理解程式碼結構 Python 語法的心智圖:深入理解程式碼結構 Feb 21, 2024 am 09:00 AM

python憑藉其簡單易讀的語法,廣泛應用於廣泛的領域。掌握Python語法的基礎架構至關重要,既可以提高程式效率,又能深入理解程式碼的運作方式。為此,本文提供了一個全面的心智圖,詳細闡述了Python語法的各個面向。變數和資料類型變數是Python中用於儲存資料的容器。心智圖展示了常見的Python資料類型,包括整數、浮點數、字串、布林值和列表。每個資料類型都有其自身的特性和操作方法。運算符運算符用於對資料類型執行各種操作。心智圖涵蓋了Python中的不同運算子類型,例如算術運算子、比

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

什麼是Java中的實例變數 什麼是Java中的實例變數 Feb 19, 2024 pm 07:55 PM

Java中的實例變數是指定義在類別中,而不是方法或建構子中的變數。實例變數也稱為成員變量,每個類別的實例都有自己的一份實例變數副本。實例變數在創建物件的過程中被初始化,以及在物件的生命週期中保存並保持其狀態。實例變數的定義通常放在類別的頂部,可以用任何存取修飾符來聲明,可以是public、private、protected或預設存取修飾符。這取決於我們希望這個變

開源模型首勝GPT-4!競技場最新戰報引熱議,Karpathy:這是我唯二信任的榜單 開源模型首勝GPT-4!競技場最新戰報引熱議,Karpathy:這是我唯二信任的榜單 Apr 10, 2024 pm 03:16 PM

能打得過GPT-4的開源模型出現了!大模型競技場最新戰報:1040億參數開源模型CommandR+攀升至第6位,與GPT-4-0314打成平手,超過了GPT-4-0613。圖片這也是第一個在大模型競技場上擊敗GPT-4的開放權重模型。大模型競技場,可是大神Karpathy口中唯二信任的測試基準之一。圖片CommandR+來自AI獨角獸Cohere。這家大模型新創公司的共同創辦人兼CEO,正是Transformer最年輕作者AidanGomez(簡稱割麥子)。圖片這份戰報一出,又掀起了一波大模型社

深入理解C語言中的const 深入理解C語言中的const Feb 18, 2024 pm 12:56 PM

C中const的詳解及程式碼範例在C語言中,const關鍵字用來定義常數,表示該變數的值在程式執行過程中不能被修改。 const關鍵字可以用來修飾變數、函數參數、函數傳回值。本文將對C語言中const關鍵字的使用進行詳細解析,並提供具體的程式碼範例。 const修飾變數當const用來修飾變數時,表示變數為唯讀變量,一旦賦值就無法再修改。例如:constint

See all articles