Bagaimana cara meneruskan nilai 'tidak terdefinisi' ke fungsi dengan banyak parameter?

Saya ingin meneruskan nilai 'tidak terdefinisi' pada fungsi beberapa parameter tetapi tanpa menghilangkan parameternya.

Apa yang saya maksud dengan "tanpa menghilangkan parameter". Maksud saya, kita tidak boleh menghilangkan parm2 seperti contoh ini:

function myFunction (parm1, parm2) {}
myFunction("abc");

Ini memang akan membuat parm2 tidak terdefinisi, tetapi saya tidak diperbolehkan melakukannya dengan cara ini karena saya perlu menentukan parameter lain SETELAH parameter yang dihilangkan, jadi metode sebelumnya tidak akan berfungsi jika saya ingin membuat parm1 tidak terdefinisi TETAPI juga ingin untuk memiliki parameter lain setelah ini untuk menyimpan nilai.

Saya telah mencoba menyelesaikan masalah dengan:

myFunction( ,"abc"); //doesn't seem to work

Pembaruan:

dan myFunction(undefined, "abc"); « ini berfungsi dengan baik sekarang.

Namun, perlu disebutkan bahwa:

Menetapkan variabel ke undefined dianggap sebagai praktik buruk, kita harus menggunakan null sebagai gantinya.


person ajax333221    schedule 25.01.2012    source sumber


Jawaban (12)


myFunction(undefined,"abc"); seharusnya cara ini bisa, apa masalahnya?

lihat di sini

Berikut adalah dokumentasi yang belum ditentukan dari mozilla, didukung oleh semua browser

person xdazz    schedule 25.01.2012
comment
Mengapa undefinisi yang tidak dapat ditulis akan membuat perbedaan? Itu tidak mempengaruhi meneruskannya ke suatu fungsi. - person Ted Bigham; 05.09.2015
comment
@TedBigham karena tidak dapat ditulis berarti tidak dapat disetel ke nilai di suatu tempat sebelumnya dalam kode, artinya (berdasarkan spesifikasi) harus selalu dianggap tidak terdefinisi - person Brian Leishman; 19.04.2016
comment
@BrianLeishman Saya setuju Anda tidak dapat memberikan nilai pada kata kunci yang tidak terdefinisi, tetapi hal itu tidak akan berpengaruh pada meneruskannya sebagai argumen ke suatu fungsi. - person Ted Bigham; 20.04.2016
comment
@TedBigham Menurut saya intinya adalah Anda dapat menggunakannya dengan aman. Seperti misalnya saya dapat meneruskan kfdjhsdfgsdf ke suatu fungsi karena mungkin belum ditentukan, tetapi ada kemungkinan fungsi tersebut memiliki nilai dan mungkin memiliki hasil yang tidak diinginkan jika digunakan dengan anggapan bahwa fungsi tersebut tidak ditentukan, sedangkan undefined tidak dapat disetel dan seharusnya tidak memberikan hasil yang tidak diinginkan - person Brian Leishman; 20.04.2016
comment
Menyetel variabel ke undefined dianggap sebagai praktik buruk. Anda harus memberikan nilai null. Info lebih lanjut di Apa perbedaan antara null dan tidak terdefinisi dalam JavaScript? - person Carlos Morales; 30.09.2016

void Operator tampaknya merupakan operator yang paling umum cara untuk secara eksplisit mendapatkan undefined.

Anda akan menggunakannya seperti ini dalam contoh Anda:

myFunction(void 0, "abc");

Ini juga merupakan metode yang dapat diandalkan untuk membandingkan dengan undefined yang dilindungi dari undefined yang secara tidak sengaja ditimpa di lingkungan JavaScript lama:

var x;
if (x === void 0) {
    // this will execute
}
person bkbooth    schedule 04.05.2015

Pendekatan yang lebih baik mungkin meneruskan Object dengan atribut bernama dan kemudian mencari nilai atribut spesifik tersebut. Dengan cara ini Anda tidak harus bergantung pada jumlah argumen.
Contoh: Object.dummy

