摘要:學(xué)習(xí)中函數(shù)參數(shù)值傳遞和引用傳遞的學(xué)習(xí)中函數(shù)參數(shù)值傳遞和引用傳遞在紅寶書中說到,中所有函數(shù)的參數(shù)都是按值傳遞的。
學(xué)習(xí)JS中函數(shù)參數(shù)值傳遞和引用傳遞的學(xué)習(xí) JS中函數(shù)參數(shù)值傳遞和引用傳遞
在JavaScript紅寶書中說到,“ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的”。理解這個(gè)概念先要從JS的堆內(nèi)存和棧內(nèi)存說起:棧內(nèi)存為自動(dòng)分配的內(nèi)存空間,它由系統(tǒng)自動(dòng)釋放;堆內(nèi)存則是動(dòng)態(tài)分配的內(nèi)存,大小不定也不會(huì)自動(dòng)釋放。(很初級(jí)的理解,有錯(cuò)誤還望指正)
JS中的5種基本數(shù)據(jù)類型Undefined、Null、Boolean、Number 和 String,它們是直接按值存放在棧內(nèi)存中,可以直接訪問。引用類型的值是保存在堆內(nèi)存中的對(duì)象。與其他語(yǔ)言不同,JavaScript不允許直接訪問堆內(nèi)存中的位置, 也就是說不能直接操作堆內(nèi)存中的對(duì)象。 在操作對(duì)象時(shí), 實(shí)際上是在操作對(duì)象的引用(也可理解為指針)而不是實(shí)際的對(duì)象。” 這個(gè)堆內(nèi)存中對(duì)象的引用(指針)存儲(chǔ)在棧內(nèi)存中。你只能操作棧內(nèi)存中的數(shù)據(jù)。即基礎(chǔ)類型數(shù)據(jù)和堆內(nèi)存中對(duì)象的指針兩大類
對(duì)于基本數(shù)據(jù)類型的復(fù)制就相當(dāng)于你和小明買了一輛一樣的單車,你對(duì)自己?jiǎn)诬嚨牟僮鞑粫?huì)影響到小明的單車。
而對(duì)于引用類型的復(fù)制,相當(dāng)于你和小明共用一個(gè)客廳,你對(duì)這個(gè)客廳做的操作是會(huì)影響到小明的客廳(即你們共用的客廳)
如下圖:
//測(cè)試代碼: //基本類型: var a = 10; var b = a; b = 12; alert(a);//10 alert(b);//12 //引用類型: var a = new Object(); a.name = "Tony"; alert(a.name);//"Tony" var b = a; b.name = "Tom" alert(a.name);//"Tom"參數(shù)的傳遞
繼續(xù)說參數(shù)的傳遞,無論參數(shù)是什么類型,都是按值傳遞的,普通類型傳遞的是本身的值,引用類型傳遞的是自己在棧內(nèi)存中的“指針”值。
function setName(obj) { obj.name = "Nicholas"; } var person = new Object(); setName(person); alert(person.name); // "Nicholas"
實(shí)際過程如下圖
...]
//而有一個(gè)容易引起誤導(dǎo)的點(diǎn)在于下面這個(gè)變化 function setName(obj) { obj.name = "Nicholas"; obj = new Object(); //改變obj的指向,此時(shí)obj指向一個(gè)新的內(nèi)存地址,不再和person指向同一個(gè) obj.name = "Greg"; } var person = new Object(); setName(person); alert(person.name); //"Nicholas" //這里只要理解,你不能直接操作堆內(nèi)存中的對(duì)象,你只能通過棧內(nèi)存中的指針進(jìn)行操作。
這個(gè)函數(shù)的過程如下圖:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/88871.html
這幾天遇到j(luò)s參數(shù)傳遞方式的問題,深切探究一番,將所得結(jié)果總結(jié)于此 常見的幾種傳遞方式 傳值調(diào)用(call by value) 在傳值調(diào)用中實(shí)際參數(shù)被求值,其值被綁定到函數(shù)中對(duì)應(yīng)的變量上(通常是把值復(fù)制到新內(nèi)存區(qū)域)。在函數(shù)返回后調(diào)用者作用域里的曾傳給函數(shù)的任何東西都不會(huì)變。 傳引用調(diào)用(call by reference) 在傳引用調(diào)用求值中,傳遞給函數(shù)的是它的實(shí)際參數(shù)的隱式引用(即實(shí)際參數(shù)的地...
摘要:中所有函數(shù)的參數(shù)都是按值傳遞的。基本類型本身是按值傳遞,具有不可變性,對(duì)基本類型的修改,實(shí)質(zhì)上都是在棧內(nèi)存中創(chuàng)建了新的值。中把這種拷貝也認(rèn)為是按值傳遞。 本文共 1200 字,讀完只需 5 分鐘 概述 參數(shù)的傳遞分為按值傳遞和按引用傳遞,而 JavaScript 中參數(shù)的傳遞只有按值傳遞。 ECMAScript 中所有函數(shù)的參數(shù)都是按值傳遞的。 所謂按值傳遞就是: 把函數(shù)外部的值復(fù)制給...
摘要:基本類型和引用類型用操作符定義的變量將成為作用域中的局部變量。在向參數(shù)傳遞基本類型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量即命名參數(shù)。結(jié)果依舊是在調(diào)用函數(shù)初時(shí),與引用的是同一對(duì)象,所以首次的屬性賦值會(huì)對(duì)有所影響。 函數(shù) 參數(shù) 1.js函數(shù)不介意傳遞進(jìn)來多少個(gè)參數(shù),也不在乎傳遞進(jìn)來參數(shù)是什么類型。2.arguments對(duì)象:類數(shù)組 arguments對(duì)象的長(zhǎng)度是由傳入的參數(shù)個(gè)數(shù)決定的,...
摘要:基本類型和引用類型用操作符定義的變量將成為作用域中的局部變量。在向參數(shù)傳遞基本類型的值時(shí),被傳遞的值會(huì)被復(fù)制給一個(gè)局部變量即命名參數(shù)。結(jié)果依舊是在調(diào)用函數(shù)初時(shí),與引用的是同一對(duì)象,所以首次的屬性賦值會(huì)對(duì)有所影響。 函數(shù) 參數(shù) 1.js函數(shù)不介意傳遞進(jìn)來多少個(gè)參數(shù),也不在乎傳遞進(jìn)來參數(shù)是什么類型。2.arguments對(duì)象:類數(shù)組 arguments對(duì)象的長(zhǎng)度是由傳入的參數(shù)個(gè)數(shù)決定的,...
摘要:它對(duì)數(shù)組和對(duì)象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。例如在這里,變量和值在執(zhí)行期間存儲(chǔ)在堆棧中。返回值這是可選的,函數(shù)可以返回值,也可以不返回值。變量被推入堆棧,從而在執(zhí)行時(shí)成為的副本。 這是專門探索 JavaScript 及其所構(gòu)建的組件的系列文章的第 22 篇。 想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你! 如果你錯(cuò)過了前面的章節(jié),可...
閱讀 1445·2021-09-03 10:29
閱讀 3469·2019-08-29 16:24
閱讀 2034·2019-08-29 11:03
閱讀 1422·2019-08-26 13:52
閱讀 2934·2019-08-26 11:36
閱讀 2797·2019-08-23 17:19
閱讀 569·2019-08-23 17:14
閱讀 818·2019-08-23 13:59