数据内存的储存
基本数据类型存储在栈内存中
变量存储的就是值(var a = 2 ;var b = a ;)
给b赋予了a的值,之后b变化不会影响a;
引用数据类型存储在堆内存中
变量存储的是地址(var arr = [1,2,3] ;var arr2 = arr ;)
给b赋予了a储存值的地址,之后b的地址中的内容变化会影响a;
数组的深复制/浅复制
数组的浅复制:只复制了地址 (共享地址)
数组的深复制:复制值
数组的深复制可以通过以下两种方式实现:
遍历(把原数组中的值存入新的数组) var arr2 = [] ;
slice() 截取数组中的所有值,得到的是一个新数组
var arr = [1,2,3,4,5] ;
// 数组的浅复制 --- 只是复制了地址
//
var arr2 = arr ;
// 数组的深复制 --- 复制数组中的值
// 开了新的房间 609
var arr3 = arr.slice() ;
console.log(arr3);
arr3.push('a') ;
console.log(arr);
//改变同一地址时arr4和arr5都会改变
var arr4 = [1,2,3] ;
var arr5 = ['a' , 'b'] ;
arr4 = arr5 ;
console.log(arr4);
arr5.push('c') ;
console.log(arr4);
arr4.push(1) ;
console.log(arr5);
函数传参时
基本数据类型传递是值
引用数据类型传递的是地址(形参和实参共享地址)
因此在封装函数的时候,
如果想改变原数组,就直接操作形参
如果不想改变原数组,就实现深复制,然后操作新的数组
var a = 1 ;
function fn(n) {
// n = a ;
n++ ;
}
fn(a) ; // 普通数据类型只是传递了值过去
console.log(a);
var arr = [1,2,3] ;
function fn2(arr2) {
// arr2 = arr
arr2.push('a')
}
fn2(arr) ;
console.log(arr);
function pop(arr) {
// arr = arr3 ; // 608
var newArr = [] ; // 609
for(var i = 0 ; i < arr.length - 1 ; i++) {
newArr.push(arr[i])
}
// arr = newArr ; // arr 609
return newArr
}
var arr3 = [6,7,4,2,9,1] ; // 608
var res = pop(arr3) ;
console.log(res);
console.log(arr3);
arr3 = res ;