簡體   English   中英

Javascript跳過函數調用中的參數

[英]Javascript skip arguments in function call

javascript初學者在這里。

假設我有一個帶有 3 個參數的 javascript 函數:

function f(arg1, arg2, arg3) { // do stuff }

我知道我可以調用 f(value1, value2); 在這種情況下,在函數作用域內,arg1 將為 value1,arg2 將為 value2,arg3 將為 null。

一切正常。 但是,如果我想調用只給arg1arg3的函數,我需要做這樣的事情: f(value1, null, value2) ;

有沒有一種方法可以指定哪些參數以更具 C# 風格的方式具有哪些值(而不將未給定的參數指定為 null)? 像這樣:為了調用 f 只為arg1arg3 f(value1, arg3 = value2);我會寫f(value1, arg3 = value2);

有任何想法嗎? 干杯!

我已經看到了一種方法:

例如

function person(name,surname,age)
{
...
}

person('Xavier',null,30);

你可以這樣做:

function person(paramObj)
{
   var name = paramObj.name;
   var surname = paramObj.surname;
   var age = paramObj.age;
}

像這樣調用:

person({name:'Xavier',age:30});

我認為這是您在 c# 中能夠做到的最接近的事情,請記住,JS 未編譯,因此您無法預測函數的參數。

編輯:

為了獲得更好的語法,您可以使用 ES6 對象解構,如下所示:

function person({name, surname, age})
{
   ...
}

https://javascript.info/destructuring-assignment

是的你可以。 可以寫成:

f(arg1, undefined, arg3);

在這個調用中,參數 1 和 3 將通過,而參數 2 不會被發送。

如果你打算這樣做(假設它是有效的)

f(value1, arg3 = value2)

那么參數 2 將是未定義的,所以只需傳遞:

f(value1, undefined, value2)

使用 JS 做到這一點的唯一方法是傳遞一個包含所有參數的數組。

您必須在函數中設置默認值 - 您不能在 JavaScript 中為參數定義默認值。

function foo( args ){
  var arg1 = args[ 0 ] || "default_value";
  var arg2 = args[ 1 ] || 0;
  ///etc...
}

更好的是,您可以傳遞一個簡單的對象而不是數組,該對象允許您通過對象中的鍵訪問參數:

function foo( params ){
  var arg1 = params[ "arg1" ] || "default_value";
  var arg2 = params[ "arg2" ] || 0;
  ///etc...
}

隨着ECMAScript 6 (ECMAScript 2015) 和Default Parameters的引入,它可以像為參數設置默認值並傳遞undefined跳過參數一樣簡單:

 function paramsTest(p1 = "p1 def", p2 = "p2 def", p3 = "p3 def") { console.log([p1, p2, p3]); } paramsTest(); // [ "p1 def", "p2 def", "p3 def"] paramsTest("p#1", "p#2"); // [ "p#1", "p#2", "p3 def"] paramsTest("p#1", undefined, null); // [ "p#1", "p2 def", null]

嘿,我有一個類似的問題,但我不知道它是否適用於任何上下文,以及它是否適用於 ES5,但在 ES6 和我的上下文中,我能夠將 undefined 作為我想跳過的參數傳遞。

我所說的上下文的意思是,在我的情況下,我在具有 ES6 格式的函數中為該參數分配一個默認值:

const exampleFunc = (arg1 = "defaultValue",arg2) => {
    console.log(arg1,arg2)
}

exampleFunc(undefined,"hello!"); 
//this would log to the console "defaultValue","hello!"

如果您沒有在 ES6 格式的函數中分配默認值,我不確定這是否可行,但它對我有用! 希望這有幫助

將此代碼添加到您的函數中(對於默認值)

function f(a, b, c)
{
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  a = typeof c !== 'undefined' ? c : 43;
}

像這樣調用函數

f(arg1 , undefined, arg3)

另一個有趣的方法是使用Function.prototype.call()方法。 我們所要做的就是使用默認調用對象值分配參數,然后您可以自由地僅使用您想使用的參數調用該方法:

 function f(arg1 = this.arg1, arg2 = this.arg2 || false, arg3 = this.arg3) { console.log([arg1, arg2, arg3]); } f.call({ arg1: 'value for arg1', arg3: 'value for arg3'}); f('value for arg1', undefined, 'value for arg3');

請注意,我將 arg2 設置為this.arg2 || false this.arg2 || false - 當不存在 f.call 實例對象 arg2 屬性時,此語法允許回退到 false 而不是 undefined。

在 ES6 中,如果你的參數是可選的,因為它們有默認值並且你可以傳遞一個對象,你可以使用擴展語法:

function f(opts) {
  const args = {
    arg1: 'a',
    arg2: 'b',
    arg3: 'c',
    ...opts
  }
  const {arg1, arg2, arg3} = args
  return arg1.concat(arg2, arg3)
}
f() // "abc"
f({arg1: '1', arg3: '3'}) // "1b3"
f({arg2: ' whatever '}) //  "a whatever c"

暫無
暫無

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

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