美文网首页
引用类型与函数拷贝

引用类型与函数拷贝

作者: 饥人谷_啦啦啦 | 来源:发表于2017-06-16 02:15 被阅读0次

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

  • 引用类型包括对象,函数,数组,正则。他们由于被贮存在堆(heap)中,然后变量只是贮存一个指针或者说是一个内存的地址,这个指针指向或者这个地址指向的才是他们真正的内容。
  • 非引用类型有 string,number,boolean,null,undefined.

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

var obj1 = {a:1, b:2}; 
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false, 两个变量的虽然内容看上去一样,但是
他们都赋值时都分别开辟了空间,地址肯定不一样。
console.log(obj1 = obj2);// 让obj1的地址指向 obj2 的地址。
console.log(obj1 == obj2);// ture 地址一样,所以他们相等。

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 // 运行之前d的内容是[1,2,{name:饥人谷,age:2}],运行之后变为\n [1,2,{name:hello,age:3}]

console.log(aa) // 输出1 ,因为第一次赋值时aa=a=1 ,这是一个非引用量,所以,即使a后来发生了改变,但已经不管aa什么事情了。
console.log(bb) // 输出2 ,同样的道理。
console.log(cc)// cc=c=一个地址, 然后c.name发生改变,但是地址没有变,所以cc输出的是{name:hello, age:3},之前忘了d[2]['age']=3对c的改变了。
console.log(dd)// dd=d=一个地址,然后d内容发生改变,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=1,传入,输出++n=2
f2(c) // 将obj=c=一个地址,传入 ++obj.age, 输出 {name:'jirengu',age:3}
f1(c.age) //此时,c.age=3,所以,运行结果是 4.
console.log(a) // a=1 ,此时所有运行函数,并没有修改a的值,a不变。
console.log(c) // 输出结果是{name:'jirengu',age:3} ,f1(c.age)操作的是n的值,并没有操作c.age的值。

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)
        i--
     }
  }    
}
filter(arr)
console.log(arr) // [3,1,2]

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

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
  var newArr=[]
  var j=0
  for(var i=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={
        name:"lalala",
        age:150,
        friends:{
        boy:"xiaoxiao",
        girl:"dada"
        }
       }
 function shadowCopy(obj){
    var obj2={}
    for(var key in obj){
      obj2[key]=obj[key]
    }
    return obj2
}
var newobj=shadowCopy(obj)
console.log(newobj)
  • 深拷贝:递归思想
var obj={
        name:"lalala",
        age:150,
        friends:{
        boy:"xiaoxiao",
        girl:"dada"
        }
       }
function copy(oldobj){
  var newobj={}
  for(var key in oldobj){
    var a=oldobj[key]
    if(a!==null && typeof a=== 'object'){
      newobj[key]=copy(oldobj[key])
      console.log(1)
    }else {
       newobj[key]=oldobj[key]
       console.log(2)
    }
  }
  return newobj
}
var obj2=copy(obj)
console.log(obj2)
  • 深拷贝:JSON
var obj={
        name:"lalala",
        age:150,
        friends:{
        boy:"xiaoxiao",
        girl:"dada"
        }
       }
function deepCopy(oldobj){
  newobj=JSON.parse(JSON.stringify(oldobj))
  return newobj
}
var obj2=deepCopy(obj)
console.log(obj2)

相关文章

网友评论

      本文标题:引用类型与函数拷贝

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