javascript - পিএইচপি




একটি জাভাস্ক্রিপ্ট ফাংশন জন্য একটি ডিফল্ট পরামিতি মান সেট করুন (14)

ECMAScript 6 এ আপনি আসলে যা লিখছেন তা লিখতে পারবেন:

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

এটি delete_after false সেট হবে যদি এটি বর্তমান বা undefined না থাকে। আপনি আজকের মতো ES6 বৈশিষ্ট্যগুলি ব্যবহার করতে পারেন যেমন Babel মতো ট্রান্সপ্লেলারগুলির সাথে।

আরও তথ্যের জন্য MDN নিবন্ধটি দেখুন

আমি একটি জাভাস্ক্রিপ্ট ফাংশন পছন্দ করতে চাই ঐচ্ছিক আর্গুমেন্টগুলি যা আমি একটি ডিফল্ট সেট করি, মানটি সংজ্ঞায়িত না হলে এটি ব্যবহার করা হয়। রুবিতে আপনি এটি করতে পারেন:

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

এই জাভাস্ক্রিপ্ট কাজ করে?

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

ES6 / ES2015 থেকে, ডিফল্ট পরামিতি ভাষা স্পেসিফিকেশন হয়।

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

শুধু কাজ করে।

রেফারেন্স: ডিফল্ট পরামিতি - MDN

ডিফল্ট ফাংশন পরামিতিগুলি যদি কোনও মান বা অনির্ধারিত পাস না করে আনুষ্ঠানিক পরামিতিগুলিকে ডিফল্ট মানের সাথে শুরু করতে দেয়।

আপনি ধ্বংসকরণের মাধ্যমে ডিফল্ট নামে পরামিতি অনুকরণ করতে পারেন:

// 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';
  ...
}

আপনি যদি সর্বশেষ 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 করলে প্যারামিটার পরিবর্তনশীলটি undefined হবে।


আমি এই মত কিছু সহজ খুঁজে পেতে আরো সংক্ষিপ্ত এবং পাঠযোগ্য ব্যক্তিগত হতে।

function pick(arg, def) {
   return (typeof arg == 'undefined' ? def : arg);
}

function myFunc(x) {
  x = pick(x, 'my default');
} 

কিছু কারণে যদি আপনি ES6 এ না হন এবং lodash ব্যবহার করছেন lodash এখানে _.defaultTo মাধ্যমে ডিফল্ট ফাংশন পরামিতিগুলির সংক্ষিপ্ত উপায়। পদ্ধতি:

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 , নাল , বা অনির্ধারিত যদি ডিফল্ট সেট করবে


জাভাস্ক্রিপ্ট ডিফল্ট পরামিতি মান ব্যবহার করার সময় আমি অত্যন্ত চরম সতর্কতা অবলম্বন করা হবে। উচ্চ, forEach , map , এবং reduce মতো উচ্চ ক্রম ক্রিয়াগুলির সাথে যুক্ত হলে এটি প্রায়শই বাগ তৈরি করে। উদাহরণস্বরূপ, এই লাইন কোডটি বিবেচনা করুন:

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

parseInt একটি ঐচ্ছিক দ্বিতীয় পরামিতি function parseInt(s, [ radix =10]) কিন্তু মানচিত্র parseInt তিনটি আর্গুমেন্ট সহ কল ​​করে: ( উপাদান , সূচী এবং অ্যারে )।

আমি আপনাকে আপনার প্রয়োজনীয় পরামিতি আপনার ঐচ্ছিক / ডিফল্ট মূল্যবান আর্গুমেন্ট গঠন পৃথক সুপারিশ। যদি আপনার ফাংশনটি 1,২, বা 3 প্রয়োজনীয় প্যারামিটার নেয় যার জন্য কোনও ডিফল্ট মান ইন্দ্রিয় করে না, তবে ফাংশনে অবস্থানের পরামিতি তৈরি করুন, কোনও বিকল্প প্যারামিটারগুলি একক বস্তুর নামযুক্ত গুণাবলী হিসাবে অনুসরণ করা উচিত। আপনার ফাংশনটি 4 বা তার বেশি সময় লাগে তবে সম্ভবত এটি একটি একক বস্তু পরামিতির বৈশিষ্ট্যগুলির মাধ্যমে সমস্ত আর্গুমেন্ট সরবরাহ করতে আরও বেশি জ্ঞান দেয়।

আপনার ক্ষেত্রে আমি আপনাকে আপনার deleteFile ফাংশন লিখতে পরামর্শ দেব:

// 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);

উপরের স্নিপেটটি চালানো অব্যবহৃত পরামিতিগুলির জন্য ডিফল্ট যুক্তি মানগুলির পিছনে লুকানো বিপদগুলি চিত্রিত করে।


