javascript जावास्क्रिप्ट फ़ंक्शन के लिए डिफ़ॉल्ट पैरामीटर मान सेट करें



function parameters (14)

मैं एक जावास्क्रिप्ट फ़ंक्शन को वैकल्पिक तर्क प्राप्त करना चाहता हूं जिसे मैंने डिफ़ॉल्ट पर सेट किया है, जो मान को परिभाषित नहीं किया जाता है। रूबी में आप इसे इस तरह से कर सकते हैं:

def read_file(file, delete_after = false)
  # code
end

क्या यह जावास्क्रिप्ट में काम करता है?

function read_file(file, delete_after = false) {
  // Code
}

https://src-bin.com


Answer #1

ES6 / ES2015 से, डिफ़ॉल्ट पैरामीटर भाषा विनिर्देशन में है।

function read_file(file, delete_after = false) {
  // Code
}

बस काम करता है।

संदर्भ: डिफ़ॉल्ट पैरामीटर्स - एमडीएन

डिफ़ॉल्ट फ़ंक्शन पैरामीटर औपचारिक पैरामीटर को डिफ़ॉल्ट मानों के साथ प्रारंभ करने की अनुमति देते हैं यदि कोई मान या अपरिभाषित नहीं किया जाता है।

आप विनाशकारी के माध्यम से डिफ़ॉल्ट नामित पैरामीटर भी अनुकरण कर सकते हैं:

// the `= {}` below lets you call the function without any parameters
function myFor({ start = 5, end = 1, step = -1 } = {}) { // (A)
    // Use the variables `start`, `end` and `step` here
    ···
}

प्री ES2015 ,

बहुत सारे तरीके हैं, लेकिन यह मेरी पसंदीदा विधि है - यह आपको झूठी या शून्य सहित, जो कुछ भी आप चाहते हैं उसे पार करने देता है। ( typeof null == "object" )

function foo(a, b) {
  a = typeof a !== 'undefined' ? a : 42;
  b = typeof b !== 'undefined' ? b : 'default_b';
  ...
}

Answer #2

अगर किसी कारण से आप ES6 पर नहीं हैं और यहां lodash का उपयोग कर रहे हैं lodash माध्यम से डिफ़ॉल्ट फ़ंक्शन पैरामीटर के लिए एक संक्षिप्त तरीका है विधि:

var fn = function(a, b) {
  a = _.defaultTo(a, 'Hi')
  b = _.defaultTo(b, 'Mom!')

  console.log(a, b)
}

fn()                 // Hi Mom!
fn(undefined, null)  // Hi Mom!
fn(NaN, NaN)         // Hi Mom!
fn(1)                // 1 "Mom!"
fn(null, 2)          // Hi 2
fn(false, false)     // false false
fn(0, 2)             // 0 2
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

यदि वर्तमान मान NaN , null , या अपरिभाषित है तो डिफ़ॉल्ट सेट करेगा


Answer #3

एक अद्यतन के रूप में ... ECMAScript 6 के साथ आप अंतिम रूप से फ़ंक्शन पैरामीटर घोषणाओं में डिफ़ॉल्ट मान सेट कर सकते हैं:

function f (x, y = 7, z = 42) {
  return x + y + z
}

f(1) === 50

जैसा कि संदर्भित है - http://es6-features.org/#DefaultParameterValues


Answer #4

जावास्क्रिप्ट में डिफ़ॉल्ट पैरामीटर मानों का उपयोग करते समय मैं अत्यधिक सावधानी बरतता हूं। यह अक्सर बग बनाता है जब उच्च आदेश कार्यों के संयोजन के साथ प्रयोग किया जाता है जैसे forEach , map , और reduce । उदाहरण के लिए, कोड की इस पंक्ति पर विचार करें:

['1', '2', '3'].map(parseInt); // [1, NaN, NaN]

parseInt में एक वैकल्पिक दूसरा पैरामीटर function parseInt(s, [ radix =10]) लेकिन मानचित्र तीन तर्कों के साथ parseInt कॉल करता है: ( तत्व , अनुक्रमणिका , और सरणी )।

