引用类型对象拷贝
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);