2012-12-05 65 views
0

鑑於這一功能:如何在JavaScript函數中對每個參數做些什麼?

function foo(a,b,c) { 
    // 
} 

你怎麼可以做一些事情,說使用的console.log()爲每一個參數?我知道你可以通過使用arguments關鍵字來看到參數。參數似乎返回看起來像一個數組(但是類型爲「object」[suprise .. not]),但它不支持.forEach,我正在使用Chrome。

我試圖修改函數此,預計它的工作:

function foo(a,b,c) { 
    arguments.forEach(function(arg){ 
     console.log(arg); 
    }); 
} 

你得到類型錯誤的錯誤:對象#有沒有方法「的forEach」。

回答

5

arguments對象不具有forEach方法,所以你需要遍歷,要麼用for循環或for...in循環。

​function foo() { 
    for (var i = 0; i < arguments.length; i++) { 
     console.log(arguments[i]);  
    } 
} 

foo("Foo", { "bar": 0 }); // Output: Foo, Object {bar: 0} 

或者

​function foo() { 
    for (var arg in arguments) { 
     console.log(arguments[arg]); 
    }  
} 

foo("Foo", "Bar"); // Output: Foo, Bar 
+0

不會在'arguments'上使用'for..in'也遍歷'length','callee'和其他屬性? –

+1

@RocketHazmat號長度屬性不是可枚舉的。在上面的例子中,'length'的描述符是'{value:2,可寫:true,可枚舉:false,可配置:true}'。 – Sampson

+0

在第二個例子中,爲什麼需要參數[arg]?爲什麼你不能只是console.log(arg)?我看到,我之前有一個錯字,arg關鍵字是一個索引。 –

1

arguments.length上做一個循環。 arguments不是一個數組,因此它沒有forEach原型方法。

for (var i = 0, l = arguments.length; i<l; ++i) { 
    doSomething(arguments[i]); 
} 
1

只需使用一個正常for循環。您可以將其轉換爲真實數組。

function foo(a,b,c) { 
    var args = Array.prototype.slice.call(arguments); 
    args.forEach(function(arg){ 
     console.log(arg); 
    }); 
} 
0
var show_args = function(){ 

    for(var ar in arguments){ 
     console.log(arguments[ar]) 
    } 
} 
0

您可以通過調用它的陣列切片方法,在 「參數」 轉換爲數組:

function foo(a, b, c) { 
    var argArray = Array.prototype.slice.call(arguments); 
    argArray.forEach(function(x) { 
    // ... 
    }); 
} 
+0

提交相同的解決方案,同一秒...不可能!這必定是那些奇怪的量子世界事物之一。 – phant0m

+0

@ phant0m,低垂果實也存在於正常世界。 :) – bzlm

+0

@bzlm我比時更感到驚訝的內容;) – phant0m

2

MDN

// convert to array 
var args = Array.prototype.slice.call(arguments); 
args.forEach... 
+0

這是我正在尋找的線。關於使用常規for循環的答案是很好的答案,但它讓我回答這個問題:「如果論證不響應forEach,我該如何做到這一點?」。這個答案回答了我還沒有問過的問題。 這就是說,這是需要在每個函數內完成的東西,還是我可以永久性地將參數對象轉換成一個數組(不是說我會想,只是好奇)。 –

+1

@CaleyWoods不,你不能永久這樣做,你必須爲每個功能做到這一點。 – phant0m

3

或者你可以使用黑客:

Array.prototype.forEach.call(arguments, function (arg) { 
    console.log(arg); 
}); 

arguments不是一個數組,但它足夠接近以至於可以應用Array的原型並使用常規數組函數。我們只是抓住Array的實現並將其強制應用於參數。

+0

這又是我走向的方向。我評論了關於phant0ms答案的解釋。 –

+0

如果你只想記錄它,你可以進一步簡化爲'Array.prototype.forEach.call(arguments,console.log,console)',但是我懷疑這就是你所追求的。 – tjameson

+0

tjameson,這是正確的。我有另一個功能,我正在尋找打電話,只是想要一個乾淨的方式來做到這一點,並避免: someFn(a); (b); –

相關問題