JS 中沒有按地址(引用)傳遞,只有按值傳遞

來源:互聯網
上載者:User

很多人,包括我,受書本知識消化不徹底的影響,認為 JS 中參數有兩種傳遞方式:數字、字串等按值傳遞;數組、對象等按地址(引用)傳遞。對此種觀點,我們要謹慎。

var
v1 = []
var
v2 = {};
var
v3 = {};
function
foo(v1, v2, v3)
{
    v1 = [1];
    v2 = [2];
    v3 = {a:3}
}

foo(v1, v2, v3);
alert
(v1); // 空白

alert
(v2); // [object Object]

alert
(v3.a); // undefined

由此可見:v1、v2、v3 都沒有被改變,v1 仍然是零個元素的數組,v2、v3 仍然是空白的對象。

但是,數組、對象等按值傳遞,是指變數地址的值。

數組、對象等的按值傳遞與數字、字串還是有所不同的。數字、字串是把值直接複製進去了,而數組、對象是把變數地址複製進去的。

前面我們讓 v1、v2、v3 作為參數進入函數後,就有了地址副本,這些地址副本的指向和外面的 v1、v2、v3
的地址指向是相同的。但我們為 v1、v2、v3 賦了值,也就是說我們把地址副本的指向改變了,指向了新的數組和對象。這樣內部的 v1、v2、v3
和外部的 v1、v2、v3 就完全斷了。

如果我們不賦新值,而是直接操作它,那麼,它操作到的,仍然是和外面的 v1、v2、v3 指向的同一塊數組或對象。

var
v1 = []
var
v2 = {};
var
v3 = {a:0};
function
foo(v1, v2, v3)
{
    v1.push
(1);
    v2.a = 2;
    v3.a = 3;
}

foo(v1, v2, v3);
alert
(v1); // 1

alert
(v2.a); // 2

alert
(v3.a); // 3

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.