引用类型对象拷贝

1.引用类型有哪些?非引用类型有哪些

  • 基本类型值(undefined,null,Boolean,String,Number,Symbol):指的是保存在栈内存中的简单数据段;
  • 引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

2.如下代码输出什么?为什么

var obj1 = {a:1, b:2}; // 将 {a:1, b:2}这个对象的地址赋值给obj1 
var obj2 = {a:1, b:2}; // 将 {a:1, b:2}这个对象的地址(与obj1指向的地址不是同一个)赋值给obj2
console.log(obj1 == obj2); // 不是同一个地址,所以输出false
console.log(obj1 = obj2); // 将obj2指向的地址赋值给obj1,此时两个指向同一个地址
console.log(obj1 == obj2); // 是同一个地址,输出true

3.如下代码输出什么? 为什么

var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 } 
var d = [a, b, c] 

var aa = a  // a保存的数值,不是指针,a=1
var bb = b //
var cc = c // 把c指向的对象的地址拷贝给cc
var dd = d // 

a = 11 //只改变a的值
b = 22
c.name = 'hello' //把c指向的地址中的对象的值改了,因此也会影响cc
d[2]['age'] = 3 // 

console.log(aa)  // 1
console.log(bb) // 2
console.log(cc) // { name: 'hello', age: 3 }
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)  // n=a,a=1, ++n=2, a=1
f2(c)  // 传入c指向对象的地址,其中的++age, age=3
f1(c.age) // n=c.age(数值), c.age=2 , ++n=3, c.age=2
console.log(a) // 1
console.log(c) //{ name: 'jirengu', age: 3 }

5. 过滤如下数组,只保留正数,直接在原数组上操作

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
      var i;
       for (i=0;i

6.过滤如下数组,只保留正数,原数组不变,生成新数组

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){      
    var newArr=[];
       for(var i=0,j=0; i< arr.length; i++){
                     if(arr[i]>0){
                             newArr[j] = arr[i];
                             j++;
                        }
            }
            return newArr;
}
var arr2 = filter(arr);
console.log(arr2); // [3,1,2]
console.log(arr);  // [3,1,0,-1,-2,2,-5]

7.写一个深拷贝函数,用两种方式实现

var obj={a:1, b:2, info:{name: 'asdf'}};

function dcopy(obj){
     var newObj={};  //只是声明newObj为一个对象,而不是[清空对象](http://www.cnblogs.com/isykw/p/6869084.html)
如果attr是一个对象,那么递归调用dcopy(),生成一个新的2号newObj,return给1号
     for (var attr in obj){
        if(obj.hasOwnProperty(attr)){ //自己的属性 
              if(obj[attr] instanceof Object){
                       newObj[attr]=dcopy(obj[attr]);  1号newObj
                    }
              else {
                  newObj[attr] = obj[attr];
                 }
              }
              
       }
    return newObj;
}
obj.info.name='lala'
console.log(obj)
var result=dcopy(obj)
console.log(result)
function dcopy2(obj){ //JSON.stringify将对象转换为字符串,再用JSON.parse把这个字符串转换为对象
       return newObj = JSON.parse(JSON.stringify(obj));
}

https://www.zhihu.com/question/23031215

你可能感兴趣的:(引用类型对象拷贝)