0
点赞
收藏
分享

微信扫一扫

对象的属性方法和深浅拷贝

对象属性的设置和获取

. 和[]区别
[]是可以设置变量的 .只能获取自身的属性

var o={name:"abc"};
var a='name';
console.log(o[a]);

属性的删除 delete

var o2={
name:"张三",
   age:18 ,
   text:"1111"
}
delete o2.name
console.log(o2);//{age: 18, text: "1111"}

检测属性 判断对象是否含有某一个属性

in 运算符 hasOwnProperty() 区别:

var o3={
name:"张三",
   age:18 ,
}

console.log('name' in o3);//o3中是否含有name属性  true
console.log(o3.hasOwnProperty('name'));//true

forEach 和 map 区别

forEach 没有返回值
map 返回一个数组

// filter过滤出符合条件的
var arr=[1,2,3,4,5,6];
var a=arr.filter(function (item) {
    return item>5
})
console.log(a);//返回的是满足条件的数组

// reduce用于计算数据的合计的
var arr=[1,2,3,4,5,6];
var a=arr.reduce(function (pre,cur) {
    return pre+cur;
},10);
console.log(a);//31

// every数组中每一项运行给定函数,如果该函数所有一项返回true,则返回true。一旦有一项不满足则返回flase
var arr=[1,2,3,4,5,6];
var a=arr.every(function (item) {
    console.log("item",item);
    return item>5;
});
console.log(a);//false

// some对数组中每一项运行给定函数,如果该函数满足任一项返回true,则返回true
var arr=[1,2,3,4,5,6];
var a=arr.some(function (item) {
    console.log("item",item);
    return item>5;
});
console.log(a);

序列化

JSON.parse()
JSON.stringfy()

深浅拷贝

当B复制了A,如果改变A,B也跟着变化就是浅拷贝,如果B不跟着改变就是深拷贝 深拷贝就像是双胞胎 浅拷贝就像是自己和影子的关系

// 数组的深拷贝  
//slice(返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素。)  
//concat
var arr1=[1,2,3,4];
var arr2=arr1;
arr2[0]=100;
var arr3=arr1.concat([]);
arr3[1]=99;
var arr4=arr1.slice(0);
arr4[1]=400;
console.log("arr4",arr4);//arr4 [ 100, 400, 3, 4 ]
console.log("arr3",arr3);//arr3 [ 100, 99, 3, 4 ]
console.log("arr2",arr2);//arr2 [ 100, 2, 3, 4 ]
console.log("arr1",arr1);//arr1 [ 100, 2, 3, 4 ]
//但是这种方式仅限于数组中的item是基本数据类型

// 对象
var o = { name: "zhangsan", age: 18, obj: { id: 1 } };

// 以下的方式也是浅拷贝
var o1 = new Object();
o1.name = o.name;
o1.age = o.age;
o1.obj = o.obj;
o1.name = "lisier";
o.obj.id = 222;
console.log("o1", o1, "o", o);


// Object.assign() 也是浅拷贝
var obj = { a: 1, b: 1, c: { lalala: "lalala" } };
var obj1=Object.assign({},obj);
obj.c.lalala="jjjjjjjjj";
console.log(obj);//{ a: 1, b: 1, c: { lalala: 'jjjjjjjjj' } }
console.log(obj1);//{ a: 1, b: 1, c: { lalala: 'jjjjjjjjj' } }

// 序列化深拷贝(!!!!但是不能拷贝function)
var obj = { a: 1, b: 1, c: { lalala: "lalala" }, eat: function () { console.log("吃饼干") } };
var obj1 = JSON.parse(JSON.stringify(obj));
obj.c.lalala = "kkkkkkkkkk";
console.log(obj);//{ a: 1, b: 1, c: { lalala: 'kkkkkkkkkk' }, eat: [Function: eat] }
console.log(obj1);//{ a: 1, b: 1, c: { lalala: 'jjjjjjjjj' } }


// 深拷贝通用方法
function deepCopy(dest, obj) {
    var o = dest;
    //obj有可能是对象或者数组 for in 可以遍历对象或者数组,遍历数组的时候key是索引
    for (var key in obj) {
    //typeof 判断当前数据类型是不是复杂数据类型
        if (typeof obj[key] === "object") {
        //如果是复杂数据类型 要再一次进行循环拷贝 判断是数组还是对象给一个空的容器
            o[key] = obj[key].constructor == Array ? [] : {};
            deepCopy(o[key], obj[key]);
        } else {
            o[key] = obj[key];
        }
    }
    return o;
}
let o6 = {
    b: "bbbb", 
    o: { id: 123 }, 
    arr: [1, 2, 3, 4], 
    eat: function () {
        return 'eating'
    }
};
var res=deepCopy({ a: 123 }, o6);
o6.o.id="这是id";
console.log(res);
console.log(o6);

举报

相关推荐

0 条评论