陣列賦值和傳遞(從網上看到的幾種情況)

2021-07-28 03:25:21 字數 1563 閱讀 6409

關於陣列是引用型別

情況一:改變原陣列,被賦值的陣列是否改變

var a = [1,2,3];

var b = a;

a = [4,5,6];//給了a新引用

alert(b); //[1,2,3] //b的引用是最初的a的位址,所以b沒有改變

var a = [1,2,3];

var b = a;

a.pop();//改變了a的陣列位址,所以b引用的是a,則b隨之改變

alert(b); //[1,2]

情況二:傳值與傳址

js中沒有指標,只有傳值(value)與傳址(reference引用)的區別

var a = [1,2,3,4] //a不僅是陣列,還是個物件,實際上a就是對[1,2,3,4]的引用

var b=a 

var c=a

//以上兩條賦值語句建立了b與c 對a即[1,2,3,4]的引用.

//無論改變a 還是b抑或c 都是對[1,2,3,4]的操作,這就是傳址(堆中操作)

// !!!但這裡說的對a,b的改變是指對陣列本身的改變,即改變b[0],a[0]也會變。 不是指對a,b覆蓋新引用的改變,如a=[5,6,7,8]。

var d=a[1] //則是把a[1]的值"1"傳遞給d,對d的改變則不會影響a[1],即所謂的傳值(棧中操作)

例子:

var a=[1,2,3,4];

//例子1

var b=a;

alert(a); //1234

alert(b); //1234

//例子2

var c=a;

c[3]=5;

alert(c); //1235

alert(a); //1235

//例子3

var d=a[1];

d=10;

alert(a); //1234

情況三:在函式中對陣列用新引用覆蓋,對外部不可見,但對陣列物件本身修改外部可見

//傳值的傳遞:傳給函式的是數值的乙個複製,函式中對其的修改外部不可見

var a = 1;

var b = 2;

function change(a,b)

change(a,b);

alert(a); //"1"

alert(b); //"2"

//傳址的傳遞:傳給函式的是數值的乙個引用,函式中對其屬性的修改外部可見,但用新引用覆蓋其則在外部不可見,比如

var a = [1, 2, 3];

var b = [5, 6];

function change(a,b)

change(a,b);

alert(a); //"4,2,3"

alert(b); //"5,6"

//從結果可以看出a和b並沒有互換 因為用新引用覆蓋在外部不可見 這個很自然 因為函式只是拿到了引用 並沒有權力更改引用

CLR via C 陣列 陣列的傳遞和返回

陣列作為實參傳給方法時,實際傳遞的是對該陣列的引用。因此,被呼叫的方法能修改陣列中的元素。如果不想被修改,必須生成陣列的拷貝並將拷貝傳給方法。注意,array.copy方法執行的是淺拷貝。換言之,如果陣列元素是引用型別,新陣列將引用先有的物件。類似的,有的方法會返回陣列的引用。如果方法構造並初始化陣...

c mat賦值 Mat 的幾種初始化和賦值方法

這幾天用到了由cv point3f和std vector到cv mat資料型別的轉換。本質上就是換一下容器。今晚做個小總結。由point3f 到 mat 有兩種方法,一種使用cv mat point3f 另一種是在宣告時使用 初始化。注意 第一種方法得到的mat的資料型別的通道數不為1,需要使用re...

python陣列的賦值和拷貝

直接看demo numpy 有 copy 函式,list沒有,需匯入copy庫 a np.array 1,2,3 b np.array 4,5,6 a b all 比較兩個陣列元素是否都相等,可以用於k means false c a a c all true c 0 10 等號這種賦值相當物件引用...