मेरा सुझाव है कि आप अपने आवश्यक पैरामीटर को अपने वैकल्पिक / डिफ़ॉल्ट मूल्यवान तर्कों को अलग करें। यदि आपका फ़ंक्शन 1,2, या 3 आवश्यक पैरामीटर लेता है जिसके लिए कोई डिफ़ॉल्ट मान समझ में नहीं आता है, तो उन्हें फ़ंक्शन में स्थितित्मक पैरामीटर बनाएं, किसी भी वैकल्पिक पैरामीटर को एक ऑब्जेक्ट के नामांकित विशेषताओं के रूप में पालन करना चाहिए। यदि आपका फ़ंक्शन 4 या अधिक लेता है, तो शायद यह एक ऑब्जेक्ट पैरामीटर के गुणों के माध्यम से सभी तर्कों को आपूर्ति करने के लिए अधिक समझ में आता है।

आपके मामले में मैं सुझाव दूंगा कि आप अपना डिलीटफाइल फ़ंक्शन इस प्रकार लिखें:

// unsafe
function read_file(fileName, deleteAfter=false) {
    if (deleteAfter) {
        console.log(`Reading and then deleting ${fileName}`);
    } else {
        console.log(`Just reading ${fileName}`);
    }
}

// better
function readFile(fileName, options={}) {
  const { deleteAfter = false } = options || {}; // if null
  read_file(fileName, deleteAfter);
}

console.log('unsafe...');
['log1.txt', 'log2.txt', 'log3.txt'].map(read_file);

console.log('better...');
['log1.txt', 'log2.txt', 'log3.txt'].map(readFile);

उपरोक्त स्निपेट को चलाने से अप्रयुक्त पैरामीटर के लिए डिफ़ॉल्ट तर्क मानों के पीछे छिपाने वाले खतरों को दिखाया गया है।


Answer #5

बस अपरिभाषित के साथ एक स्पष्ट तुलना का उपयोग करें।

function read_file(file, delete_after)
{
    if(delete_after === undefined) { delete_after = false; }
}

Answer #6

माइक्रोसॉफ्ट एज में कोड काम करने में रुचि रखने वाले किसी भी व्यक्ति के लिए, फ़ंक्शन पैरामीटर में डिफ़ॉल्ट का उपयोग न करें।

function read_file(file, delete_after = false) {
    #code
}

उस उदाहरण में एज एक त्रुटि "उम्मीद कर रहा है" फेंक देगा) '"

इस उपयोग के आसपास पाने के लिए

function read_file(file, delete_after) {
  if(delete_after == undefined)
  {
    delete_after = false;
  }
  #code
}

08 अगस्त 2016 तक यह अभी भी एक मुद्दा है


Answer #7

यदि आप ES6+ का उपयोग कर रहे हैं तो आप निम्न पैरामीटर को डिफ़ॉल्ट तरीके से सेट कर सकते हैं:

