探索 JavaScript 中的函数柯里化、WeakMap 和 Reflect

在这个示例中,add 函数接受一个参数 a,并返回一个函数,这个返回的函数接受参数 b,并返回 a + b 的结果。通过柯里化,我们可以先传入一个参数 5,得到一个新的函数 addFive,然后再传入另一个参数 3,最终得到结果 8

柯里化是函数式编程中常见的技术,有助于简化代码、提高可读性,并使函数更具灵活性。

WeakMap

WeakMap 是 JavaScript 中的一种数据结构,它类似于 Map,但具有一些不同之处。WeakMap 的特点如下:

  1. 弱引用键名WeakMap 的键必须是对象,而值可以是任意类型。与 Map 不同的是,WeakMap 中的键是弱引用的,这意味着如果没有其他引用指向键对象,则这些键可能会被垃圾回收。
  2. 不可迭代:由于键是弱引用的,WeakMap 不支持迭代方法,例如 forEach。这是为了防止泄漏键对象,因为迭代可能会暴露键对象,从而阻止它们被垃圾回收。
  3. 不可枚举WeakMap 的键是不可枚举的,因此无法通过 keys()values()entries() 方法来获取键的列表。
  4. 适用场景WeakMap 主要用于存储对象与相关数据的映射,而且这些对象是临时的或者不需要被全局维护的。它在一些特定的场景下很有用,比如在缓存数据、私有属性存储等方面。

示例:

let weakMap = new WeakMap();

let key = {}; // 创建一个对象作为键

weakMap.set(key, "value"); // 将键值对存储到 WeakMap 中

console.log(weakMap.get(key)); // 输出 "value"

key = null; // 将 key 设置为 null,使其成为垃圾回收的候选对象

// 此时,由于 key 不再被引用,WeakMap 中的键值对可能被垃圾回收

Reflect

Reflect 是一个内置的 JavaScript 对象,提供了一组静态方法,这些方法对应于一些操作符。通过 Reflect,开发者可以更方便地进行对象操作,比如获取对象的属性、调用对象的方法、定义属性等。Reflect 的方法与对应的操作符功能相似,但以函数的形式提供,使得代码更具可读性和一致性。

常用方法及其功能:

  1. Reflect.get(target, propertyKey, receiver)

    • 作用:获取对象的属性值。
    • 参数:
      • target:目标对象。
      • propertyKey:属性名。
      • receiver(可选):调用 getter 时绑定的 this 值。
    • 返回值:属性的值。
  2. Reflect.set(target, propertyKey, value, receiver)

    • 作用:设置对象的属性值。
    • 参数:
      • target:目标对象。
      • propertyKey:属性名。
      • value:要设置的值。
      • receiver(可选):调用 setter 时绑定的 this 值。
    • 返回值:布尔值,表示属性是否设置成功。
  3. Reflect.has(target, propertyKey)

    • 作用:检查对象是否具有指定属性。
    • 参数:
      • target:目标对象。
      • propertyKey:属性名。
    • 返回值:布尔值,表示对象是否具有指定属性。
  4. Reflect.deleteProperty(target, propertyKey)

    • 作用:删除对象的属性。
    • 参数:
      • target:目标对象。
      • propertyKey:属性名。
    • 返回值:布尔值,表示属性是否成功删除。
  5. Reflect.construct(target, argumentsList, newTarget)

    • 作用:相当于使用 new 运算符创建实例。
    • 参数:
      • target:目标构造函数。
      • argumentsList:构造函数的参数列表。
      • newTarget(可选):新创建对象的构造函数。
    • 返回值:新创建的实例。

通过使用 Reflect 对象提供的方法,开发者可以更加灵活地进行对象操作,同时代码也更加清晰易懂。Reflect 的引入使得 JavaScript 中的对象操作更加统一和规范化,有助于提高代码的可读性和可维护性。

示例:

示例 1:使用 Reflect.get 获取对象属性值
const person = {
    name: 'Alice',
    age: 30
};

const propertyName = 'name';
const propertyValue = Reflect.get(person, propertyName);

console.log(propertyValue); // 输出 'Alice'

示例 2:使用 Reflect.set 设置对象属性值
const person = {
    name: 'Alice',
    age: 30
};

const propertyName = 'age';
const newValue = 31;

Reflect.set(person, propertyName, newValue);

console.log(person.age); // 输出 31

示例 3:使用 Reflect.has 检查对象是否具有属性
const person = {
    name: 'Alice',
    age: 30
};

const propertyName = 'name';
const hasProperty = Reflect.has(person, propertyName);

console.log(hasProperty); // 输出 true



### 结尾

正式学习前端大概 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。



 3 年多了,很早就想整理这个书单了,因为常常会有朋友问,前端该如何学习,学习前端该看哪些书,我就讲讲我学习的道路中看的一些书,虽然整理的书不多,但是每一本都是那种看一本就秒不绝口的感觉。

以下大部分是我看过的,或者说身边的人推荐的书籍,每一本我都有些相关的推荐语,如果你有看到更好的书欢迎推荐呀。



![前端学习书籍导图-1](https://img-blog.csdnimg.cn/img_convert/34596a44962ca439e68638222f9ae1b3.webp?x-oss-process=image/format,png)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值