亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

js中函數(shù)參數(shù)值傳遞的理解

馬永翠 / 2674人閱讀

摘要:中參數(shù)傳遞為什么必定是按值傳遞,有些疑惑,以下是一些理解。指兩個(gè)變量是兩個(gè)獨(dú)立的變量,唯獨(dú)在于他們各自的對(duì)象都是在同一個(gè)堆內(nèi)存空間的。就是實(shí)際上沒(méi)有把堆內(nèi)存中的對(duì)象作為函數(shù)參數(shù)。

js中參數(shù)傳遞為什么必定是按值傳遞,有些疑惑,以下是一些理解。

js高級(jí)程序設(shè)計(jì)(第三版)的第四章,表明了基本數(shù)據(jù)類(lèi)型(Undefined、Null、Boolean、Number、String)是按值訪問(wèn)的,對(duì)象是按引用訪問(wèn)的。

首先,看下引用類(lèi)型變量是怎樣的(obj1、obj2都是對(duì)象類(lèi)型):

var obj1 = new Object();
var obj2 = obj1;

簡(jiǎn)單來(lái)說(shuō),obj1、obj2都是變量,他們分別有一個(gè)指針,各自指向各自的棧內(nèi)存,然后棧內(nèi)存中存放有堆內(nèi)存地址和一些別的數(shù)據(jù),那么就又有第二個(gè)指針根據(jù)棧內(nèi)存中存放的地址指向堆內(nèi)存,堆內(nèi)存中存放的是同一個(gè)的對(duì)象(因?yàn)閛bj1和obj2棧內(nèi)存中的地址是相同的)。

注意到書(shū)中原話:

當(dāng)從一個(gè)變量向另一個(gè)變量復(fù)制引用類(lèi)型的值時(shí),同樣也會(huì)將存儲(chǔ)在變量對(duì)象中的值復(fù)制一份放到為新變量分配的空間中。不同的是,這個(gè)值的副本實(shí)際上是一個(gè)指針,而這個(gè)指針指向存儲(chǔ)在堆中的一個(gè)對(duì)象。復(fù)制操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象。因此,改變其中一個(gè)變量,就會(huì)影響另一個(gè)變量。

然后,實(shí)驗(yàn)代碼如下:

var t1 = new Object();
var t2 = t1;
t2.name ="t1";
t2 = new Object();      //本質(zhì)為t2的指針指向了一個(gè)新空間
console.log(t1.name);   //輸出t1
console.log(t2.name);   //輸出undefined

分析:

 var t2 = t1;

這行代碼實(shí)質(zhì)是把t1棧內(nèi)存中的數(shù)據(jù)復(fù)制在t2的棧內(nèi)存中,棧內(nèi)存中存放的堆內(nèi)存地址就是一樣的,因而指向了同一個(gè)堆內(nèi)存地址,即指向同一個(gè)對(duì)象。

t2 = new Object();

這行代碼就是把t2在棧內(nèi)存中存放的地址改變了,變成了一個(gè)此刻不在使用的地址,然后t2的指針指向了這個(gè)新地址,所以之后t1和t2無(wú)關(guān)了。

可以看出,書(shū)中寫(xiě)的 復(fù)制操作結(jié)束后,兩個(gè)變量實(shí)際上將引用同一個(gè)對(duì)象。 指兩個(gè)變量是兩個(gè)獨(dú)立的變量,唯獨(dú)在于他們各自的對(duì)象都是在同一個(gè)堆內(nèi)存空間的。我通俗理解為:t1和t2兩個(gè)變量本身是按值訪問(wèn)的,t1和t2指向的對(duì)象是按引用訪問(wèn)的,但實(shí)際上定義變量,自然是為了操作變量指向的對(duì)象。

下面是對(duì)于函數(shù)參數(shù)傳遞中的一些理解:

先看一下,讓人誤以為參數(shù)是引用傳遞的代碼:

var t1 = new Object();
function change(obj){
    obj.name = "lalala";
}
change(t1);
console.log(t1.name);  //輸出了lalala

結(jié)果是外部的t1多了一個(gè)屬性name,原因就在于確實(shí)是參數(shù)傳遞,把t1按值傳遞給了obj,操作他們各自屬性的時(shí)候,屬性仍然是按引用傳遞的,我們傳的參數(shù)又不是t1的屬性。

強(qiáng)調(diào)一下,我上面說(shuō)t1的屬性,是不正確的說(shuō)法,嚴(yán)格來(lái)說(shuō),不是t1多了一個(gè)屬性,也不是t1的屬性,而是t1指向的對(duì)象多了一個(gè)屬性,或者說(shuō)那是t1指向的對(duì)象的屬性,t1只是一個(gè)變量罷了。

再看下面代碼:

var t1 = new Object();
function change(obj){
    obj.name = "t1";
    obj = new Object();
    obj.name = "new t1";
}
change(t1);
console.log(t1.name); //輸出t1