মাইক্রোসফ্ট এজে কোড কাজ থাকার আগ্রহী কেউ, ফাংশন পরামিতি ডিফল্ট ব্যবহার করবেন না।

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

সেই উদাহরণে এজ এজন্য একটি ত্রুটি "প্রত্যাশিত" ফেলে দেবে) ''

এই ব্যবহার পেতে

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

২016 সালের আগস্ট 2016 পর্যন্ত এটি এখনও একটি সমস্যা


যে সমাধান জেএস আমার জন্য কাজ করে:

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

সিনট্যাক্স অনুযায়ী

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

আপনি আনুষ্ঠানিক পরামিতি ডিফল্ট মান সংজ্ঞায়িত করতে পারেন। এবং টাইপ ফাংশন ব্যবহার করে অনির্ধারিত মান চেক।


হ্যাঁ এই একটি ডিফল্ট পরামিতি হিসাবে উল্লেখ করা হয়

ডিফল্ট ফাংশন পরামিতিগুলি যদি কোনও মান বা অনির্ধারিত পাস না করে আনুষ্ঠানিক পরামিতিগুলিকে ডিফল্ট মানের সাথে শুরু করতে দেয়।

বাক্য গঠন:

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

বিভিন্ন সিনট্যাক্স উদাহরণ:

প্যাডিং অকার্যকর বনাম অন্য falsy মান:

এমনকি কল করার সময় মানটি স্পষ্টভাবে সেট করা থাকলেও, 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)। ফাংশন শরীরের মধ্যে ঘোষিত ফাংশন ডিফল্ট প্যারামিটারের ভিতরে উল্লেখ করা যায় না এবং একটি রেফারেন্স ত্রুটি (বর্তমানে স্পাইডারমোকিতে টাইপএররর, দেখুন 1022967 দেখুন)। ডিফল্ট পরামিতি সর্বদা প্রথম নির্বাহ করা হয়, ফাংশন শরীরের ভিতরে ফাংশন ঘোষণা পরে মূল্যায়ন।

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

ডিফল্ট পরামিতি পরে ডিফল্ট পরামিতি:

গেকো ২6 (ফায়ারফক্স 26 / থান্ডারবার্ড ২6 / সিমনকি 2.23 / ফায়ারফক্স ওএস 1.2) এর আগে, নিম্নলিখিত কোডটি সিনট্যাক্স ইরেকর মধ্যে স্থাপিত হয়েছিল। এটি 777060 বাগ সংশোধন করা হয়েছে এবং পরবর্তী সংস্করণগুলিতে প্রত্যাশিত হিসাবে কাজ করে। পরামিতি এখনও বাম থেকে ডানে সেট, ডিফল্ট ছাড়া পরে পরামিতি আছে এমনকি যদি ডিফল্ট পরামিতি overwriting।

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

ES6: ES6 তে বেশিরভাগ উত্তরগুলিতে ইতিমধ্যে উল্লেখ করা হয়েছে, আপনি কেবল একটি মান সহ একটি পরামিতি আরম্ভ করতে পারেন।

ES5: প্রদত্ত উত্তরগুলির বেশিরভাগই আমার জন্য যথেষ্ট ভাল নয় কারণ সেখানে এমন কিছু অনুষ্ঠান আছে যেখানে আমি 0 , অস্পষ্ট এবং একটি ফাংশনের undefined মানগুলি পাস করতে পারি। কোনও প্যারামিটারটি অনির্ধারিত কিনা তা নির্ধারণ করতে, কারণ অনির্দিষ্ট হওয়ার পরিবর্তে আমি যে মানটি প্রেরণ করেছি তার কারণে এটি আমি সংজ্ঞায়িত করে নি:

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

ডিফল্ট পরামিতি মান

ES6 দিয়ে, আপনি সম্ভবত 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 পাস করেনি। এই গোচচাটি ঠিক করার জন্য, কিছু লোক পরিবর্তে চেকটি আরও ভালোভাবে লিখবে:

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 আরো সাধারণ idiom 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

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

নিম্নলিখিত কোডটি ECMAScript 6 (ES6) এর পাশাপাশি আগের সংস্করণ সহ এই পরিস্থিতিতে কাজ করতে পারে।

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');

যখন ভাষাগুলিতে ডিফল্ট মান কাজ করে তখন ফাংশন এর প্যারামিটার মানটি কল করার সময় বাদ দেওয়া হয়, জাভাস্ক্রিপ্টে এটি অনির্ধারিত করা হয় । এই পদ্ধতির আকর্ষণীয় প্রোগ্রাম আকর্ষণীয় না কিন্তু পিছনে সামঞ্জস্য আছে


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