函数式编程(4) 纯函数
纯函数:每次调用时结果总是一样
这个函数不纯:返回的值有变化
这个函数不纯:因为使用了全局变量minAge
要让它变成纯函数需要
纯函数的好处
- immutability/不变性
如果创建了一个对象
js中的const阻止了重新分配一个对象给book, 而并不能阻止给更改其title属性
在js中练习immutability
// const person = { name: "Y" };
// person.name = '' //如果使用函数式编程不应该 直接修改此属性
// 方法1 Object.assign
// const updated = Object.assign({}, person, { name: "b", age: "22" }); //Object.assign()此方法复制一个对象到另一个 复制person到{}
// 方法2 拓展运算符
// const updated = { ...person, name: "a" }; //...person已经复制了person
// console.log("updated: ", updated);
// 上面两种方法都是浅拷贝 即使浅拷贝了对象 但其中的address属性还是同一个,如果改变了其中一个引用的值,另一个也会改变 不能复制再嵌套一层的对象
const person = {
name: "Y",
address: {
city: "la",
},
};
// 1.shallow copy
// updated.address.city = "ny"
// 2.深拷贝
const updated = { ...person, address:{
...person.address,city:"ny"
} }; //...person已经复制了person
// const updated = { ...person, name: "a" }; //...person已经复制了person
console.log('person: ', person);
const numbers = [1,2,3]
// 添加6到2的前面
// const index = numbers.indexOf(2)
// // const added = [...numbers]
// const added = [...numbers.slice(0,index),//复制2之前的所有项
// 6,
// ...numbers.slice(index)//.slice返回下标后所有项
// ]
// console.log(added);
// 删除项
// const removed = numbers.filter(n => n!==2);
// console.log('removed: ', removed);
// 更改项
const updated = numbers.filter(n => n===2? 20:n);
console.log('updated: ', updated);
安装并引入 immutable.js后的练习