创建:
值以键值对的方式来书写,冒号分隔。
JavaScript 对象是被命名值的容器。
- JS
1.JS对象表示类的实例
2.不能传输
3.键值对,键不加双引号,值可以是数字/字符串/布尔/Null/Undefined/数组/函数/对象等
4.Js对象转换为Json:JSON.stringify(jsobj) - JSON串
1.JSON只是一种数据格式,不存在JSON对象的概念
2.可以跨平台数据传输,速度快
3.键值对,键必须加双引号 值不能是方法函数,不能是undefined/NaN
4.Json转化为js对象:JSON.parse(jsonstring); /Jsobj=eval(“(”+jsonstring+“)”);
遍历对象
const obj = {
id:1,
name:'zhangsan',
age:18}
for(let key in obj){
console.log(key + '---' + obj[key])
}
深浅拷贝、复制方法:
深浅拷贝:
- 浅拷贝
只是拷贝了基本类型的数据,我们把这种拷贝叫做“浅拷贝”。例如对象直接赋值obja=objb
assign()
方法等情况
若父对象的属性等于数组或另一个对象,那么实际上,子对象获得的只是一个内存地址,而不是真正拷贝,因此存在父对象被篡改的可能。 - 深拷贝
就是能够实现真正意义上的数组和对象的拷贝,const copy = Object.assign({}, obj);与{…obj}都能实现一层深拷贝
Object.assign()
这是浅拷贝, 只是拷贝了基本类型的数据,被复制对象属性是数组或另一个对象时会将内存地址复制而非值。obja=Object.assign(objb);
等效 obja=objb
一层深拷贝:const copy = Object.assign({}, obj)
等效const copy = {...obj}
{…obj}扩展运算符
这是一层深拷贝,本质上就是一次遍历赋值,
JSON无引用复制
也算是深拷贝 的一种实现方式
function cloneObjectFn (obj) { // 对象复制
return JSON.parse(JSON.stringify(obj));
}
但这种方式不能复制含有方法的对象,方法再复制过程中会被删除
递归遍历赋值
扩展运算符的衍生,很好理解。把对象的每一层都遍历出来赋值就可以去掉引用。
但很消耗性能。
function deepClone(obj){
let objClone = Array.isArray(obj) ? [] : {};
if (obj && typeof obj === 'object') {
for(let key in obj){
if (obj[key] && typeof obj[key] === 'object'){
objClone[key] = deepClone(obj[key]);
}else{
objClone[key] = obj[key]
}
}
}
return objClone;
}
Object.is()
比较两个值是否相同。所有 NaN 值都相等(这与和=不同)。
Object.keys()
返回值是对象中属性名组成的数组var data = {};var arr = Object.keys(data);alert(arr.length == 0);//true
Object.values()
返回给定对象自身可枚举值的数组。
Object.assign()
Object.assign(target, ...sources)
可理解为目标对象与多个对象的并集,交集部分被覆盖
- 将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。
- 通俗讲:通过复制一个或多个对象来创建一个新的对象。
- 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖。后面的源对象的属性将类似地覆盖前面的源对象的属性。
- Object.assign()拷贝的是(可枚举)属性值。
假如源值是一个对象的引用,它仅仅会复制其引用值。
//错误示范
const obj = { a: 1 };
const copy = Object.assign(obj);
console.log(copy); // { a: 1 }
copy.a=10086;
obj.a;//10086 此时会引用同一内存地址
//整错做法
const obj = { a: 1 };
const copy = Object.assign({}, obj);
console.log(copy); // { a: 1 }
//但这样只能实现一层的深拷贝