我們都知道JS里面參數的傳遞是可以不一樣的,比如我們有一個函數:
<script type="text/javascript"> function one(a,b,c) { this.x = a; console.log(a); } one(1); </script>
我們傳遞的數字只有一個1,但是形參那里有abc三個。這分明對不上啊不是嗎?
這個時候如果我們查看b,c的話會顯示undefined。ps:比如console.log(b)。
當然啦,本來就沒有這兩個數。怎么找給你?
那面對這種實參和形參對不上號的情況,JS是怎么實現的呢?讓我們來看一段代碼:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> <title>JavaScript中函數的形參和實參的區別</title> </head> <body> <script type="text/javascript"> function one(a,b,c) { return one.length; } function two(a,b,c,d,e,f,g){ return arguments.length; } console.log(one()); //3 console.log(two()); //0 </script> </body> </html>
這里我們在one函數里面返回了one.length,在two函數里面返回arguments.length。可能你已經發現了,輸出的one()返回了one.length就是形參的數量,而argument.length就是實參的數量。
瞬間秒懂了有木有?
甚至我們可以用arguments[0]取到實參的數字。
但是為什么沒有形參的數字可以用類似數組的方式這樣表示呢?好吧,我知道你是處女座的凡事要求對稱。除非你形參是數組你可以這樣用。不然在函數里面我們就只能用形參的名字來取得實際的參數了。
在C#,Java里面對參數類型和個數相對JS來說要求十分嚴格,一點對不上就報錯了。而JS就因為有這樣的設計而可以變成相對靈活的語言。
上述方法就是JS依賴的不強制對形參和實參規定個數相等的實現了。至於類型的相同,JS什么類型都可以寫成var a = ……,要類型何用?所以才說JS是一種弱類型的語言嘛!