javascript-引用类型/浅拷贝和深拷贝

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

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

2.如下代码输出什么?为什么
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2); //false obj1和obj2指向的地址不相同
console.log(obj1 = obj2);  //{a:1,b:2},obj2指向的地址赋值给obj1,obj1和obj2共用一个地址
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所示值1赋予aa,即aa=1;
var bb = b //赋值bb=1
var cc = c //赋值cc={ name: '饥人谷', age: 2 }
var dd = d //赋值dd=[a, b, { name: '饥人谷', age: 2 }]

a = 11 //赋值a=11
b = 22 //赋值b=22
c.name = 'hello' //把cc所代表的地址{ name: '饥人谷', age: 2 }中的name改为hello
d[2]['age'] = 3 //把dd所代表的地址中第三个位置的{ name: '饥人谷', age: 2 }中的age改为3

console.log(aa)  //输出1
console.log(bb)  //输出2
console.log(cc) //输出{name:'hello',age:3},改变cc对应地址中的值,便改变了cc的值;
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自加,令n=a属于赋值,a本身值不改变
f2(c) //c执行,c将堆内存地址赋给obj ,通过自增修改了地址的数据,此时c应是{ name: 'jirengu', age: 3}
f1(c.age)  //取出c中age的值2并自加,但并不影响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);
      filter(arr);
    }
  }
}
filter(arr)
console.log(arr) // [3,1,2]
6.过滤如下数组,只保留正数,原数组不变,生成新数组
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
  return arr.filter(function(argument){
    return argument >0  
  })
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,2,-5]
7.写一个深拷贝函数,用两种方式实现

<一>.浅拷贝与深拷贝
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
<二>.深拷贝函数实现方式:
1).方式一:

function deepCopy(oldObj) {
  var newObj = {};
  for(var key in oldObj) {
     if(typeof oldObj[key] === 'object') {
          newObj[key] = deepCopy(oldObj[key]);
      }
      else{
          newObj[key] = oldObj[key];
      }
  }
  return newObj;
}

2).方式二:

function deepCopy2(oldObj) {
  var newObj = {}
  newObj = JSON.parse( JSON.stringify(oldObj) )
  return newObj
}

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 16,335评论 8 192
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 6,144评论 1 20
  • 昆明的食事儿 昆明其实也没啥好写的除了汪曾祺先生说的昆明食事(俺平生最佩服两个姓汪的,一个是我上面说的汪先生一个是...
    书无不言阅读 69评论 0 0
  • http://blog.csdn.net/wm9028/article/details/49926535
    NiuBaBa阅读 21评论 0 2
  • (1)about dormitory and roommate 以后在寝室的活动要事先充分沟通,尽量协调。能做到统...
    晚安蝎子阅读 37评论 0 0