จะส่งค่า 'ไม่ได้กำหนด' ไปยังฟังก์ชันที่มีหลายพารามิเตอร์ได้อย่างไร

ฉันต้องการส่งผ่านค่า 'unknown' บนฟังก์ชันหลายพารามิเตอร์ แต่โดยไม่ละเว้นพารามิเตอร์

ฉันหมายถึงอะไรกับ "โดยไม่ละเว้นพารามิเตอร์" ฉันหมายความว่าเราไม่ควรละเว้น parm2 เหมือนตัวอย่างนี้:

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

สิ่งนี้จะทำให้ parm2 ไม่ได้กำหนดไว้จริง ๆ แต่ฉันไม่ได้รับอนุญาตให้ทำเช่นนี้เพราะฉันจะต้องระบุพารามิเตอร์อื่น ๆ หลังจากพารามิเตอร์ที่ถูกละเว้น ดังนั้นวิธีการก่อนหน้านี้จะไม่ทำงานในกรณีที่ฉันต้องการทำให้ parm1 ไม่ได้กำหนด แต่ต้องการด้วย เพื่อให้มีพารามิเตอร์อื่นหลังจากพารามิเตอร์นี้เพื่อเก็บค่า

ฉันได้ลองแก้ไขปัญหาด้วย:

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

อัปเดต:

และ myFunction(undefined, "abc"); « ใช้งานได้อย่างน่าเชื่อถือแล้ว

อย่างไรก็ตาม เป็นที่น่าสังเกตว่า:

การตั้งค่าตัวแปรเป็น undefined ถือเป็นแนวทางปฏิบัติที่ไม่ดี เราควรใช้ null แทน


person ajax333221    schedule 25.01.2012    source แหล่งที่มา


คำตอบ (12)


myFunction(undefined,"abc"); วิธีนี้น่าจะได้ผล มีปัญหาอะไร?

ดูที่นี่

นี่คือเอกสารที่ไม่ได้กำหนดจาก mozilla สนับสนุนโดย เบราว์เซอร์ทั้งหมด

person xdazz    schedule 25.01.2012
comment
เหตุใดการที่ไม่สามารถเขียนไม่ได้ไม่ได้กำหนดจึงสร้างความแตกต่าง? นั่นไม่ส่งผลกระทบต่อการส่งผ่านไปยังฟังก์ชัน - person Ted Bigham; 05.09.2015
comment
@TedBigham ไม่สามารถเขียนได้หมายความว่าไม่สามารถตั้งค่าเป็นค่าใดที่หนึ่งก่อนหน้านี้ในโค้ดได้ ความหมาย (ตามข้อมูลจำเพาะ) ว่าควรถือว่าไม่ได้กำหนดไว้เสมอ - person Brian Leishman; 19.04.2016
comment
@BrianLeishman ฉันยอมรับว่าคุณไม่สามารถกำหนดค่าให้กับคำหลักที่ไม่ได้กำหนดได้ แต่นั่นไม่ควรมีผลต่อการส่งผ่านเป็นอาร์กิวเมนต์ให้กับฟังก์ชัน - person Ted Bigham; 20.04.2016
comment
@TedBigham ฉันคิดว่าประเด็นก็คือคุณสามารถใช้งานได้อย่างปลอดภัย เช่นตัวอย่าง ฉันสามารถส่ง kfdjhsdfgsdf ไปยังฟังก์ชันได้เนื่องจากอาจไม่ได้ถูกกำหนดไว้ แต่มีความเป็นไปได้ที่ฟังก์ชันนั้นมีค่าและอาจมีผลลัพธ์ที่ไม่ได้ตั้งใจหากใช้โดยคิดว่าไม่ได้กำหนดไว้ ในขณะที่ undefined ไม่สามารถตั้งค่าได้ และไม่ควรได้รับผลที่ไม่ได้ตั้งใจ - person Brian Leishman; 20.04.2016
comment
การตั้งค่าตัวแปรเป็น undefined ถือเป็นวิธีปฏิบัติที่ไม่ถูกต้อง คุณควรส่งค่า null ข้อมูลเพิ่มเติมที่ ความแตกต่างระหว่าง null และ undefinition ใน JavaScript คืออะไร - person Carlos Morales; 30.09.2016

