引用类型对象拷贝思考
2017-08-24 本文已影响0人
王翔爱摇滚乐爱电影爱心理学爱哲
1、引用类型有哪些?非引用类型有哪些
非引用类型 String 类型、Null 类型、Number 类型、Undefined类型、Boolean 类型
引用类型(Object、Array、Function、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象
2、
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
//false,由于obj1与obj2所储存的位置不同,所以false。
console.log(obj1 = obj2);
//obj2赋值给obj1 输出 Object { a=1, b=2} 内容。
console.log(obj1 == obj2);
//把obj2赋值给obj1,所以obj2与obj1存储的位置是一样的,所以为true。
3、
var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 }
var d = [a, b, c]
var aa = a
var bb = b
var cc = c
var dd = d
a = 11
b = 22
c.name = 'hello'
d[2]['age'] = 3
console.log(aa)
//输出 1,因为 var aa = a
console.log(bb)
//输出 2 都是值传递,aa、a、bb、b都会开辟一个块属于自己的栈空间
console.log(cc)
//{name:'hello',age:3} 对象的赋值是引用传递,cc和c都是指向同一块堆内存。
console.log(dd)
//[1,2,{name:'hello',age:3}] 数组的赋值也是引用传递
4、
var a = 1
var c = { name: 'jirengu', age: 2 }
function f1(n){
++n
}
function f2(obj){
++obj.age
}
f1(a)
//a = 1 ,会默认执行赋值动作,var n = a,属于值传递,++n时,a依旧保持原始值不变的。
f2(c)
//c = {name:'jirengu',age:3}
//会默认执行var obj = c
//这时候它们都是指向同一块堆内存,当执行++obj.age时,对象c的age属性加一
f1(c.age)
//取出c.age = 3 默认执行var n = 3.不会影响c.age
console.log(a)
//1
console.log(c)
//{name:'jirengu',age:3}
5、过滤如下数组,只保留正数,直接在原数组上操作
var arr = [3,1,0,-1,-3,2,-5];
function filter(arr) {
for(var i=0;i<arr.length;i++){
if(arr[i]<=0){
arr.splice(i,1); //意义就是,第几位小于0 就删除这个数
filter(arr);
}
}
}
filter(arr);
console.log(arr);//[3, 1, 2]
6、过滤如下数组,只保留正数,原数组不变,生成新数组
var arr = [3,1,0,-1,-3,2,-5]
function filter(array){
return array.filter(function (argument) {
return argument > 0
})
}
var arr2 = filter(arr)
console.log(arr2)//[3, 1, 2]
console.log(arr)//[3, 1, 0, -1, -3, 2, -5]