輸出結(jié)果,t1.name仍然是‘‘t1’’,再進(jìn)行obj = new Object()時(shí)候,因?yàn)闂?nèi)存中數(shù)據(jù)的改變,這里的obj最終指向的對(duì)象不是t1指向的對(duì)象了,就函數(shù)內(nèi)部再也操作不到t1一開(kāi)始指向的對(duì)象了,類(lèi)似于下面代碼中t2的重新聲明。

var t1 = new Object();
var t2 = t1;
t2.name ="t1";
t2 = new Object();
console.log(t1.name);  //輸出t1
console.log(t2.name);  //輸出undefined

結(jié)論:函數(shù)的參數(shù)傳遞是按值傳遞的,但對(duì)于參數(shù)是引用類(lèi)型變量,該變量指向的對(duì)象的屬性(就是t1.name之類(lèi)的)是按引用訪問(wèn)的,因此改變對(duì)象的屬性會(huì)反映在外部對(duì)象上;但變量本身按值傳遞了,因此改變內(nèi)部變量(就只改變t1、t2),外部變量不會(huì)有改變。就是實(shí)際上沒(méi)有把堆內(nèi)存中的對(duì)象作為函數(shù)參數(shù)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/93204.html

相關(guān)文章

  • JS函數(shù)參數(shù)傳遞和引用傳遞

    摘要:學(xué)習(xí)中函數(shù)參數(shù)值傳遞和引用傳遞的學(xué)習(xí)中函數(shù)參數(shù)值傳遞和引用傳遞在紅寶書(shū)中說(shuō)到,中所有函數(shù)的參數(shù)都是按值傳遞的。 學(xué)習(xí)JS中函數(shù)參數(shù)值傳遞和引用傳遞的學(xué)習(xí) JS中函數(shù)參數(shù)值傳遞和引用傳遞 在JavaScript紅寶書(shū)中說(shuō)到,ECMAScript中所有函數(shù)的參數(shù)都是按值傳遞的。理解這個(gè)概念先要從JS的堆內(nèi)存和棧內(nèi)存說(shuō)起:棧內(nèi)存為自動(dòng)分配的內(nèi)存空間,它由系統(tǒng)自動(dòng)釋放;堆內(nèi)存則是動(dòng)態(tài)分配的內(nèi)存...

    ZHAO_ 評(píng)論0 收藏0
  • JS程序

    摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開(kāi)始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...

    melody_lql 評(píng)論0 收藏0
  • 理解JavaScript變量和類(lèi)型

    摘要:接著下一個(gè)例子賦予副本新的地址可見(jiàn),函數(shù)參數(shù)傳遞的并不是變量的引用,而是變量拷貝的副本,當(dāng)變量是原始類(lèi)型時(shí),這個(gè)副本就是值本身,當(dāng)變量是引用類(lèi)型是,這個(gè)副本是指向堆內(nèi)存的地址。 轉(zhuǎn)載自ConardLi: 《【JS進(jìn)階】 你真的掌握變量和類(lèi)型了嗎》 公眾號(hào): code秘密花園 1. JavaScript數(shù)據(jù)類(lèi)型 ECMAScript標(biāo)準(zhǔn)規(guī)定了7種數(shù)據(jù)類(lèi)型,這些數(shù)據(jù)類(lèi)型分為原始類(lèi)型和對(duì)象...

    xiaodao 評(píng)論0 收藏0
  • JavaScript參數(shù)傳遞方式

    這幾天遇到j(luò)s參數(shù)傳遞方式的問(wèn)題,深切探究一番,將所得結(jié)果總結(jié)于此 常見(jiàn)的幾種傳遞方式 傳值調(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ù)的地...

    jcc 評(píng)論0 收藏0
  • js類(lèi)型、引用類(lèi)型、堆、棧、函數(shù)參數(shù)傳遞方式、連續(xù)賦等概念學(xué)習(xí)

    摘要:值類(lèi)型基本類(lèi)型和棧內(nèi)存值類(lèi)型也稱(chēng)為原始數(shù)據(jù)或原始值這類(lèi)值存儲(chǔ)在棧內(nèi)存中基本類(lèi)型的值不可以修改。目前中的基本類(lèi)型一共有六種。堆的使用規(guī)則當(dāng)創(chuàng)建數(shù)組時(shí),就會(huì)在堆內(nèi)存中創(chuàng)建一個(gè)數(shù)組對(duì)象,并且在棧內(nèi)存中創(chuàng)建一個(gè)對(duì)數(shù)組的引用。 值類(lèi)型(基本類(lèi)型)和棧內(nèi)存 值類(lèi)型也稱(chēng)為原始數(shù)據(jù)或原始值(primitive value).這類(lèi)值存儲(chǔ)在棧(stack)內(nèi)存中, 基本類(lèi)型的值不可以修改。每當(dāng)我們定義一個(gè)...

    hizengzeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<