js函式傳參是按值傳遞還是按引用傳遞?

2021-08-28 01:17:40 字數 2441 閱讀 2059

基本型別、引用型別

閒扯完了,開始寫今天要總結的基礎知識。

基本型別: undefined、null、boolean、number、string五種 (簡單的資料段);

引用型別: object (由多個值構成)。

兩種型別在使用上的區別:

複製變數

這塊好理解,看乙個例子的對比就秒懂:

// 基本型別

var num1 = 5;

var num2 = num1;

num2 = 10;

console.log(num1 + ' | ' + num2); // 5 | 10

// 引用型別

var obj1 = new object();

obj1.num = 5;

var obj2 = obj1;

obj2.num = 10;

console.log(obj1.num + ' | ' + obj2.num); // 10 | 10

一句話,引用型別複製的是指標的指向。

傳遞引數

剛開始看書上,說的是「按值傳遞」。然後丟擲乙個例子:

function addten(num) 

var count = 20;

var result = addten(count);

console.log(count + ' | ' + result); // 20 | 30

看完這個例子,秒懂按值傳遞。緊接著又來一段**:

function setname(obj) 

var person = new object();

person.name = 'bbb';

var newperson = setname(person);

console.log(person.name + ' | ' + newperson.name); // aaa | aaa

看完這個例子,我就懵逼了。這段**不是解釋成按引用傳遞更合理嗎?

然後又給了乙個證明就算引數是引用型別也是按值傳遞的例子:

function setname(obj) 

var person = new object();

person.name = 'bbb';

var newperson = setname(person);

console.log(person.name + ' | ' + newperson.name); // aaa | ccc

從結果看,並沒有顯示兩個'ccc'。這裡是函式內部重寫了obj,重寫的obj是乙個區域性物件。當函式執行完後,立即被銷毀。

到這裡,js高程解釋完了按值傳遞和按引用傳遞。然而對於我這樣智商略平的同學而言,還是一臉懵逼。於是去網上深入地了解了下。

引用值:物件變數它裡面的值是這個物件在堆記憶體中的記憶體位址。因此如果按引用傳遞,它傳遞的值也就是這個記憶體位址。那麼var obj = new object();會重新給obj分配乙個位址,比如是0x321了,那麼它就不在指向有name = 'aaa';屬性的記憶體單元了。相當於把實參obj和形參obj的位址都改了,那麼最終就是輸出兩個ccc了。

最後看個例子,弄懂了也就差不多理解了。

# 作者資訊

var a = ;

var b = ;

function change(obj)

var result = change(a);

console.log(result + ' | ' + a.num); // 2 | 3

走一遍思路:

首先把a的值傳到change函式內,obj.num = '3';a.name被修改為3;

a的位址被換成b的位址;

返回此時的a中a.num

按共享傳遞

在網上還看到一種叫 按共享傳遞 的說法,而且特別好理解。

大致概念是這樣的:呼叫函式傳參時,函式接受物件實參引用的副本(既不是按值傳遞的物件副本,也不是按引用傳遞的隱式引用)。 它和按引用傳遞的不同在於:在共享傳遞中對函式形參的賦值,不會影響實參的值。

可以回過頭去看之前的例子,每個都符合用共享傳遞的概念去進行引數傳遞。關鍵是特別好理解,說的通俗點就是 先複製引數,然後把複製的這個放函式裡面去折騰。

例子就不展開了,看官可以自己套幾個demo。

對基本型別和引用型別的討論主要在 函式引數的傳遞方式這塊,希望對正在夯實js基礎的你有所幫助。

四 1 函式引數是按值傳遞還是按引用傳遞

基本型別在函式引數中肯定是按值傳遞,重點是引用型別按什麼傳遞?高程中給出的是不管是基本型別還是引用型別在函式引數中都是按值傳遞。但是出現了以下這種情況 function setname obj var person new object setname person alert person.nam...

js函式的傳參是按值傳對遞

科技優家 2016 11 22 16 01 根據js高階程式設計第三版編寫,對於函式的引數只能按值傳遞是這樣解釋的 ecmascript 中所有函式的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。基本型別值的傳遞如同基本型別變數的複製一樣,...

js函式的傳參是按值傳對遞

根據js高階程式設計第三版編寫,對於函式的引數只能按值傳遞是這樣解釋的 ecmascript 中所有函式的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。基本型別值的傳遞如同基本型別變數的複製一樣,而引用型別值的傳遞則如同引用型別變數的複製一...