关于对象Object
- 对象可以看作一种结构体,键值对的无序集合
- 对象的key可以是字符串或者符号,一般为字符串,如果是中间有空格的字符串的话,用单引号或者双引号包括
- 对象的value可以是任意值(基本数据类型,函数或者是其它对象)
- 获取对象的属性值可以用点语法或者中括号,其中中括号中可以使用变量表达式什么的
- 删除属性。delete object.property
- 检查属性是否存在 “key” in object
- 遍历对象 for(let key in object)
- 对象根据引用来赋值或者复制。 变量存的不是对象,而是对象的地址。所有的引用操作(增加,修改,删除属性)都作用于同一个对象
- 如果想要生成一个新的对象的话,那么使用新建空对象,通过for循环复制所有的属性值或者是使用Object.assign(resultobj,
currentObj)来复制。
Tips:后边的方法是将几个对象集成到第一个接收对象里,后边跟了几个currentObj 前面就接收多少Obj的属性,如果有名字一样的就覆盖- 生成新对象的时候所遇到的问题:
\>1. symbol属性值无法复制(for…in 自动跳过了这个值)
\>2. 如果属性值是对象的话 是新生成了指针指向原对象的属性对象,如果原对象的属性对象有改变的话,会联动新对象改变
- 处理方法:
\>1. 使用一个现成的库 lodash,使用其方法_ .cloneDeep(obj) ;
\>2. 使用Reflect.ownKeys,封装方法如下:
function deepCopyOneObject(defaultObj) {
let resultObject = {};
Object.assign(resultObject, currentObject);
for (let key of Reflect.ownKeys(defaultObj)) {
//关于null返回object的容错处理
if (defaultObj[key] == null) continue;
if (typeof(defaultObj[key]) == "object") {
let propObject = deepCopyOneObject(defaultObj[key]);
resultObject[key] = propObject;
}
}
return resultObject;
}