void โอเปอเรเตอร์น่าจะเป็นตัวดำเนินการที่พบบ่อยที่สุด วิธีรับ undefined อย่างชัดเจน

คุณจะใช้มันแบบนี้ในตัวอย่างของคุณ:

myFunction(void 0, "abc");

นอกจากนี้ยังเป็นวิธีที่เชื่อถือได้ในการเปรียบเทียบกับ undefined ที่ได้รับการปกป้องจาก undefined ที่ถูกแทนที่โดยไม่ตั้งใจในสภาพแวดล้อม JavaScript แบบเก่า:

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

แนวทางที่ดีกว่าอาจส่ง Object ด้วยแอตทริบิวต์ที่มีชื่อ จากนั้นมองหาค่าแอตทริบิวต์เฉพาะเหล่านั้น ด้วยวิธีนี้คุณไม่จำเป็นต้องขึ้นอยู่กับจำนวนอาร์กิวเมนต์
ตัวอย่าง: Object.dummy

person dbrin    schedule 25.01.2012
comment
+1 สำหรับการแนะนำว่าฟังก์ชันที่เป็นปัญหาสามารถเขียนใหม่ได้ - person davidchambers; 25.01.2012
comment
ไม่ใช่คำแนะนำที่ไม่ดี แต่ก็เย่อหยิ่งเล็กน้อยที่จะแนะนำว่านี่เป็นแนวทางที่ดีกว่าเสมอ และไม่ได้ตอบคำถามจริงๆ - person Flimzy; 06.06.2014
comment
ไม่มีใครบอกว่ามันดีกว่าเสมอ ฉันไม่เห็นสิ่งที่คุณคิดว่าหยิ่งเกี่ยวกับคำตอบ มันเป็นเพียงวิธีอื่นในการส่งผ่านพารามิเตอร์เพื่อหลีกเลี่ยงปัญหาของพารามิเตอร์ตำแหน่ง - person dbrin; 06.06.2014
comment
อาร์กิวเมนต์ของฟังก์ชันแบบดั้งเดิมจะดีกว่าในการทำความคุ้นเคย - person Tomáš Zato - Reinstate Monica; 23.10.2014
comment
จะเป็นคำตอบที่ดีเป็นพิเศษพร้อมตัวอย่างเล็กๆ น้อยๆ ของวิธีการทำเช่นนี้ - person alphapilgrim; 22.12.2015
comment
นั่นเป็นอัจฉริยะจริงๆ ทำไมฉันไม่เคยคิดอย่างนั้นเลย ฉันขอบคุณ @dbrin - person Backer; 20.10.2016
comment
แม้ว่าคำแนะนำนี้จะดี แต่คุณจะไม่สามารถเปลี่ยนฟังก์ชันของบุคคลที่สามใดๆ ที่คุณต้องส่งพารามิเตอร์ในรูปแบบ Raw ได้ ฉันคิดว่าโซลูชัน @bkbooth ควรทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง - person Kostanos; 10.01.2017
comment
เป็นความคิดที่แย่ที่สุดสำหรับความสะดวกในการอ่านที่จะใช้ Object.dummy เป็น undefined - person poletaew; 06.11.2018
comment
@poletaew : เขาไม่ได้ตั้งใจจะใช้ Object.dummy เหมือนไม่ได้กำหนด เขาหมายถึงการใช้รูปแบบทางเลือกโดยห่อวัตถุ - person Ayyappa; 29.08.2019

ฉันเพิ่งมีความคิดและดูเหมือนว่าจะได้ผล:

var undf;

myFunction(undf, "abc");

ฉันแน่ใจว่ามีวิธีที่ดีกว่า แต่ฉันโพสต์สิ่งนี้

person ajax333221    schedule 25.01.2012

คุณต้องจัดการการเรียกใช้ฟังก์ชันด้วยตัวแปรที่ไม่ได้กำหนดในโค้ดฟังก์ชันด้วยวิธีใดวิธีหนึ่งต่อไปนี้:-

 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

    }

