一、如何判断一个对象是空对象?
JSON.stringify(c)=='{}'
// 或
Object.keys(obj).length==0
二、如何科学的打印一个对象?
一般情况下,我们打印普通值都没有问题,但在打印对象类型时,我们就需要注意点了,要不然可能会出现不符合期望的结果。
看一个例子:
let person = {name: "marry", gender: "male"}
changeObj(person)
function changeObj (obj) {
console.log(obj);
obj.age = 18
}
// person 打印的结果是:
// {name: "marry", gender: "male"}
// age: 18
// gender: "male"
// name: "marry"
// __proto__: Object
明显,展开前后看到的结果是不一样的。
问题分析:
这说明,我们打印后,该对象仍然可以被修改。这正是对象的浅拷贝的特性。所以,这是由于拷贝的方式不对,采用深拷贝可解决此问题。
比如:用 ES6 的扩展运算符实现对象的深拷贝:
let person = {name: "marry", gender: "male"}
changeObj(person)
function changeObj (obj) {
console.log({...obj});
obj.age = 18
}
// person 打印的结果是:
// {name: "marry", gender: "male"}
// gender: "male"
// name: "marry"
// __proto__: Object
深拷贝不会改变愿对象的值。
这个问题解决了,可是为了避免 “因误用前拷贝复制对象导致 console.log() 打印的结果 ‘展开’ 与 ‘未展开’ 不一致” 的问题,我们该怎么避免呢?
用 JSON.stringify() 转一下该对象。
let person = {name: "marry", gender: "male"}
changeObj(person)
function changeObj (obj) {
console.log(JSON.stringify(obj));
obj.age = 18
}
// person 打印的结果是:{"name":"marry","gender":"male"}
这样写就没有 “展开” 与 “不展开” 之分了,成功避坑。但若发现这种问题,一定要用深拷贝解决一下。