对象属性的设置和获取
. 和[]区别
[]是可以设置变量的 .只能获取自身的属性
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);