在奇怪的情况下,在JavaScript中传递数组作为参数失败

时间:2015-06-23 16:13:04

标签: javascript coffeescript

我希望能够从另一个方法调用中获取一个数组,并在将其传递给另一个函数时添加一个额外的参数。阅读this answer后,我制作了以下CoffeeScript:

class TestMe
  some_meth: (four) ->
    (console.log e) for e in four

foo= [37.5,5,255.0]
t= new TestMe()
t.some_meth(foo...,1)

它编译成以下JavaScript(咖啡版本1.9.1):

(function() {
  var TestMe, foo, t,
    slice = [].slice;
  TestMe = (function() {
    function TestMe() {}
    TestMe.prototype.some_meth = function(four) {
      var e, i, len, results;
      results = [];
      for (i = 0, len = four.length; i < len; i++) {
        e = four[i];
        results.push(console.log(e));
      }
      return results;
    };
    return TestMe;
  })();
  foo = [37.5, 5, 255.0];
  t = new TestMe();
  t.some_meth.apply(t, slice.call(foo).concat([1]));
}).call(this);

这不会产生任何输出。

在调试器(node debug)中单步执行,我发现函数的参数只是数组的第一个元素(而不是数组)。这很奇怪,因为如果我在调试器中执行slice.call(foo).concat([1]),我会得到一个数组作为输出。如果我将some_meth的签名更改为接受四个参数,则输出符合预期。

显然,我可以使用一些解决方法,而且我会使用其中一种,但我当然更喜欢能够写出t.some_meth(foo...,1)的清晰度和简单性。

有没有人能够深入了解为什么这个成语无法按预期工作?实现能够传递四个元素数组的目标的惯用方法是什么,其中一个元素是常量,其余元素来自另一个数组?

1 个答案:

答案 0 :(得分:2)

您的错误位于t.some_meth(foo...,1)。您将数字数组[37.5, 5, 255.0, 1]的内容作为参数传递给t.some_meth。因此,ìn失败,因为四个不是数组而是数字37.5

正确的电话会是:

t.some_meth [foo..., 1]

因此传入数组。