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

标签 javascript ecmascript-6 functional-programming let

考虑以下 take 的实现:

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 不是测试数组是否为空的最佳方法。下面的代码解决了这个问题:

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) 并不优雅。此外,如果您需要多次使用它们,这是有问题的。您要么必须复制代码并做不必要的额外工作,要么必须创建 block 范围、定义常量并使用 return 关键字。

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

最佳答案

在 Lisp 中,一个 let expression只是左-左 lambda 的语法糖(即 immediately-invoked function expression )。例如,考虑:

(let ([x 1]
      [y 2])
  (+ x y))

; This is syntactic sugar for:

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

在 ES6 中,我们可以使用 arrow functionsdefault parameters创建一个看起来像 let 表达式的 IIFE,如下所示:

const z = ((x = 1, y = 2) => x + y)();

console.log(z);

使用这个 hack,我们可以定义 take 如下:

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]

希望对您有所帮助。

关于javascript - 如何在 JavaScript 中模拟 let 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51407631/

相关文章:

functional-programming - 如何在 F# 递归算法中正确返回生成的序列

javascript - 使用 JS 使用剩余/扩展运算符删除索引

javascript - 在 IE11 中使用 immer

javascript - Electron 预加载函数而不是外部文件?

javascript - 在 ES6 中使用扩展语法时使用默认参数?

javascript - Object.assign 递归不按预期工作

javascript - 从 promise Angular 2内部设置类的全局变量

javascript - 报错 .map() is not a function

javascript - 同位素无法正确显示动态 HTML

javascript - 函数式编程如果