js引數傳遞方式

2021-09-01 06:19:42 字數 2160 閱讀 3138

是最常用的求值策略:函式的形參是被呼叫時所傳實參的副本。修改形參的值並不會影響實參。

函式的形參接收實參的隱式引用,而不再是副本。這意味著函式形參的值如果被修改,實參也會被修改。同時兩者指向相同的值。

按引用傳遞會使函式呼叫的追蹤更加困難,有時也會引起一些微妙的bug。

按值傳遞由於每次都需要轉殖副本,對一些複雜型別,效能較低。兩種傳值方式都有各自的問題

在紅寶書中有這樣一段

在書裡舉的這個例子裡,它傳遞的的確是引用,但實際上他應用的策略卻是 call by sharing,通俗的說就是,它並不是把引用直接傳遞進去,而是把引用的拷貝傳遞進去儲存在函式內部的ao物件裡。因此,對這個引用進行第二次賦值的時候,實際上把這份引用指向了另外乙個物件,所以之後對這個物件的操作不會影響到外部的物件

js中所有的引數傳遞都是傳遞值,不是傳遞引用,基本型別很好理解,那麼物件型別呢.

var obj = ;

function foo(o)

foo(obj);

console.log(obj.x); //1

可以看到,obj的值並沒有改變,所以不是按照引用傳遞,

那麼這種傳遞方式究竟是什麼呢?

###按共享傳遞 call by sharing

如果大多數開發人員所討論的前兩種策略都是眾所周知的,那麼下面的策略(更確切地說是它的討論術語)並未被廣泛使用。然而,正如我們很快就會看到的那樣,它在ecmascript中傳遞引數策略方面起著關鍵作用。

這種策略的替代名稱是「按物件傳遞」或「通過物件共享傳遞」。

「共享」策略是在2023年由barbara liskov首先提出的,用於clu程式語言。

該策略的重點是:呼叫函式傳參時,函式接受物件實參引用的副本(既不是按值傳遞的物件副本,也不是按引用傳遞的隱式引用)。 它和按引用傳遞的不同在於:在共享傳遞中對函式形參的賦值,不會影響實參的值。如上面的例子中,不可以通過修改形參o的值,來修改obj的值

然而,雖然引用是副本,引用的物件是相同的。它們共享相同的物件,所以修改形參物件的屬性值,也會影響到實參的屬性值。

var obj = ;

function foo(o)

foo(obj);

console.log(obj.x); // 3, 被修改了!

對於物件型別,由於物件是可變(mutable)的,修改物件本身會影響到共享這個物件的引用和引用副本。而對於基本型別,由於它們都是不可變的(immutable),按共享傳遞與按值傳遞(call by value)沒有任何區別,所以說js基本型別既符合按值傳遞,也符合按共享傳遞。

var a = 1; // 1是number型別,不可變 var b = a; b = 6;

據按共享傳遞的求值策略,a和b是兩個不同的引用(b是a的引用副本),但引用相同的值。由於這裡的基本型別數字1不可變,所以這裡說按值傳遞、按共享傳遞沒有任何區別。

###基本型別的不可變(immutable)性質

基本型別是不可變的(immutable),只有物件是可變的(mutable). 例如數字值100, 布林值true, false,修改這些值(例如把1變成3, 把true變成100)並沒有什麼意義。比較容易誤解的,是js中的string。有時我們會嘗試「改變」字串的內容,但在js中,任何看似對string值的」修改」操作,實際都建立新的string值。

var str = "abc";

str[0]; // "a"

str[0] = "d";

str; // 仍然是"abc";賦值是無效的。沒有任何辦法修改字串的內容

而物件就不一樣了,物件是可變的。

var obj = ;

obj.x = 100;

var o = obj;

o.x = 1;

obj.x; // 1, 被修改

o = true;

obj.x; // 1, 不會因o = true改變

這裡定義變數obj,值是object,然後設定obj.x屬性的值為100。而後定義另乙個變數o,值仍然是這個object物件,此時obj和o兩個變數的值指向同乙個物件(共享同乙個物件的引用)。所以修改物件的內容,對obj和o都有影響。但物件並非按引用傳遞,通過o = true修改了o的值,不會影響obj。

js 引數傳遞方式 按值傳遞

訪問變數有按值和按引用兩種方式,基礎資料型別按值訪問,引用資料型別按引用 即指標或位址 訪問。但引數只能按值傳遞,在向引數傳遞基本型別的值時,被傳遞的值會被複製給命名引數,引用型別時,傳遞的是它指標內儲存的值 借用網上的乙個例子 function setname obj var person new...

引數傳遞方式

1 pass by value 單向傳遞 形參改變 實參不變 2 pass by address pointer 雙向傳遞 形參改變 實參改變 3 pass by reference 雙向傳遞 形參改變 實參改變 c pass by value 單向傳遞 形參改變 實參不變 void swap1 i...

js中函式的引數傳遞方式

js中函式的引數傳遞方式 ecmascript中所有函式的引數都是按值傳遞的。也就是說,把函式外部的值複製給函式內部的引數,就和把值從乙個變數複製到另乙個變數一樣。向引數傳遞基本型別值 傳遞乙個基本型別值時,被傳遞的值會被復給乙個區域性變數 arguments中的乙個元素 function add ...