引用类型对象拷贝思考

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]
上一篇下一篇

猜你喜欢

热点阅读