JavaScript 中避免修改原始对象

在 JavaScript 编码过程中,对象作为引用传递存在被修改的情况,而我们更希望原始对象尽量不被修改,这样有利于对对象状态的追踪,这也与函数式编程中纯函数避免副作用的理念一致。以下两种方式用来创建一个新的对象用来进行操作并返回而不会修改原始对象。

利用 JSON.parse 与 JSON.stringify 创建新对象

// 避免修改他人传入的对象
function someOperation(originalObject) {
    let _object = JSON.parse(JSON.stringify(originalObject));
    _object.someKey = someValue;
    return _object;
}
// 避免他人的函数修改自己的对象
someOperation(JSON.parse(JSON.stringify(originalObject)));

利用 Object.asign 创建新对象

// 避免修改他人传入的对象
function someOperation(originalObject) {
    let _object = Object.asign({}, originalObject);
    _object.someKey = someValue;
    return _object;
}
// 避免他人的函数修改自己的对象
someOperation(Object.asign({}, originalObject));

总结

以上两种实现方式,每种方式中都提出了两个避免修改原始对象的时机,对应着两种场景。一种是使用他人传递过来的对象时,要避免修改他人的对象、对他人工作造成困扰。另一种是在调用他人创建的方法时,对传入数据做处理,以避免他人的疏漏对自己工作造成困扰。我认为,在编码的过程中,这两种时机都应该被关注,保证代码的可读性并尽量避免副作用。

2017-01-20 16:57162