我希望能夠從另一個方法調用中獲取數組,並在將其傳遞給另一個函數時附加一個參數。看了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)
的清晰和簡單。
有沒有人有任何洞察,爲什麼這個成語無法按預期工作?實現能夠傳遞四個元素數組的目標的慣用方法是什麼?其中一個元素是常量,其餘元素來自另一個數組?
'results.push(console.log(e))'將會是一大堆未定義的,因爲'console.log'不會返回任何東西。看起來你正在映射輸入列表,而不是簡單地迭代它。 – ssube
如果你只是想傳遞一個數組,請傳遞一個數組並且不要展開它。 – Bergi