美文网首页
引用类型和对象拷贝

引用类型和对象拷贝

作者: 毕子歌 | 来源:发表于2017-02-10 23:07 被阅读0次
    1. 引用类型有哪些?非引用类型有哪些?
      非引用类型有number、string、boolean、undefined、null
      引用类型有function、object、array和正则表达式
    2. 如下代码输出什么?为什么
    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);  //false  两个对象虽然内容一样但是在内存中开辟的地址却不同
    console.log(obj1 = obj2);   //{a:1,b:2}  将指向obj2的指针复制给obj1  
    console.log(obj1 == obj2);  //true 两个对象的指针相同,只想同一个地址
    
    1. 如下代码输出什么? 为什么、
    var a = 1
    var b = 2
    var c = { name: '饥人谷', age: 2 }
    var d = [a, b, c]
    
     var aa = a    //将a的值复制给了aa但是a没变
    var bb = b    //将b的值复制给了bb但是b没变
    var cc = c    //将c的地址给了cc
    var dd = d    //将d的地址给了dd
    
     a = 11
    b = 22
    c.name = 'hello'
    d[2]['age'] = 3
    
     console.log(aa)   //1    
    console.log(bb)   //2
    console.log(cc)   //{name:'hello',age:2}
    console.log(dd)   //[1,2,Object {name: "hello", age: 3}]
    
    1. 如下代码输出什么? 为什么
    var a = 1
    var c = { name: 'jirengu', age: 2 }
    
     function f1(n){
      ++n
    }
    function f2(obj){
      ++obj.age
    }
    
     f1(a)           //在函数内部进行了一步看不见的var n=a,将a的值复制给了n,n递增与a没有关系,a不变
    f2(c)           //在函数内部进行了一步看不见的var obj=c,将c的地址指针复制给了obj,obj.age的改变会影响到c.age
    f1(c.age)       //将c.age的值复制给了n,n的递增和c.age没有关系
    console.log(a)  //1
    console.log(c)  //3
    
    1. 过滤如下数组,只保留正数,直接在原数组上操作
    var arr = [3,1,0,-1,-3,2,-5]
    function filter(arr){
             for( i=0 ; i<arr.length ; i++){
                       if(arr[i]<=0){
                             arr.splice(i,1)
                             i-- ;                     
                       }                   
              }
    }
    filter(arr)
    console.log(arr)  //[
    
    1. 过滤如下数组,只保留正数,原数组不变,生成新数组
    var arr = [3,1,0,-1,-3,2,-5]
    function filter(arr){
         var newArr = []
         for( i=0 ; i<arr.length ; i++){
           if(arr[i]>0){newArr.push(arr[i])}
         }
         return newArr
    }
    var arr2 = filter(arr)
    console.log(arr2) // [3,1,2]
    console.log(arr)  // [3,1,0,-1,-3,2,-5]
    
    1. 写一个深拷贝函数,用两种方式实现
     var obj = {
        name:'jirengu',
        age: 18 ,
        child : {
            name : 'hahaha',
            age : 1
        }
    }
    
     function deepCopy(oldObj){
         var newObj = {}
         for(var key in oldObj){
           if(typeof oldObj[key] === 'number'||
              typeof oldObj[key] === 'string'||
              typeof oldObj[key] === 'boolean'||
              typeof oldObj[key] === undefined||
              typeof oldObj[key] === null){
              newObj[key] = oldObj[key]
           }else{
           newObj[key] = deepCopy(oldObj[key])
          }
        }
        return newObj
    }
    
     var obj2 = deepCopy(obj)
    console.log(obj2)
    obj.name = 'jscode.me'
    console.log(obj)
    console.log(obj2)
    
    var obj = {
        name:'jirengu',
        age: 18 ,
        child : {
            name : 'hahaha',
            age : 1
        }
    }
    
     function deepCopy(oldObj){
        var newObj = JSON.parse(JSON.stringify(obj))
        return newObj
      
     }
    
     var obj2 = deepCopy(obj)
    console.log(obj2)
    obj.name = 'jscode.me'
    console.log(obj)
    console.log(obj2)
    

    相关文章

      网友评论

          本文标题:引用类型和对象拷贝

          本文链接:https://www.haomeiwen.com/subject/xkksittx.html