讲师中心 微信公众号
AI工具推荐 视频效率加速

函数 - JavaScript 挑战

风墨同学_8131

风墨同学_8131

发布时间:2024-11-01 16:10:17

|

402人浏览过

|

来源于dev.to

转载

函数 - javascript 挑战

您可以在 repo github 上找到这篇文章中的所有代码。

GitHub Push 自动推送
GitHub Push 自动推送

使用自动 SSH 和远程配置实现安全的 GitHub 推送自动化。适用于执行 `git push`、自动化推送或处理冲突等场景。

下载

功能相关的挑战


参数和参数

/**
 * @param {function} fn
 * @return {number}
 */

function functionlength(fn) {
  return fn.length;
}

// usage example
function myfunction(a, b, c) {
  console.log(a, b, c);
}

console.log(functionlength(myfunction)); // => 3

/**
 * @param {...any} args
 * @return {number}
 */

function numofarguments(...args) {
  // return args.length;
  return arguments.length;
}

// usage example
console.log(numofarguments(1, 2, 3, 4, 5)); // => 5
console.log(numofarguments()); // => 0

撰写

/**
 * @param {...functions} fns
 * @return function
 */

function compose(...fns) {
  return function (x) {
    let result = x;

    for (const fn of fns.reverse()) {
      result = fn(result);
    }

    return result;
  };
}

// usage example
const add1 = (num) => num + 1;
const double = (num) => num * 2;
const subtract10 = (num) => num - 10;

const composedfn = compose(subtract10, double, add1);
console.log(composedfn(3)); // (3 + 1) * 2 - 10 => -2

柯里化

/**
 * @param {function} fn
 * @return {function}
 */

function curry(fn) {
  return function curried(...args) {
    if (args.length >= fn.length) {
      return fn.apply(this, args);
    }

    return curried.bind(this, ...args);
  };
}

// usage example
// single parameter case
function add(a, b) {
  return a + b;
}

const curriedadd = curry(add);
console.log(curriedadd(3)(4)); // => 7
const alreadyaddedthree = curriedadd(3);
console.log(alreadyaddedthree(4)); // => 7

// fixed parameters case
function addtwo(a, b) {
  return a + b;
}

const curriedaddtwo = curry(addtwo);
console.log(curriedaddtwo(3, 4)); // => 7
console.log(curriedaddtwo(3)(4)); // => 7
const alreadyaddedthreeb = curriedadd(3);
console.log(alreadyaddedthreeb(4)); // => 7

//-------------------------------------------

/**
 * @param {function} fn
 * @return {function}
 */

function curry(fn) {
  return function curried(...args) {
    const bindfn = curried.bind(this, ...args);
    bindfn[symbol.toprimitive] = () => fn.call(this, ...args);

    return bindfn;
  };
}

// usage example
// non-fixed parameters case
function multiply(...numbers) {
  return numbers.reduce((a, b) => a * b, 1);
}

const curriedmultiply = curry(multiply);
const multiplybythree = curriedmultiply(3);
console.log(multiplybythree); // => 3
console.log(multiplybythree(4)); // => 12

const multiplybyfifteen = multiplybythree(5);
console.log(multiplybyfifteen); // => 15
console.log(multiplybyfifteen(2)); // => 30

console.log(curriedmultiply(1)(2)(3)(4)); // => 24
console.log(curriedmultiply(1, 2, 3, 4)); // => 24

备忘录

/**
 * @param {function} func
 * @return {function}
 */

function memoize(fn) {
  const cache = new map();

  return function (arg) {
    if (cache.has(arg)) {
      return cache.get(arg);
    }

    const result = fn.call(this, arg);
    cache.set(arg, result);

    return result;
  };
}

// usage example
function expensivefunction(n) {
  console.log("computing...");
  return n * 2;
}

// create a memoized version of the function.
const memoizedexpensivefunction = memoize(expensivefunction);

// first call (computes and caches the result).
console.log(memoizedexpensivefunction(5)); // => computing... 10

// second call with the same argument (returns the cached result).
console.log(memoizedexpensivefunction(5)); // => 10

// third call with a different argument (computes and caches the new result).
console.log(memoizedexpensivefunction(10)); // => computing... 20

// fourth call with the same argument as the third call (returns the cached result).
console.log(memoizedexpensivefunction(10)); // => 20

// ----------------------------------------
// when parameters could be array
/**
 * @param {function} fn
 * @return {function}
 */

function memoize(fn) {
  const cache = new map();

  return function (...args) {
    const key = json.stringify(args);

    if (cache.has(key)) {
      return cache.get(key);
    }

    const result = fn.call(this, ...args);
    cache.set(key, result);

    return result;
  };
}

// usage example
function expensivemul(a, b) {
  console.log("computing...");
  return a * b;
}

// create a memoized version of the function.
const memoizedexpensivemul = memoize(expensivemul);

// first call (computes and caches the result).
console.log(memoizedexpensivemul(3, 7)); // => computing... 21

// second call with the same argument (returns the cached result).
console.log(memoizedexpensivemul(3, 7)); // => 21

// third call with a different argument (computes and caches the new result).
console.log(memoizedexpensivemul(5, 8)); // => computing... 40

// fourth call with the same argument as the third call (returns the cached result).
console.log(memoizedexpensivemul(5, 8)); // => 40

部分的

/**
 * @param {Function} fn
 * @param {any[]} args
 * @returns {Function}
 */

function partial(fn, ...args) {
  return function (...restArgs) {
    const copyArgs = args.map((arg) => {
      return arg === partial.placeholder ? restArgs.shift() : arg;
    });

    return fn.call(this, ...copyArgs, ...restArgs);
  };
}

partial.placeholder = Symbol();

// Usage example
const func = (...args) => args;
const func123 = partial(func, 1, 2, 3);
console.log(func123(4)); // => [1, 2, 3, 4]

参考

  • 伟大的前端
  • 参数对象 - mdn
  • 参数 - mdn
  • 函数组合(计算机科学)- wikipedia.org
  • 11。什么是构图?创建管道() - bfe.dev
  • 1.实现 curry() - bfe.dev
  • 2.实现带有占位符支持的 curry() - bfe.dev
  • 柯里化 - wikipedia.org
  • 14。实现通用记忆功能 - memo() - bfe.dev
  • 122。实现 memoizeone() - bfe.dev
  • 记忆 - wikipedia.org
  • 部分应用 - wikipedia.org
  • 139。实现 _.partial() - bfe.dev

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

8805

2026.01.21

GitHub官网入口版本汇总
GitHub官网入口版本汇总

本专题整合了GitHub入口版本地址汇总,阅读专题下面的文章了解更多详细内容。

958

2026.04.02

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

0

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

20

2026.11.06

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

40

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

20

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

40

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

40

2026.11.04

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Postman Native Git工作流指南
Postman Native Git工作流指南

共0课时 | 0人学习

vscode手册
vscode手册

共0课时 | 0人学习

Git 教程
Git 教程

共21课时 | 8.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn