引用类型与对象拷贝

2017-08-01  本文已影响0人  怎么昵称
1.引用类型有哪些?非引用类型有哪些

引用类型: 对象 object 数组 函数 正则
非引用类型(基本类型): number string boolean null underfined symbol

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

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};

console.log(obj1 == obj2);//false, 虽然指向的空间内容相同,但是是属于两片不同区域的对象,地址也会不一样

console.log(obj1 = obj2);// 复制obj2指向对象的地址给obj1, 输出 object={a: 1,b:2}

console.log(obj1 == obj2); // 比较两个地址相等,指向的也是同一片区域 ,输出true

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

var a = 1
var b = 2
var c = { name: '饥人谷', age: 2 }
var d = [a, b, c] // d数组包含a b 还有c对象

var aa = a // aa=a=1
var bb = b // bb=b=2
var cc = c // cc复制了指向对象的地址c, 可对对象操作
var dd = d //同上

a = 11 // a赋值为11
b = 22 // b 赋值为 22
c.name = 'hello' //对对象的内容改动 ,name: '饥人谷' 改成 name: 'hello'
d[2]['age'] = 3 // 改动d数组中的c中的age为3

console.log(aa) // 1
console.log(bb) // 2
console.log(cc) // var cc= { name: 'hello' , age: 3}
//改错:d[2]['age'] = 3 也改变了cc指向的对象的属性值 age: 3
所以 age: 3,不是2

console.log(dd) // var dd= [1,2, cc:{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)
//var n=a; var a=1; 所以 n=1;
++n //++n 输出2 , 然后n变为2 , 但a还是1, 输出a=1

f2(c)
// var obj = c = { name: 'jirengu', age: 2 }
++obj.age // 输出 age: 3 , 是对对象的age +1, 那么输出c就会内容变
化, 输出 var c = { name: 'jirengu', age: 3 }

f1(c.age)
//f1(c.age) 隐式语句: var n=c.age; c.age发生变化后 为3,所以n=3
//输出 ++n为4 ,所以var c = { name: 'jirengu', age: 3 }

console.log(a) //输出 a=1
console.log(c) // 输出 var 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) //从负数的那个位置删除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=[];
for(var i=0; i<arr.length; i++){
if( arr[i]>0 ){
newarr.push(arr[i]); //数组.push() 给数组添加元素
}
}
return newarr;
}

var arr2 = filter(arr) //newarr的属性给arr2
console.log(arr2) // [3,1,2]
console.log(arr) // [3,1,0,-1,-2,2,-5]

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

方法1

function copy(obj){
var newObj={}; //开辟新空间
for(var key in obj){
if(obj.hasOwnProperty(key)) //判断有个对象是否有属性或对象
if(typeof obj[key]==='null' || typeof obj[key]==='underfined' || typeof obj[key]==='string' || typeof obj[key]==='number' || typeof obj[key]==='boolean' ){ //判断对象中的属性全是基本类型时
newObj[key]= obj[key]; // 属性复制到新空间对象
}
else{
newObj[key] = copy(obj[key]);
}//如果对象中有嵌套对象 ,再递归嵌套对象的属性
}
}
return newObj;
}
var obj1 = {
name: 'ruoyu',
sex: 'male',
age: 30,
friend: {
name: 'hello,
age: 100
}
}
var obj3= copy(obj1);
obj1.name =wowo;
console.log(obj3);

方法2:

var obj1={
name:'teng',
age: 30,
friend: {
name: 'hello',
age: 100,
}
}
function copy(obj){
var newobj= JSON.parse(JSON.stringify(obj));
return newobj;
}
var obj3= copy(obj1);
console.log(obj3);

//JSON.stringify(obj) 对象转换成字符串
JSON.parse(JSON.stringify(obj)); 将转换来的字符串(此时的字符串已经不是之前的字符串) ,再生成为对象

上一篇下一篇

猜你喜欢

热点阅读