簡體   English   中英

在JavaScript中,如何創建一個帶有可選參數的function?

[英]In JavaScript, how can I create a function with an optional parameter?

問題:在帶有可選參數的 JavaScript 中定義 function 的正確方法是什么?

例如:

function myFunc(optionVar1) {
    if(optionVar1 == undefined) {
        ...
    } else {
        ...
    }
}

myFunc('10');  // valid function call
myFunc();      // also a valid function call

使用 a 是否合適? 在 function 聲明中標記 Ruby 表示可選參數:

function myFunc(optionVar1?) {...}  //  <--- notice the ? mark

Javascript中沒有語法指定參數是可選的(或必需的)。 所有參數都是可選的。 如果未指定它們,則它們undefined因此您需要檢查它。 例如,此函數實際上會為參數創建默認值10:

function myfunc(someParam) {
  if (someParam === undefined) {
    someParam = 10;
  }
  ...
}

您還可以使用arguments屬性以編程方式訪問參數。

最后,如果你有超過3-4個參數,通常建議使用匿名對象。

實際上,JS函數中的所有參數都是可選的。 如果省略參數,則沒有警告或錯誤。

您可以設置默認值

function throw_cat(dist){
  dist = typeof dist=='undefined' ? 20 : dist;
   //OR
  dist = dist || 20; //this will assign it to 20 if you pass 0 or another 'falsy' value, though. May be good if you expect a string. String '0' stays, '' or null assigns the default
  //etc...
  }

使用doclet時,可以在注釋部分使用注釋,例如{Object =}或{number =}:

/** 
 * @param {object=}xyz
 */

現代IDE知道識別JavaScript的注釋,並向您顯示代碼中潛在問題的跡象。

例:

/**
 *
 * @param query 
 * @param callback 
 * @param {number=} ttl optional time-to-leave
 */
 loadByJSONP:function loadByJSONP(query, callback, ttl) {
   ...do some work
 }

在這個例子中,'ttl'是可選的。 注釋{number =}向IDE指示此參數是可選的。 因此,當您僅使用兩個參數調用此函數時,您將不會收到警告。

注釋也可用於指定預期類型。 這使您的代碼更好,更不容易出錯。 這是注釋的鏈接:

https://developers.google.com/closure/compiler/docs/js-for-compiler

首先,每個編寫JavaScript的人都幫自己一個忙,並從John Resig 學習高級JavaScript

function myFunc(arg1, arg2 /* varargs... */) {
  var optional = Array.prototype.slice.call( arguments, 2 );

函數的每個參數都是“可選的”,即使是在函數聲明的參數列表中聲明的參數也是如此。

只要考慮好好記錄它們。

某些來源會告訴您完全跳過參數,而是使用arguments數組。 這使您可以獲取提供給函數的任何輸入,並且可以根據需要決定如何響應傳遞給函數的參數。

您可以在此處閱讀更多相關信息: http//www.devguru.org/technologies/ecmascript/quickref/arguments.html

克萊圖斯和達莫維薩提出了很好的建議。 我還想補充一點(像我一樣)可能更喜歡這樣的符號:

function foo(/*bar*/) {
   if (arguments.length == 1) {
      var bar = arguments[0];
      ...
   }
}

這用於向代碼庫的開發人員記錄該參數是可選的並且還記錄了名稱,但它也阻止了參數在調試器中顯示在函數名中(該示例將顯示為foo()而不是foo (optional_argument) 。否則,使用API​​的開發人員可能會認為它是必需的。

編輯:這對於要在內部使用的可選參數特別有用。

我發現的第一個谷歌回復:

http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions

我沒有看到任何使用問號向呼叫者提醒可選參數的情況。 雖然它是用其他語言完成的,但我不認為它在javascript中是必要的。

事實上, 您似乎無法在變量名稱中使用問號 只有字母,數字,$和_。

只是不要使用任何參數定義函數,並從您希望可選參數的函數中訪問特殊參數數組。 以下示例。

<HTML>
<HEAD>
<SCRIPT Language="JavaScript">
function foo() {
  var argv = foo.arguments;
  var argc = argv.length;
  for (var i = 0; i < argc; i++) {
    alert("Argument " + i + " = " + argv[i]);
   }
}
</SCRIPT>
</HEAD>
<BODY onload="foo('hello', 'world');">
</BODY>
</HTML>

使用是否合適? 在函數聲明中標記為Ruby

不,沒有基於語言的方式表示可選的arg。 我絕對認為值得在評論中指出:

function myFunc(var1, var2 /* optional */, var3 /* optional */) {
    if (var2===undefined) ...

(注意精確相等測試的三重等於。否則傳遞的null值也將匹配。對於JS中的大多數比較,您通常需要=== ,因為雙等於是不合需要的弱類型。)

因為當你有一個不確定數量的可選參數時,你通常會從函數語句中省略它們,並且評論是禮貌的:

function myFunc(var1 /* , optional var2..varN */) {
    for (var i= 1; i<arguments.length; i++) ...
// 1. best way
function sum1(x = 1, y = 2) {
    console.log(x + y)
}
sum1()  // x=1,y=2
sum1(4, 5)  // x=4,y=5
sum1(8)  // x=8,y=2

// 2. Ternary way
function sum2(x) {
    x = x !== undefined ? x : 1; // if x define x=x, if undefine x=1
    console.log(x)
}
sum2(1)
sum2(5)
sum2('foo')
sum2()


// logical way
function sum3(x) {
    x = x || 1;  // x = either x if x is true or 1 if x is not false
    console.log(x)
}
sum3(1)
sum3(5)
sum3('foo')
sum3()

為了歷史起見:您可以使用!= null檢查循環您的參數。 例如 :

function container(param1, param2, param3, param4){
    var param1, param2, param3, param4 = 0 // or other data types.
    for (var i = 0; i < arguments.length; i++){
       if(i != null) {
       console.log(i); // or put default values to your parameters if you need to.
    }
}

現在,所有參數都是可選的。

function connect(hostname, port, method) {
   hostname = hostname || "localhost";
   port = port || 80;
   method = method || "GET";
}

Javascript中的重要URL 可選參數

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM