17-引用类型、拷贝对象

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

(1)引用类型:指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

  • 对象
  • 数组
  • 函数
  • 正则

(2)基本类型:指的是保存在栈内存中的简单数据段

  • 数值
  • 布尔值
  • null
  • undefined

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

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) //1
console.log(bb) //2
console.log(cc) //{ name: 'hello', age: 2 }
console.log(dd) //[1,2,{name: 'hello', age: 3}]

原因:

  • a,b都是基本类型,aa=a只是在内存中开辟了一块新空间,并不会相互影响,所以一开始aa的值就是1,和后面a重新赋值没有关系。b也同理。
  • 但是c和d不一样,数组和对象都是引用类型,原来的c中存储的是这个对象的指针,而c.name = ‘hello’ 是改变了指针所指内容的值,所以c要变。d也是同理

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

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) //1
console.log(c) //{ name: 'jirengu', age: 3 }

原因:
f1(a)在执行的时候会变成

function f1(a){
    var n = a;
    ++n;
}

这时候a的值并没有改变。而c是引用类型,执行f2(c)。复制的是指针,所以要变化。c.age是基本类型,不会变化。


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



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



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

  • 第一种:JSON

  • 第二种:递归

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