如:
var a = [1,2,3,4];
var b= [];
b = a;
這個不是把值賦值過去而是b作為a的引用,b改變的是a
如何b指向的是一個新數組,a把元素值全部賦值過去?
1、普通數組可以使用 var b = [].concat(a);
-----------------------------------------------------------------------------------------------------
2、我遇到一個jquery對象類型的數組是[Object(Array)]類型,其拼接的數組字符串為:
[{
name: 'Berlin-new',
type: 'column',
id: 'berlin',
data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
},{
name: 'Tokyo-new',
type: 'spline',
data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
}]
想將array賦給array2,然后將array2中的data截取一部分,返回array2
var array2= [].concat(array);
$.each(array2, function (i, obj) {
var data = obj.data;
obj.data = data.slice(data.length - num, data.length);
});
這樣截取成功,但仍然影響array本身的data;
采用 var arr = $.makeArray( obj );后仍不起作用;
最后用循環創建新數組解決
var result = [];
$.each(array, function (i, obj) {
var c = {};
$.each(obj, function (key, val) {
if (key == 'data') {
c[key] = val.slice(val.length - num, val.length);
} else {
c[key]=val;
}
}) ;
result.push(c);
});
一、push與concat
push的定義是:像數組末尾添加一個或更多元素,並返回新的長度。該方法會改變數組的長度。
concat的定義是:連接兩個或更多的數組,並返回結果,該方法不會改變現有數組,而僅僅會返回數組的一個副本。
- var a = [1,2];
- a.push([3,4]);
- a.concat(5);
- //a為1 2 3,4 5
var a = [1,2]; a.push([3,4]); a.concat(5); //a為1 2 3,4 5
二、深拷貝與淺拷貝
1.淺拷貝
JavaScript存儲對象都是存地址的,所以淺復制會導致 a 和 b 指向同一塊內存地址
數組的賦值其實相當於給了索引,改變其中一個變量其他引用都會改變
- var a = [1,2,3];
- var b = a;
- b[0] = 4;
- //a為4 2 3
- //b為4 2 3
var a = [1,2,3]; var b = a; b[0] = 4; //a為4 2 3 //b為4 2 3
根據上面存儲對象的問題,這里就可以解決另一個問題:
原始參數(比如一個具體的數字)被作為值傳遞給函數;值被傳遞給函數,如果被調用函數改變了這個參數的值,這樣的改變不會影響到全局或調用函數。
你傳遞一個對象(在js里數組不是簡單數據類型,而是對象)到一個函數,如果在函數里面改變了這個參數的內容,在外部這個變化是可見的。
2.深拷貝
(1)slice 函數
(2)concat 函數
(3)assgin
三個函數的原理都是返回數組的一個副本(相當於另外開辟內存空間),所以並不會改變數組本身的的值
但是這里有一點不同,就是assgin與其他兩點的不同
雖然說assgin也是深拷貝,但是他只是第一層深拷貝,第二層之后還是進行淺拷貝,例子如下:
- var a = {
- a1:{
- aa1:'11',
- aa2:'22'
- }
- }
- var b = object.assgin({},a);
- var c = object.assgin({},a);
- b.a1.aa1 = 33;
- /*
- b:{
- a1:{
- aa1:'33',
- aa2:'22'
- }
- }
- c:{
- a1:{
- aa1:'33',
- aa2:'22'
- }
- }
- */
var a = {
a1:{
aa1:'11',
aa2:'22'
}
}
var b = object.assgin({},a);
var c = object.assgin({},a);
b.a1.aa1 = 33;
/*
b:{
a1:{
aa1:'33',
aa2:'22'
}
}
c:{
a1:{
aa1:'33',
aa2:'22'
}
}
*/
