当前位置: 首页 > 知识库问答 >
问题:

javascript - 为什么这样构造得到的函数长度为0?

董阳平
2023-08-30
function pipe(...fns) {  if (arguments.length === 0) {    throw new Error('pipe requires at least one argument');  }  return function(...param) {    return fns.reduce((pre, fn) => {      if (Array.isArray(pre)) {        return fn.apply(this,pre);      }      return  fn.apply(this,[pre]);    }, param);  };}var f = function(a, b, c) { return [a, b, c]; };var g = pipe(f);console.log('g: ', g.length);var f1 = pipe(parseInt, R.multiply, R.map);console.log('g: ', f1.length);
var assert = require('assert');var R = require('../source/index.js');var eq = require('./shared/eq.js');describe('pipe', function() {  it('is a variadic function', function() {    eq(typeof R.pipe, 'function');    eq(R.pipe.length, 0);  });  it('performs left-to-right function composition', function() {    //  f :: (String, Number?) -> ([Number] -> [Number])    var f = R.pipe(parseInt, R.multiply, R.map);    // eq(f.length, 2);    eq(f('10')([1, 2, 3]), [10, 20, 30]);    eq(f('10', 2)([1, 2, 3]), [2, 4, 6]);  });  it('passes context to functions', function() {    function x(val) {      return this.x * val;    }    function y(val) {      return this.y * val;    }    function z(val) {      return this.z * val;    }    var context = {      a: R.pipe(x, y, z),      x: 4,      y: 2,      z: 1    };    eq(context.a(5), 40);  });  it('throws if given no arguments', function() {    assert.throws(      function() { R.pipe(); },      function(err) {        return err.constructor === Error &&               err.message === 'pipe requires at least one argument';      }    );  });  it('can be applied to one argument', function() {    var f = function(a, b, c) { return [a, b, c]; };    var g = R.pipe(f);    // eq(g.length, 3);    eq(g(1, 2, 3), [1, 2, 3]);  });});

上述代码是我在进行 ramda 函数库的 pipe 实现过程中的代码。
我无法通过测试用例 performs left-to-right function composition
和 can be applied to one argument

我发现是因为我是实现的代码 f的长度都是0,
所以我想问什么原因造成的这个问题,如何解决?

ramda - test -pipe

共有2个答案

鞠乐
2023-08-30

在 JavaScript 中,函数的 .length 属性代表函数定义时声明的形参数量(named parameters count),不包括剩余参数。

例如:

function example(a, b, ...rest) {}console.log(example.length); // 输出 2,因为有两个命名参数 a 和 b

而在 remada 中是通过 a,b,c 具名设置的:https://github.com/ramda/ramda/blob/master/source/internal/_arity.js#L1

仰雅昶
2023-08-30

因为length属性表示该函数预期传入的参数个数,而不是函数定义中声明的参数个数。而在你的代码中,函数 f 接收三个参数,但是它并没有显式地声明这些参数,所以它的 length 属性为 0,这是符合预期的。简单说就是属性没有定义。

var f = R.pipe(R.nAry(3, parseInt), R.multiply, R.map);

在f这里定义一个3就可以解决这个问题了。

 类似资料:
  • 请问这样的构造函数如何实现?

  • 突然很好奇,在前端日常开发中,需要经常和 dom 打交道,所以经常要用到 querySelectorAll 和 document.body.getChildren 等方法,但是它们的返回值都是一个类数组类型,我们就需要用一些方法,比如拓展运算符、Array.from 等将它们转换为真数组 来进行操作。 问题: 类数组的意义在哪里?dom 的哪些方法为什么不直接返回一个真数组呢?

  • 问题内容: 这有任何重要目的吗?可以省略吗? 问题答案: 并非总是必要的,但是它确实有其用途。假设我们想在基类上创建一个复制方法。像这样: 现在,当我们创建一个新的并复制它时会发生什么? 该副本不是的实例。这是因为(没有显式检查),我们无法从“基本”类返回副本。我们只能返回。但是,如果我们重置了构造函数: …然后一切都按预期进行:

  • 类有2个构造函数 oracle的第二个构造函数的描述如下 谁能解释一下?

  • 问题内容: 这些来自github上的spring amqp示例,位于https://github.com/SpringSource/spring-amqp- samples.git 这些是 什么类型的Java构造函数?它们是吸气剂和吸气剂的捷径吗? 与此相反 问题答案: 这些构造函数被重载以使用调用另一个构造函数。第一个无参数构造函数使用空参数调用第二个。第二呼叫的第三构造(未示出),其必须采取,