js 函式引數為什麼是按值傳遞

2022-07-01 12:51:09 字數 1277 閱讀 1600

首先說下,在js中有兩大類資料型別: 基本型別和引用型別. 其次,基本型別有5種: undefined,null,boolean,number、string, 引用型別有一種: object(function 和 array都屬於物件,在js中,一切皆物件);

var a = 1;

var b =a;

b = 2;

console.log(a);

//1

分析以上**,初始化變數a為1,然後將a賦值給變數b,再將2賦值給變數b,變數a和變數b屬於簡單型別,儲存在桟中,分別存著1和2,相互之間沒有影響.

var a = [1,2,3];

var b =a;

b.push(4,5,6);

console.log(a);

//[1,2,3,4,5,6]

分析以上**,初始化變數a為[1,2,3],然後將a賦值給變數b,變數a和變數b屬於引用型別,儲存在堆中,他們存著相同的值(0x****),他們的值其實乙個指標位址(指向堆中存放的[1,2,3]),  然後將[4,5,6]新增到變數b,b所指的那個物件現在變為[1,2,3,4,5,6],因為a和b指向同乙個物件,因此a的值也為[1,2,3,4,5,6]

function

setname(obj)

var person=new

object();

setname(person);

alert(person.name);

//"nick"

書中給的例子是以上**.用反證法證明,假設person是按引用傳遞的引數,則在函式中name屬性已經被賦值「greg」,所以結果應該為greg才對.

正是因為person是按值傳遞,才出現以上結果.person傳進函式的是指向person物件的位址(0x****),將這個位址值賦值給形參obj(函式實參和形參都指向同乙個物件),obj.name="nick";執行完後形參和實參person所指的那個物件中的name屬性被修改為nick,此操作會影響到全域性的person,obj=new object();執行完後形參指向乙個新的堆記憶體位址,跟實參沒有任何關係了,也就跟全域性的person所指向的物件沒有任何關係了,obj.name="greg";將形參所指的區域性物件的name屬性修改為greg,此操作對全域性的person物件不會再有影響,形參所指向的物件在函式執行完被銷毀.全域性列印person.name為nick.

js 引數傳遞方式 按值傳遞

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

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

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

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

基本型別 引用型別 閒扯完了,開始寫今天要總結的基礎知識。基本型別 undefined null boolean number string五種 簡單的資料段 引用型別 object 由多個值構成 兩種型別在使用上的區別 複製變數 這塊好理解,看乙個例子的對比就秒懂 基本型別 var num1 5 ...