js 空对象的判断 & 科学的打印对象

一、如何判断一个对象是空对象?

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

深拷贝不会改变愿对象的值。

JS 的浅拷贝与深拷贝

这个问题解决了,可是为了避免 “因误用前拷贝复制对象导致 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"}

这样写就没有 “展开” 与 “不展开” 之分了,成功避坑。但若发现这种问题,一定要用深拷贝解决一下。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值