🧑🎓 个人主页:《爱蹦跶的大A阿》
🔥当前正在更新专栏:《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》
目录
✨ 前言
JavaScript作为一门非常灵活的语言,包含许多高级功能来帮助开发者更好地编写代码。柯里化和引用类型就是其中两个重要且实用的高级概念。
本文将详细介绍柯里化的用法,以及JavaScript中的值类型和引用类型的区别。这些都是每一位JavaScript开发者都需要深刻理解的知识点。
通过学习本文,你将能够熟练使用柯里化技术提高函数的灵活性,并明确理解JavaScript中的值与引用的区别。这将大大提升你的JavaScript编程能力。
✨ 正文
一、函数柯里化(Currying)
什么是柯里化
柯里化(Currying)是把接收多个参数的函数转换成接收一个单一参数的函数,并且返回接收余下的参数且返回结果的新函数的技术。
柯里化实现
我们可以编写一个 curry 函数来实现柯里化:
function curry(func) {
return function curried(...args) {
if (args.length >= func.length) {
return func.apply(this, args);
} else {
return function(...args2) {
return curried.apply(this, args.concat(args2));
}
}
};
}
这个 curry 函数将多参数函数转换成单参数函数,每次接收参数直至满足函数长度要求时终止柯里化并执行函数。
柯里化实例
使用柯里化可以对参数进行预设:
function sum(a, b, c) {
return a + b + c;
}
let curriedSum = curry(sum);
curriedSum(1)(2)(3); // 6
curriedSum(1, 2)(3); // 6
部分应用
与柯里化相似,部分应用(Partial Application)是固定一个函数的部分参数来生成一个新的函数的技术。
部分应用实现
function partial(func, ...presetArgs) {
return function(...laterArgs) {
return func(...presetArgs, ...laterArgs);
}
}
partial 接收预设参数,返回带预设参数的新函数。
部分应用示例
let partialSum = partial(sum, 1, 2);
partialSum(3); // 6
partialSum(4); // 7
固定了部分参数,获得带参数的sum函数。
总结
- 柯里化将多参数函数转换为单参数函数
- 部分应用固定函数的部分参数
- 都允许参数的预设应用
- 提高了函数适用性
柯里化和部分应用都是函数式编程中非常重要的概念。
二、JavaScript中的引用类型
基本类型和引用类型
JavaScript 中有基本类型和引用类型两种类型。
基本类型直接存储值,引用类型的值是对象,存储对象的引用(内存地址)。
对象是引用类型
在 JavaScript 中,对象属于引用类型:
let obj = {
name: "John"
};
obj 变量并不直接存储对象,而是存储该对象的引用。
赋值拷贝引用
对一个引用类型进行赋值时,赋的值是该对象的引用:
let obj2 = obj;
obj2.name = "Pete";
alert(obj.name); // Pete
这里 obj2 和 obj 引用的是同一个对象。
对比基本类型
和基本类型不同,对引用类型进行赋值时拷贝的是对象的引用,而不是值:
let str = "Hello";
let str2 = str;
str2 = "Bye"; // str unchanged
基本类型不会被引用。
引用类型的比较
引用类型不能使用 == == 比较,需要通过 Object.is 比较引用。
或者可以比较特定的属性。
传递函数参数
将对象作为参数传递给函数时,同样只是传递了对象引用而不是对象本身。
总结
- 对象属于引用类型,保存对象的引用
- 赋值和传参都会复制引用,多个变量引用同一对象
- 引用类型不能比较,需要比较对象属性或用 Object.is
- 理解的值与引用的区别非常重要
这是学习 JavaScript 的重要概念之一。
✨ 结语
希望通过本文,这两个重要的JavaScript高级概念不再难以理解。将它们运用到项目中,可以让我们的代码更加易于维护和扩展。
持续学习JavaScript的核心理念,是成为资深JavaScript开发者不可或缺的素养。这将使我们的代码更加规范,健壮而优雅。