js中储存对象都是存引用地址,所以浅拷贝会导致两个变量指向同一块内存地址。数组的赋值其实相当于给了索引,改变其中一个变量其他的引用其他都会改变。如下为浅拷贝
// var a = [1,2,3]
// var b = a //此步不是赋值,而是将a的引用赋给b,所以改变b也会改变a
// b[0]=4
// a为[4,2,3]
// b为[4,2,3]
总的来说 :原始参数(比如一个具体的数字)被作为值传递给函数,如果被调用函数改变了这个参数的值,这样的改变不会影响到全局或调用函数。但当你传递一个对象(js里数组也是对象)到一个函数,如果在函数里面改变了这个参数的内容,那么这个改变在外部是可见的,也就是会影响到全局。
深拷贝数组的方法:
(1)slice函数,newArr = arr.slice(0)
(2)concat函数,newArr = [].concat(arr,arr2,...)
(3)assign函数(对象),newObj = object.assign({},obj)
但以上三种方式都是对对象第一层的深拷贝,第二层之后还是浅拷贝,要实现多维数组的深拷贝可以用:
newArr = JSON.parse(JSON.stringify(arr))
数值变量:
[1,2,3]
逻辑值变量:
[true,true,false]
字符变量:
["a","b","c"]
总结:
那句话的意思是:数值变量或逻辑变量数组别放字符串。
就是一句废话,不用琢磨。
将小数组的值循环赋值给大数组,如果大数组未满,继续循环赋值。或者直接一个循环(大数组的长度作为循环限制)赋值到小数组完,重置小数组的index为0,直到大数组全部赋值完。
【相关拓展】
第一种用for循环:
1
2
3
4
int[] x={1,2}
int[] y=new int[2]
for(int i=0i<x.lengthi++){
y[i]=x[i]
第二种用java提供的arraycopy
1
2
3
int[] x={1,2}
int[] y=new int[2]
System.arraycopy(x, 0, y, 0, x.length)//变量依次是(原数组,从原数组第几位开始,目标数组,从第几位开始粘贴,复制长度)