首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在JavaScript中模拟let表达式?

如何在JavaScript中模拟let表达式?
EN

Stack Overflow用户
提问于 2018-07-18 17:15:24
回答 2查看 671关注 0票数 2

考虑一下take的以下实现

代码语言:javascript
运行
复制
const take = (n, [x, ...xs]) =>
    n === 0 || x === undefined ?
    [] : [x, ...take(n - 1, xs)];

console.log(take(7, [1, 2, 3, 4, 5])); // [1, 2, 3, 4, 5]
console.log(take(3, [1, 2, 3, 4, 5])); // [1, 2, 3]
console.log(take(1, [undefined, 1]));  // []

如您所见,它不适用于undefined数组,因为x === undefined不是测试数组是否为空的最佳方法。以下代码解决了此问题:

代码语言:javascript
运行
复制
const take = (n, xs) =>
    n === 0 || xs.length === 0 ?
    [] : [xs[0], ...take(n - 1, xs.slice(1))];

console.log(take(7, [1, 2, 3, 4, 5])); // [1, 2, 3, 4, 5]
console.log(take(3, [1, 2, 3, 4, 5])); // [1, 2, 3]
console.log(take(1, [undefined, 1]));  // [undefined]

然而,编写xs[0]xs.slice(1)并不那么优雅。此外,如果您需要多次使用它们,则会出现问题。要么您必须重复代码并做不必要的额外工作,要么您必须创建一个块范围,定义常量并使用return关键字。

最好的解决方案是使用让表达。不幸的是,JavaScript没有它们。那么,如何在JavaScript中模拟let表达式呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-18 17:15:24

在Lisp中,让表达只是左边lambda (即立即调用函数表达式)的语法糖。例如,考虑:

代码语言:javascript
运行
复制
(let ([x 1]
      [y 2])
  (+ x y))

; This is syntactic sugar for:

((lambda (x y)
    (+ x y))
  1 2)

在ES6中,我们可以使用箭头函数默认参数创建一个看起来像let表达式的like,如下所示:

代码语言:javascript
运行
复制
const z = ((x = 1, y = 2) => x + y)();

console.log(z);

使用此黑客,我们可以将take定义为:

代码语言:javascript
运行
复制
const take = (n, xxs) =>
    n === 0 || xxs.length === 0 ?
    [] : (([x, ...xs] = xxs) => [x, ...take(n - 1, xs)])();

console.log(take(7, [1, 2, 3, 4, 5])); // [1, 2, 3, 4, 5]
console.log(take(3, [1, 2, 3, 4, 5])); // [1, 2, 3]
console.log(take(1, [undefined, 1]));  // [undefined]

希望这能有所帮助。

票数 7
EN

Stack Overflow用户

发布于 2018-11-23 12:11:41

与其使用IIFE,只需使用带有适当名称的普通函数来使事情更加明确:

代码语言:javascript
运行
复制
const _let = f =>
  f();

const collateBy = f => xs =>
  xs.reduce((m, x) =>
    _let((r = f(x), ys = m.get(r) || []) =>
      m.set(r, (ys.push(x), ys))), new Map());

const includes = t => s =>
  s.includes(t);

xs = ["Dev", "Jeff", "Kalib", "Amy", "Gemma"];

const collation = collateBy(includes("e")) (xs);

console.log(collation.get(true));
console.log(collation.get(false));

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51407631

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档