引用类型对象拷贝

2017-07-11  本文已影响0人  QQQQQCY

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

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

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

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
console.log(obj1 = obj2);
console.log(obj1 == obj2);
>
false  //  对象为引用类型,等式对比的是存储地址,地址显然不同
[object Object] {
  a: 1,
  b: 2
}
true  //  经过第二步之后obj1和obj2的地址已经相等

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) 
console.log(bb) 
console.log(cc)
console.log(dd)
>
1
2  //  基本类型等式传递的是值,改变只影响自己
[object Object] {
  age: 3,
  name: "hello"
}  //  改变的是储存空间中的值
[1, 2, [object Object] {
  age: 3,
  name: "hello"
}]    //  改变的是储存空间中的值

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

var a = 1
var c = { name: 'jirengu', age: 2 }

function f1(n){
  ++n
}
function f2(obj){
  ++obj.age
}

f1(a) 
f2(c) 
f1(c.age) 
console.log(a) 
console.log(c)
>
1  //   f1() 中的++n ,改变的是f1执行上下文中AO里n 的值,与global执行上下文中的a无关联
[object Object] {
  age: 3,
  name: "jirengu"
} //  传递了c的地址给f2,又对地址里的值进行了改变

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

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

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

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

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

var obj = {
  name:'qqqqqcy',
  sex:'man',
  age:24,
  skills:{
    level5:'photoshop',
    level4:'CAD'
  },
  interesting:['skating','game','sports']
}

//----------第一种方法----------
function deepCopy(arr){
  var newArr={};
  console.log(newArr);
  var i=0
  for (key in arr){
    if (typeof(arr[key])==='number' || 
        typeof(arr[key])==='string' ||
        typeof(arr[key])==='boolean'||
        arr[key]===null ||
        arr[key]===undefined ) 
       newArr[key] = arr[key];
    else 
      newArr[key] = deepCopy(arr[key])
  }      
  return newArr;
}

//----------第二种方法----------
function deepCopy2(arr){
  return JSON.parse(JSON.stringify(arr))
}
  
var obj2 = deepCopy(obj);                     

var obj3 = deepCopy2(obj);    
  

obj.age = 25;
obj.skills.level4 = 'html';
obj.interesting[1] = 'coding';
console.log(obj);
console.log(obj2);
console.log(obj3);











上一篇下一篇

猜你喜欢

热点阅读