person dbrin    schedule 25.01.2012
comment
+1 untuk menyarankan agar fungsi tersebut dapat ditulis ulang. - person davidchambers; 25.01.2012
comment
Ini bukanlah saran yang buruk, namun agak sombong jika mengatakan bahwa ini selalu merupakan pendekatan yang lebih baik, dan hal ini tidak benar-benar menjawab pertanyaan. - person Flimzy; 06.06.2014
comment
Tidak ada yang mengatakan itu selalu lebih baik. Saya tidak melihat apa yang Anda anggap arogan tentang jawabannya, ini hanyalah cara lain untuk meneruskan parameter yang menghindari masalah parameter posisi. - person dbrin; 06.06.2014
comment
Argumen fungsi tradisional sebaiknya dibiasakan. - person Tomáš Zato - Reinstate Monica; 23.10.2014
comment
Akan menjadi jawaban yang sangat bagus dengan contoh kecil tentang bagaimana melakukan ini. - person alphapilgrim; 22.12.2015
comment
Itu sebenarnya jenius, kenapa saya tidak pernah memikirkan hal itu. Terima kasih @dbrin - person Backer; 20.10.2016
comment
Meskipun saran ini bagus, Anda tidak akan dapat mengubah fungsi pihak ketiga mana pun yang mengharuskan Anda meneruskan parameter secara mentah. Saya pikir solusi @bkbooth harus ditandai sebagai jawaban yang benar. - person Kostanos; 10.01.2017
comment
Merupakan ide terburuk untuk keterbacaan menggunakan Object.dummy sebagai undefined. - person poletaew; 06.11.2018
comment
@poletaew : Dia tidak bermaksud menggunakan Object.dummy sebagai tidak terdefinisi. Maksudnya menggunakan gaya params opsional dengan membungkus suatu objek. - person Ayyappa; 29.08.2019

Saya baru saja mendapat ide dan sepertinya berhasil:

var undf;

myFunction(undf, "abc");

Saya yakin ada cara yang lebih baik, namun saya memposting ini

person ajax333221    schedule 25.01.2012

Anda perlu menangani pemanggilan fungsi dengan variabel tidak terdefinisi dalam kode fungsi itu sendiri dengan salah satu cara berikut :-

 function myFunction (parm1, parm2) {

         if (parm1 !== undefined) {
             // execute code if 1st param is undefined
        }

         if (parm2 !== undefined) {
             // execute code if 2 param is undefined
        }

        // execute other part of code

    }

Sekarang Anda dapat memanggil fungsi di atas dengan cara berikut:-

myFunction(undefined,"abc"); // with 1st param value not known

myFunction("cde",undefined); // with 2nd param value not known

myFunction("cde","abc");  // with both param value known
person Nipun Madan    schedule 24.04.2018

Saya pikir cara terdekat Anda dengan ini adalah dengan meneruskan null sebagai parameter. Ini bukan undefined, tetapi untuk sebagian besar kasus, cukup mendekati.

person Niet the Dark Absol    schedule 25.01.2012
comment
typeof null == "object" yang cukup menyesatkan. - person Tomáš Zato - Reinstate Monica; 23.10.2014
comment
@TomášZato null === null, yang tidak menyesatkan sama sekali - person Braden Best; 17.06.2017
comment
@BradenBest Saya pikir maksud Tomáš Zato adalah bahwa sekarang pemeriksaan bersyarat lainnya perlu dilakukan, daripada hanya mengandalkan typeof. Saya pribadi menganggapnya menjengkelkan. - person Dejay Clayton; 08.03.2018

Coba gunakan metode ini jika Anda berencana menambahkan parameter dalam jumlah tidak terbatas:

function myFunc(params) {
    // Define default values
    var name = 'John';
    var age = '40';
    // You can loop through them
    for (var p in params) {
        alert(p + ':' + params[p]);
    }
    // And read them in like this
    if (typeof params.name != 'undefined') {
        name = params.name;
    }
    if (typeof params.age != 'undefined') {
        age = params.age;
    }
    alert(name + ' ' + age);
}