function test (foo = 1, bar = 2) {
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

यदि आपको ES5 सिंटैक्स की आवश्यकता है तो आप इसे निम्न तरीके से कर सकते हैं:

function test(foo, bar) {
  foo = foo || 2;
  bar = bar || 0;
  
  console.log(foo, bar);
}

test(5); // foo gets overwritten, bar remains default parameter

उपरोक्त वाक्यविन्यास में OR ऑपरेटर का उपयोग किया जाता है। OR ऑपरेटर हमेशा पहले मान देता true अगर इसे true परिवर्तित किया जा सकता true यदि यह राइथेंडसाइड मान नहीं देता है। जब फ़ंक्शन को कोई तर्क नहीं दिया जाता है तो पैरामीटर वैरिएबल (हमारे उदाहरण में bar ) जेएस इंजन द्वारा undefined करने के लिए सेट किया जाता है। undefined तब गलत में परिवर्तित हो जाता है और इस प्रकार OR ऑपरेटर मान 0 लौटाता है।


Answer #8

यदि आप नवीनतम ECMA6 वाक्यविन्यास का उपयोग करना चाहते हैं तो इसका उपयोग करें:

function myFunction(someValue = "This is DEFAULT!") {
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

इसे default function parameters कहा जाता है। यह औपचारिक पैरामीटर को डिफ़ॉल्ट मानों के साथ प्रारंभ करने की अनुमति देता है यदि कोई मान या अपरिभाषित नहीं किया जाता है। नोट : यह इंटरनेट एक्सप्लोरर या पुराने ब्राउज़र के साथ काम नहीं करेगा।

अधिकतम संभव संगतता के लिए इसका उपयोग करें:

function myFunction(someValue) {
  someValue = (someValue === undefined) ? "This is DEFAULT!" : someValue;
  console.log("someValue --> ", someValue);
}

myFunction("Not A default value") // calling the function without default value
myFunction()  // calling the function with default value

दोनों कार्यों में सटीक वही व्यवहार होता है क्योंकि इनमें से प्रत्येक उदाहरण इस तथ्य पर भरोसा करता है कि पैरामीटर चर को undefined किया जाएगा यदि उस फ़ंक्शन को कॉल करते समय कोई पैरामीटर मान पास नहीं किया गया था।


Answer #9

वाक्यविन्यास के अनुसार

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

आप औपचारिक मानकों के डिफ़ॉल्ट मान को परिभाषित कर सकते हैं। और टाइपफ फ़ंक्शन का उपयोग करके अपरिभाषित मान भी देखें।


Answer #10

हाँ इसे एक डिफ़ॉल्ट पैरामीटर के रूप में जाना जाता है

डिफ़ॉल्ट फ़ंक्शन पैरामीटर औपचारिक पैरामीटर को डिफ़ॉल्ट मानों के साथ प्रारंभ करने की अनुमति देते हैं यदि कोई मान या अपरिभाषित नहीं किया जाता है।

वाक्य - विन्यास:

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

विवरण:

कार्यों के पैरामीटर अपरिभाषित करने के लिए डिफ़ॉल्ट हैं हालांकि, परिस्थितियों में यह एक अलग डिफ़ॉल्ट मान सेट करने के लिए उपयोगी हो सकता है। यह वह जगह है जहां डिफ़ॉल्ट पैरामीटर मदद कर सकते हैं।

अतीत में, डिफ़ॉल्ट सेट करने के लिए सामान्य रणनीति फ़ंक्शन के बॉडी में पैरामीटर मानों का परीक्षण करना था और यदि वे अपरिभाषित हैं तो मान असाइन करें। यदि कॉल में कोई मूल्य प्रदान नहीं किया जाता है, तो इसका मूल्य अपरिभाषित होगा। यह सुनिश्चित करने के लिए कि पैरामीटर अपरिभाषित नहीं है, आपको एक सशर्त जांच सेट करनी होगी

ES2015 में डिफ़ॉल्ट पैरामीटर के साथ, फ़ंक्शन बॉडी में चेक अब आवश्यक नहीं है। अब आप फ़ंक्शन हेड में डिफ़ॉल्ट मान डाल सकते हैं।

मतभेदों का उदाहरण:

// OLD METHOD
function multiply(a, b) {
  b = (typeof b !== 'undefined') ?  b : 1;
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5


// NEW METHOD
function multiply(a, b = 1) {
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5

विभिन्न सिंटेक्स उदाहरण:

पैडिंग अपरिभाषित बनाम अन्य झूठी मूल्य:

भले ही मूल्य कॉल करते समय स्पष्ट रूप से सेट किया गया हो, num num तर्क का मान डिफ़ॉल्ट है।

function test(num = 1) {
  console.log(typeof num);
}

test();          // 'number' (num is set to 1)
test(undefined); // 'number' (num is set to 1 too)

// test with other falsy values:
test('');        // 'string' (num is set to '')
test(null);      // 'object' (num is set to null)

कॉल समय पर मूल्यांकन किया गया:

कॉल तर्क पर डिफ़ॉल्ट तर्क का मूल्यांकन किया जाता है, इसलिए कुछ अन्य भाषाओं के विपरीत, प्रत्येक बार फ़ंक्शन कहलाता है जब एक नई वस्तु बनाई जाती है।

function append(value, array = []) {
  array.push(value);
  return array;
}

append(1); //[1]
append(2); //[2], not [1, 2]


// This even applies to functions and variables
function callSomething(thing = something()) {
 return thing;
}

function something() {
  return 'sth';
}

callSomething();  //sth

डिफ़ॉल्ट पैरामीटर बाद के डिफ़ॉल्ट पैरामीटर के लिए उपलब्ध हैं:

पहले से ही सामने आए पैराम बाद में डिफ़ॉल्ट पैरामीटर के लिए उपलब्ध हैं

function singularAutoPlural(singular, plural = singular + 's',
                        rallyingCry = plural + ' ATTACK!!!') {
  return [singular, plural, rallyingCry];
}

//["Gecko","Geckos", "Geckos ATTACK!!!"]
singularAutoPlural('Gecko');

//["Fox","Foxes", "Foxes ATTACK!!!"]
singularAutoPlural('Fox', 'Foxes');

//["Deer", "Deer", "Deer ... change."]
singularAutoPlural('Deer', 'Deer', 'Deer peaceably and respectfully \ petition the government for positive change.')

फ़ंक्शन बॉडी के अंदर परिभाषित कार्य:

गेको 33 में पेश किया गया (फ़ायरफ़ॉक्स 33 / थंडरबर्ड 33 / सागरमोकी 2.30)। फ़ंक्शन बॉडी में घोषित फ़ंक्शंस को डिफ़ॉल्ट पैरामीटर के अंदर संदर्भित नहीं किया जा सकता है और रेफरेंस एरर फेंक सकता है (वर्तमान में स्पाइडरमोन्की में टाइप एरर, बग 1022 9 67 देखें)। डिफ़ॉल्ट मानकों को हमेशा पहले निष्पादित किया जाता है, फ़ंक्शन बॉडी के अंदर फ़ंक्शन घोषणाएं बाद में मूल्यांकन करती हैं।

// Doesn't work! Throws ReferenceError.
function f(a = go()) {
  function go() { return ':P'; }
}

डिफ़ॉल्ट पैरामीटर के बाद डिफ़ॉल्ट के बिना पैरामीटर्स:

गेको 26 से पहले (फ़ायरफ़ॉक्स 26 / थंडरबर्ड 26 / सागरमोकी 2.23 / फ़ायरफ़ॉक्स ओएस 1.2), निम्नलिखित कोड के परिणामस्वरूप सिंटेक्स एरर हुआ। यह बग 777060 में तय किया गया है और बाद के संस्करणों में अपेक्षित काम करता है। पैरामीटर्स अभी भी बाएं से दाएं सेट हैं, डिफ़ॉल्ट पैरामीटर ओवरराइटिंग भले ही डिफॉल्ट के बाद पैरामीटर हैं।

function f(x = 1, y) {
  return [x, y];
}

f(); // [1, undefined]
f(2); // [2, undefined]

डिफ़ॉल्ट मूल्य असाइनमेंट के साथ विनाशकारी पैरामीट:

आप विनाशकारी असाइनमेंट नोटेशन के साथ डिफ़ॉल्ट मान असाइनमेंट का उपयोग कर सकते हैं

function f([x, y] = [1, 2], {z: z} = {z: 3}) {
  return x + y + z;
}

f(); // 6

Answer #11

ES6: जैसा कि अधिकांश उत्तरों में पहले से ही उल्लेख किया गया है, ES6 में, आप केवल एक मान के साथ एक पैरामीटर शुरू कर सकते हैं।

ES5: दिए गए अधिकांश उत्तर मेरे लिए पर्याप्त नहीं हैं क्योंकि ऐसे मौके हैं जहां मुझे 0 , null और फ़ंक्शन के लिए undefined जैसे गलत मूल्यों को पारित करना पड़ सकता है। यह निर्धारित करने के लिए कि कोई पैरामीटर अपरिभाषित है या नहीं, क्योंकि यह परिभाषित नहीं किया गया है कि यह परिभाषित नहीं किया गया है क्योंकि यह परिभाषित नहीं किया गया है:

function foo (param1, param2) {
   param1 = arguments.length >= 1 ? param1 : "default1";
   param2 = arguments.length >= 2 ? param2 : "default2";
}

Answer #12

डिफ़ॉल्ट पैरामीटर मान

ईएस 6 के साथ, आप शायद JavaScript में सबसे आम मुहावरों में से एक को फ़ंक्शन पैरामीटर के लिए डिफ़ॉल्ट मान सेट करने से संबंधित कर सकते हैं। जिस तरह से हमने इसे वर्षों से किया है, वह काफी परिचित दिखना चाहिए:

function foo(x,y) {
 x = x || 11;
 y = y || 31;
 console.log( x + y );
}
foo(); // 42
foo( 5, 6 ); // 11
foo( 5 ); // 36
foo( null, 6 ); // 17

यह पैटर्न सबसे अधिक उपयोग किया जाता है, लेकिन जब हम मूल्यों को पास करते हैं तो खतरनाक होता है

foo(0, 42)
foo( 0, 42 ); // 53 <-- Oops, not 42

क्यूं कर? क्योंकि 0 is falsy , और इसलिए x || 11 results in 11 x || 11 results in 11 , सीधे 0 में पारित नहीं किया गया। इस गोचा को ठीक करने के लिए, कुछ लोग इसके बजाय चेक को और अधिक verbosely लिखेंगे:

function foo(x,y) {
 x = (x !== undefined) ? x : 11;
 y = (y !== undefined) ? y : 31;
 console.log( x + y );
}
foo( 0, 42 ); // 42
foo( undefined, 6 ); // 17

अब हम अनुपस्थित तर्कों के लिए डिफ़ॉल्ट मानों के असाइनमेंट को व्यवस्थित करने के लिए ES6 रूप में जोड़े गए एक अच्छे सहायक वाक्यविन्यास की जांच कर सकते हैं:

function foo(x = 11, y = 31) {
 console.log( x + y );
}

foo(); // 42
foo( 5, 6 ); // 11
foo( 0, 42 ); // 42
foo( 5 ); // 36
foo( 5, undefined ); // 36 <-- `undefined` is missing
foo( 5, null ); // 5 <-- null coerces to `0`
foo( undefined, 6 ); // 17 <-- `undefined` is missing
foo( null, 6 ); // 6 <-- null coerces to `0`

x = 11 फ़ंक्शन घोषणा में x !== undefined ? x : 11 तरह अधिक है x !== undefined ? x : 11 x !== undefined ? x : 11 अधिक सामान्य मुहावरे x || 11 तुलना में x || 11 x || 11

डिफ़ॉल्ट मूल्य अभिव्यक्तियां

Function डिफ़ॉल्ट मान 31 जैसे साधारण मानों से अधिक हो सकते हैं; वे कोई वैध अभिव्यक्ति हो सकती है, यहां तक ​​कि एक function call :

function bar(val) {
 console.log( "bar called!" );
 return y + val;
}
function foo(x = y + 3, z = bar( x )) {
 console.log( x, z );
}
var y = 5;
foo(); // "bar called"
 // 8 13
foo( 10 ); // "bar called"
 // 10 15
y = 6;
foo( undefined, 10 ); // 9 10

जैसा कि आप देख सकते हैं, डिफ़ॉल्ट मान अभिव्यक्तियों का आलसी मूल्यांकन किया जाता है, जिसका अर्थ है कि वे केवल तभी चलते हैं जब उनकी आवश्यकता होती है - यानी, जब पैरामीटर का तर्क छोड़ा जाता है या अनिर्धारित होता है।

एक डिफ़ॉल्ट मान अभिव्यक्ति एक इनलाइन फ़ंक्शन अभिव्यक्ति कॉल भी हो सकती है - जिसे आमतौर पर तत्काल आमंत्रण फ़ंक्शन अभिव्यक्ति (IIFE) रूप में जाना जाता है:

function foo( x =
 (function(v){ return v + 11; })( 31 )
) {
 console.log( x );
}
foo(); // 42

Answer #13
def read_file(file, delete_after = false)
  # code
end

ईसीएमएस्क्रिप्ट 6 (ईएस 6) के साथ-साथ पिछले संस्करणों सहित इस स्थिति में निम्नलिखित कोड काम कर सकते हैं।

function read_file(file, delete_after) {
    if(delete_after == undefined)
        delete_after = false;//default value

    console.log('delete_after =',delete_after);
}
read_file('text1.txt',true);
read_file('text2.txt');

क्योंकि भाषाओं में डिफ़ॉल्ट मान काम करता है जब फ़ंक्शन का पैरामीटर मान कॉल करते समय छोड़ा जाता है, जावास्क्रिप्ट में इसे अपरिभाषित करने के लिए असाइन किया जाता है । यह दृष्टिकोण आकर्षक प्रोग्रामेटिक रूप से दिखता नहीं है लेकिन पिछड़ा संगतता है


Answer #14
function helloWorld(name, symbol = '!!!') {
    name = name || 'worlds';
    console.log('hello ' + name + symbol);
}

helloWorld(); // hello worlds!!!

helloWorld('john'); // hello john!!!

helloWorld('john', '(>.<)'); // hello john(>.<)

helloWorld('john', undefined); // hello john!!!

helloWorld(undefined, undefined); // hello worlds!!!





default-parameters