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

Passing array as argument fails in JavaScript in an odd situation

我希望能够从另一个方法调用中获取一个数组,并在将它传递给另一个函数时添加一个额外的参数。阅读 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(coffee版本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).

的清晰和简单

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

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

正确的调用是:

t.some_meth [foo..., 1]

从而传入数组