alert('test1');
myFunc({name:'Bob', age:'30'});
alert('test2');
myFunc({name:'Bob'});
person Aram Kocharyan    schedule 25.01.2012

Jika memungkinkan, dapatkah Anda mengatur ulang fungsinya sebagai myFunction (parm2, parm1)

yaitu. cobalah untuk memastikan kemungkinan parameter yang tidak ditentukan berada di urutan terakhir dalam fungsi, ini mungkin tidak berfungsi jika lebih banyak parameter yang dimasukkan.

person Tomy Varghese    schedule 04.07.2014

Anda dapat menggunakan apply dan array parameter untuk meneruskan "tidak terdefinisi" sebagai salah satu parameter. Misalnya, Anda ingin meneruskan parm1 sebagai "tidak terdefinisi":

function myFunction (parm1, parm2) {

    if(typeof (parm1) === "undefined"){
        alert("parm1 is undefined")
    }

    if(typeof (parm2) === "undefined"){
        alert("parm2 is undefined")
    }

}

var myParameters = [undefined, "abc"];

myFunction.apply(valueForThis, myParameters );
person Edward Olamisan    schedule 19.08.2015

myFunction(undefined,"abc") seharusnya berhasil, kecuali seseorang yang kejam telah mendefinisikan ulang undefined! Jika Anda ingin aman, ada lusinan cara untuk mendapatkan nilai tak terdefinisi yang menghindari asumsi bahwa benda yang disebut "tidak terdefinisi" sebenarnya memiliki nilai khusus tak terdefinisi:

void 0
var undef; undef
[][0]
{}.foo
// `undef` is guaranteed to have the undefined value within this closure
(function(undef){ undef }())
// this expression evaluates as undefined
(function(){}())

void 0 adalah yang paling banyak digunakan (CoffeScript yang dikompilasi menyertakan ini di mana pun nilai yang tidak ditentukan diperlukan).

person davidchambers    schedule 25.01.2012
comment
Hal ini baik untuk diketahui, meskipun kami akan mendukung mesin JavaScript lama untuk beberapa waktu. - person davidchambers; 04.02.2012
comment
Komentar terlambat, tetapi bagi orang lain yang membaca ini: tidak dapat ditulisi sama sekali tidak ada hubungannya dengan kemampuan untuk meneruskan undefined langsung ke suatu fungsi. Meskipun undefined jelas tidak dapat ditulis, itu tidak relevan dengan pertanyaan ini. - person michael; 08.04.2016

Cara mudah untuk melakukan hal ini, jika dapat diterima adalah dengan meneruskan tidak terdefinisi. Namun lebih baik lagi sebagai berikut per W3C

Argumen Javascript tidak ada

function myFunction(x, y) {
if (y === undefined) {
      y = 0;
    } 
}
person alphapilgrim    schedule 21.12.2015

Sekadar memberi contoh tentang apa yang dijelaskan @dbrin, dan @alphapilgrim mungkin ingin memeriksanya.

simpleFunction({params1:12, params2:"abc"}); //use expected arguments
simpleFunction({params2:"abc"}); //use only one
simpleFunction({params2:"abc", params1:12, iDoNotExist:"I will not be included"}); //use expected arguments in any order
simpleFunction(); //ignore arguments and uses defaults
simpleFunction(2123); //ignores non object arguments 

function simpleFunction(someParams){
  var myParams = {
    params1:null,
    params2:"cde" //default value for second parameter
  };
  simpleExtend(myParams, someParams);
  
  console.log(myParams);

}


//to include in your utilities
function simpleExtend(currentParams, newParams){
  
  if(typeof currentParams !== "undefined" && typeof newParams !== "undefined"){
    Object.keys(newParams).forEach(function(key){
   
      if(typeof currentParams[key] !== "undefined"){
        currentParams[key] = newParams[key];    
      }

    });
 
  
  }
  
 

}

person MFAL    schedule 24.11.2016