ตอนนี้คุณสามารถเรียกใช้ฟังก์ชันข้างต้นได้ด้วยวิธีต่อไปนี้:-

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

ฉันคิดว่าสิ่งที่ใกล้เคียงที่สุดที่คุณจะได้รับคือส่ง null เป็นพารามิเตอร์ ไม่ใช่ undefined แต่โดยส่วนใหญ่แล้วถือว่าใกล้เคียงพอ

person Niet the Dark Absol    schedule 25.01.2012
comment
typeof null == "object"ซึ่งค่อนข้างทำให้เข้าใจผิด - person Tomáš Zato - Reinstate Monica; 23.10.2014
comment
@ TomášZato null === null ซึ่งไม่ได้ทำให้เข้าใจผิดเลย - person Braden Best; 17.06.2017
comment
@BradenBest ฉันคิดว่าประเด็นของTomáš Zato คือตอนนี้จำเป็นต้องดำเนินการตรวจสอบตามเงื่อนไขอีกครั้งแทนที่จะพึ่ง typeof โดยส่วนตัวแล้วฉันพบว่ามันน่ารำคาญ - person Dejay Clayton; 08.03.2018

ลองใช้วิธีนี้หากคุณวางแผนที่จะเพิ่มพารามิเตอร์จำนวนไม่จำกัด:

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

หากเป็นไปได้ คุณช่วยจัดเรียงฟังก์ชันใหม่เป็น myFunction (parm2, parm1) ได้ไหม

เช่น. พยายามตรวจสอบให้แน่ใจว่าพารามิเตอร์ที่ไม่ได้กำหนดที่เป็นไปได้นั้นอยู่ในฟังก์ชันสุดท้าย ซึ่งอาจไม่ทำงานหากมีการแนะนำพารามิเตอร์เพิ่มเติม

person Tomy Varghese    schedule 04.07.2014

คุณสามารถใช้ apply และอาร์เรย์ได้ ของพารามิเตอร์ที่จะส่ง "unknown" เป็นหนึ่งในพารามิเตอร์ ตัวอย่างเช่น คุณต้องการส่ง parm1 เป็น "unknown":

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") ควรได้ผลอย่างแน่นอน เว้นแต่ว่ามีคนที่โหดร้ายได้ นิยามใหม่ undefined! หากคุณต้องการความปลอดภัย มีหลายวิธีในการรับค่าที่ไม่ได้กำหนด ซึ่งหลีกเลี่ยงการสันนิษฐานว่าสิ่งที่เรียกว่า "ไม่ได้กำหนด" จริงๆ แล้วมีค่าที่ไม่ได้กำหนดพิเศษ:

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 ถูกใช้อย่างแพร่หลายที่สุด (CoffeeScript ที่คอมไพล์จะรวมสิ่งนี้ไว้ทุกที่ที่ต้องการค่าที่ไม่ได้กำหนด)

person davidchambers    schedule 25.01.2012
comment
เป็นเรื่องน่ารู้ แม้ว่าเราจะสนับสนุนเอ็นจิ้น JavaScript รุ่นเก่ามาระยะหนึ่งแล้วก็ตาม - person davidchambers; 04.02.2012
comment
ความคิดเห็นล่าช้า แต่สำหรับคนอื่นที่อ่านข้อความนี้: การไม่สามารถเขียนได้ไม่เกี่ยวอะไรกับความสามารถในการส่ง undefined ไปยังฟังก์ชันโดยตรง แม้ว่า undefined จะเขียนไม่ได้อย่างแน่นอน แต่ก็ไม่เกี่ยวข้องกับคำถามนี้ - person michael; 08.04.2016

วิธีง่ายๆ ในการทำเช่นนี้ เมื่อยอมรับได้คือผ่าน undefinition แต่ยังดีกว่าดังต่อไปนี้ตาม W3C

อาร์กิวเมนต์ที่ขาดหายไปของ Javascript

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

เพียงเพื่อให้ตัวอย่างเกี่ยวกับสิ่งที่ @dbrin อธิบาย และ @alphapilgrim อาจต้องการตรวจสอบ

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