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


2366

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

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

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

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

উত্তর:


3294

থেকে 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';
  ...
}

216
আপনি এটিকে এ্যাপসুলেট করতে পারেন: function defaultFor(arg, val) { return typeof arg !== 'undefined' ? arg : val; }এবং তারপরে আপনি এটিকে কল করতে পারেনa = defaultFor(a, 42);
কামিলো মার্টিন

6
@ শিপলাস এবং undefinedঅবজেক্টগুলি ব্যবহার করার চেষ্টা করার সময় আপনি বিনা মূল্যে অতিরিক্ত রেফারেন্স ত্রুটি পেয়েছেন : p যদিও এটি কিছু ব্রাউজারের সাথে কাজ করতে পারে এবং দ্রুত হতে পারে, nullএখনও একটি বস্তু এবং undefinedএটি আদিম ধরণের প্রসঙ্গ যা এটি জানাতে চেষ্টা করছে যে রয়েছে এখানে কিছুই না, এমনকি না null। সংক্ষেপে উভয় ক্ষেত্রে এখানে দেখুন: জাভাস্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অপরিজ্ঞাত
সাম্পো সরলা - codidact.org

9
যদি আপনি কোনও বস্তুর সম্পত্তির বিরুদ্ধে পরীক্ষা করেন তবে typeofতা অনর্থক। function foo(data) { var bar = data.bar !== undefined ? data.bar : 'default'; }এটি রেফারেন্স ত্রুটিগুলি ফেলে দেবে না এবং সংক্ষিপ্ত is
ডিজিমিড

10
আমি জানি এটি সত্যিই নাবালক, তবে আপনি কীভাবে বরাদ্দ করছেন a = aএবং b = bকখন সেই পরামিতিগুলি অপরিজ্ঞাত নয় তা আমি পছন্দ করি না । এছাড়াও, কিছু জটিল অবস্থার সাথে যে টেরিনারি অপারেটর ভবিষ্যতের রক্ষণাবেক্ষণকারীদের পক্ষে পড়া কঠিন হতে পারে। আমি বাক্য গঠন অনুসরণ করতে পছন্দ করব: if (typeof a == 'undefined') a = 42- অহেতুক অ্যাসাইনমেন্ট প্লাস পড়ার জন্য কিছুটা সহজ।
32

12
ব্যবহারের কি কোনও কারণ আছে typeof? এটি করা সহজ বলে মনে হচ্ছে a === undefined। প্লাস সেভাবে আপনি কোনও রেফারেন্স ত্রুটিটি পেতে চাইলে যদি আপনি undefinedকোনও বনামকে কোনও স্ট্রিংয়ে রেখে ভুল বানান বানান ।
আবে ভোলেকার

599
function read_file(file, delete_after) {
    delete_after = delete_after || "my default here";
    //rest of code
}

এটি delete_afterমানটির জন্য নির্ধারণ করে delete_afterযদি এটি মিথ্যা মান না হয় অন্যথায় এটি স্ট্রিংকে বরাদ্দ করে "my default here"। আরও বিশদের জন্য ডগ ক্রকফোর্ডের ভাষার জরিপটি পরীক্ষা করে দেখুন এবং অপারেটরগুলির উপরের অংশটি দেখুন

এই পদ্ধতির কাজ আপনি একটি মধ্যে পাস করতে চান না falsey অর্থাত মান false, null, undefined, 0বা ""। আপনার যদি মিথ্যা মানগুলি পাস করার প্রয়োজন হয় তবে আপনাকে টম রিটারের উত্তরে পদ্ধতিটি ব্যবহার করতে হবে ।

কোনও ফাংশনের সাথে অনেকগুলি পরামিতিগুলির সাথে ডিল করার সময়, গ্রাহককে কোনও বস্তুর মধ্যে প্যারামিটার আর্গুমেন্টগুলি পাস করার অনুমতি দেওয়া এবং তারপরে ফাংশনের জন্য ডিফল্ট মানগুলি অন্তর্ভুক্ত করে এই মানগুলিকে একীভূত করতে সহায়তা করা কার্যকর হয় often

function read_file(values) {
    values = merge({ 
        delete_after : "my default here"
    }, values || {});

    // rest of code
}

// simple implementation based on $.extend() from jQuery
function merge() {
    var obj, name, copy,
        target = arguments[0] || {},
        i = 1,
        length = arguments.length;

    for (; i < length; i++) {
        if ((obj = arguments[i]) != null) {
            for (name in obj) {
                copy = obj[name];

                if (target === copy) {
                    continue;
                }
                else if (copy !== undefined) {
                    target[name] = copy;
                }
            }
        }
    }

    return target;
};

ব্যবহার করা

// will use the default delete_after value
read_file({ file: "my file" }); 

// will override default delete_after value
read_file({ file: "my file", delete_after: "my value" }); 

115
আমি এটি অপর্যাপ্ত বলে মনে করি, কারণ আমি ভুলতে যেতে চাই।
টম রিটার

52
আমি বেশিরভাগ পরিস্থিতিতে এটি পর্যাপ্ত বলে মনে করি
রাশ ক্যাম

50
কারণ এটি মিথ্যা মানগুলির জন্য কাজ করে না, এটি রক্ষণাবেক্ষণের দুঃস্বপ্ন তৈরি করতে পারে। একটি বিট কোড যা সর্বদা সত্যবাদী মানগুলি আগে পাস করা হয়েছিল এবং হঠাৎ করে ব্যর্থ হয় কারণ একটি ভুয়া পাসটি সম্ভবত এড়ানো উচিত যেখানে আরও শক্তিশালী পদ্ধতির উপলব্ধ রয়েছে।
জিঙ্গলেস্টুলা

1
কীভাবে আসবেন, এই ক্ষেত্রে, delete_afterএক্সপ্রেশনটির বুলিয়ান ফলাফল পাবেন না delete_after || "my default value"?
xbonez

3
অথবা, আপনি কেবল একটি মিথ্যা মানকে ডিফল্ট করতে পারেন - এটি সাধারণত ভাল ডিফল্ট (যেমন, বুলের পক্ষে মিথ্যা, স্ট্রিংয়ের জন্য খালি স্ট্রিং, সংখ্যার জন্য 0 ইত্যাদি) - যা ক্ষেত্রে এটি আসলে কী তা বিবেচনা করে না was পাস।
মার্ক Brackett

150

আমি আরও সাধারণভাবে কিছুটা সংক্ষিপ্ত এবং ব্যক্তিগতভাবে পাঠযোগ্য বলে এর মতো সাধারণ কিছু পাই।

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

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

6
আপডেট: আপনি যদি ইতিমধ্যে আন্ডারস্কোর.জে ব্যবহার করে থাকেন তবে আমি এটি ব্যবহার করা আরও ভাল _.defaults(iceCream, {flavor: "vanilla", sprinkles: "lots"});। এই উত্তরে প্রদর্শিত বিশ্বব্যাপী নেমস্পেস ব্যবহার করা অনেকের দ্বারা একটি খারাপ অভ্যাস হিসাবে বিবেচিত। util.default(arg, "defaul value")আন্ডারস্কোর ব্যবহার না করতে চাইলে আপনি এই সাধারণ কাজের জন্য নিজের নিজস্ব ইউটিলিটি রোলিংয়ের বিষয়টিও বিবেচনা করতে পারেন (উদাহরণস্বরূপ ), তবে আমি প্রায়শই আন্ডারস্কোর ব্যবহার শেষ করে তাড়াতাড়ি বা পরে যাই হোক চাকাটিকে পুনরায় উদ্ভাবন করার কোনও অর্থ নেই।
andersand

2
আমি আসলে এটির প্রস্তাব দিই, আমি এটি ব্যবহার করি এবং এটিকে "পোর" বলি যা "প্যারামিটার বা" এর জন্য দাঁড়িয়েছে
সুপার


3
@ ওসামাবিনলগিন আপনি যা বলছেন তা বর্তমান জেএসের জন্য সঠিক - পুরানো পরীক্ষাটি এখনও অব্যাহত রয়েছে কারণ কিছু ব্রাউজারে এটি undefinedঅন্য কোনও মান দিয়ে ওভাররাইট করা সম্ভব হত , যার ফলে পরীক্ষাটি ব্যর্থ হয়।
Alnitak

2
@ অ্যালনিটাক: ওভাররাইড করা এখনও সম্ভব undefined। সুতরাং, এটি ব্যবহার করা এখনও ভাল ধারণা typeofএবং 'undefined'
এলএস

63

ECMAScript 6 এ আপনি আসলে যা লিখতে পারবেন ঠিক তেমন লিখতে সক্ষম হবেন:

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

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

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


1
ECMAScript 6 আমি মনে করি ... (আমি নিজেই সংশোধন করতে পারতাম তবে আমি <6 অক্ষর সম্পাদনা করতে পারি না)
জ্যাক

1
ব্রাউজারের জন্য অপেক্ষা করা যেকোনও ECMAScript 6
অ্যাড্রিয়ানো রিসেন্ডে

1
বাবেল কী এটিকে স্থানান্তরিত করবে?
হ্যারিগ


2
এখানে ES6 kangax.github.io/compat-table/es6/#default_function_paraters এর জন্য সামঞ্জস্যতা সারণীটি দুর্ভাগ্যক্রমে এই বাক্য গঠনটি এখনও সমর্থিত নয়
ফ্রিম্যানয়েড

27

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

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, সরাসরি 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 || 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

13

এই সমাধানটি আমার পক্ষে জেএসে কাজ করে:

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

4
যদি delete_afterহয় 0বা হয় null? এটি এই ক্ষেত্রে সঠিকভাবে কাজ করবে না।
দিমিত্রি পাভলুতিন

@ স্টেফান বিজজিটারটি কেবলমাত্র কিছু ক্ষেত্রেই সত্য হবে। তবে আপনি যদি কেবল ডিফল্ট মানগুলি সেট করতে চান তবে মানগুলি সেট করে না কারণ এটি 0 বা নাল! === মিথ্যা।
রুতারস

@ রুদ্রস: আপনি সবেমাত্র বলেছিলেন কিছুই বুঝতে পারছি না।
স্টিফান বিজজিটার 10

কি হবে delete_after = delete_after === undefined ? false : delete_after?
আশাহ 7


10

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

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

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

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

আপনার যদি আমি সুপারিশ করবে আপনি ভালো আপনার deleteFile ফাংশন লিখতে: ( প্রতি সম্পাদিত instead 'র মন্তব্য ) ...

// 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 = !!(options && options.deleteAfter === true);
  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);

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


1
এই "আরও ভাল সমাধান" বেশ অপঠনযোগ্য। আমি পরিবর্তে পরিবর্তনশীল প্রকারের মতো চেক করার পরামর্শ দিই typeof deleteAfter === 'bool'এবং এক্সসেপশনটি অন্যথায় নিক্ষেপ করব। এছাড়াও মানচিত্র / ফোরচ ইত্যাদি পদ্ধতি ব্যবহারের ক্ষেত্রে কেবল সতর্কতার সাথে তাদের ব্যবহার করুন এবং বেনাম ফাংশন সহ ফাংশন বলে rap ['1', '2', '3'].map((value) => {read_file(value);})
পরিবর্তে

এটা একটা ভাল দিক. আমি আমার কোড স্নিপেটে লাইব্রেরি ব্যবহার এড়াতে চেষ্টা করছিলাম, তবে খাঁটি জাভাস্ক্রিপ্টে এই প্রতিমাটি বেশ অগোছালো। ব্যক্তিগতভাবে, আমি ডিলিটএফটার getপুনরুদ্ধার করতে লোটাসের পদ্ধতিটি ব্যবহার করব। একটি ব্যতীত ছোঁড়াও যদি typeof 'deleteAfter' !== 'bool'ভাল বিচক্ষণ ব্যবস্থা হতে পারে। কলিংয়ের "সতর্কতা অবলম্বন করতে" প্রয়োজন এমন ডিজাইনগুলি আমি পছন্দ করি না। সাবধানতা ফাংশনটির দায়িত্ব, কলকারী নয়। শেষ আচরণটি কমপক্ষে অবাক হওয়ার নীতি অনুসরণ করা উচিত।
ডগ কোবার্ন

আমি সম্মত, এই পদ্ধতিটি এমনভাবে লেখা উচিত নয়, যে এটি কল করা তার আচরণটি ভেঙে দিতে পারে। তবে মনে রাখবেন যে ফাংশনটি মডেলের মতো এবং কলারটি নিয়ামকের মতো। মডেলটির ডেটা প্রসেসিংয়ের যত্ন নেওয়া উচিত। ফাংশন (পদ্ধতি) এমন ডেটা প্রত্যাশা করে, ভুল উপায়ে পাস এবং এটি পরিচালনা করতে পারে। এজন্য ব্যতিক্রমী প্যারামিটার প্লাস থ্রো করা এক্সসেপশন, সেরা উপায় checking যদিও এটি আরও জটিল। তবে তবুও এটি আপনাকে আপনার মাথা চুলকানো থেকে জিজ্ঞাসা করতে পারে ... এটি কেন কাজ করছে না ?! এবং তারপরে ... এটি কেন কাজ করছে ?!
পরিবর্তে

9

একটি আপডেট হিসাবে ... ECMAScript 6 এর সাহায্যে আপনি ফাংশন প্যারামিটারের ঘোষণাগুলিতে এই জাতীয়ভাবে নির্ধারণ করতে পারেন:

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

f(1) === 50

হিসাবে উল্লেখ করা হয়েছে - http://es6-features.org/#DefaultParameterValues


11
এই উত্তরটি কার্যকর নয় কারণ এটি সদৃশ
ব্যবহারকারী

8

দীর্ঘ সময়ের সি ++ বিকাশকারী (ওয়েব ডেভলপমেন্টের জন্য রুকি :)), যখন আমি প্রথম এই পরিস্থিতিটি দেখলাম, আমি ফাংশন সংজ্ঞাতে প্যারামিটার অ্যাসাইনমেন্টটি করেছি, যেমনটি প্রশ্নটিতে উল্লিখিত রয়েছে।

function myfunc(a,b=10)

তবে সাবধান থাকুন যে এটি ব্রাউজারগুলিতে অবিচ্ছিন্নভাবে কাজ করে না। আমার জন্য এটি আমার ডেস্কটপে ক্রোমে কাজ করেছিল তবে অ্যান্ড্রয়েডে ক্রোমে কাজ করে নি। নিরাপদ বিকল্প, যেমন উপরে উল্লিখিত অনেকগুলি হ'ল -

    function myfunc(a,b)
    {
    if (typeof(b)==='undefined') b = 10;
......
    }

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


3
ফাংশন সংজ্ঞার মধ্যে অ্যাসাইনমেন্ট আইই 11 এও কাজ করে না, যা উইন্ডোজ 8.1 এর জন্য আইই এর সবচেয়ে বর্তমান সংস্করণ।
ডিএমোনো

1
কারও অবাক হওয়ার ক্ষেত্রে, function myfunc(a,b=10)ES6 সিনট্যাক্স, অন্যান্য উত্তরের সাথে সামঞ্জস্যতার টেবিলের লিঙ্ক রয়েছে।
gcampbell

7

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

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

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

এই ব্যবহার কাছাকাছি পেতে

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

08 ই আগস্ট 2016 পর্যন্ত এটি এখনও একটি সমস্যা


4

বাক্য গঠন অনুযায়ী

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

আপনি আনুষ্ঠানিক পরামিতিগুলির ডিফল্ট মান নির্ধারণ করতে পারেন। এবং টাইপফ ফাংশনটি ব্যবহার করে অপরিবর্তিত মানটিও পরীক্ষা করে দেখুন।


4
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!!!

4

আপনি সর্বশেষতম 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যদি সেই ফাংশনটি কল করার সময় কোনও প্যারামিটার মান পাস হয় না।


দ্রষ্টব্য: যেমন ব্ল্যাকবিয়ার্ড বলেছেন, ফাংশন (প্যারাম = মান) ডান উইন্ডো আইইয়ের সাথে কাজ করে। সামঞ্জস্যপূর্ণ সংস্করণ ব্যবহার করুন।
ম্যাজিক্ল্যাম্প

4

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


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

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

3

function throwIfNoValue() {
throw new Error('Missing argument');
}
function foo(argValue = throwIfNoValue()) {
return argValue ;
}

এখানে foo () হল একটি ফাংশন যার আরগভ্যালু নামের একটি প্যারামিটার রয়েছে। যদি আমরা এখানে ফাংশন কলটিতে কিছু পাস না করি, তবে ফাংশন থ্রোফোনভ্যালু () কল করা হবে এবং প্রত্যাবর্তিত ফলাফলটি কেবলমাত্র আর্গুমেন্ট আর্গভ্যালের জন্য নির্ধারিত হবে। এভাবেই কোনও ফাংশন কল একটি ডিফল্ট প্যারামিটার হিসাবে ব্যবহার করা যায়। যা কোডটিকে আরও সরলীকৃত এবং পাঠযোগ্য করে তোলে।

এই উদাহরণ এখান থেকে নেওয়া হয়েছে


3

আপনি যদি ব্যবহার করে 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যদি না এটা righthandside মান ফেরায়। যখন কোনও যুক্ত যুক্তি ছাড়াই ফাংশনটি ডাকা হয় তখন প্যারামিটার ভেরিয়েবল ( barআমাদের উদাহরণে) undefinedজেএস ইঞ্জিন দ্বারা সেট করা হয়। undefinedতারপরে মিথ্যে রূপান্তরিত হয় এবং এভাবে ORঅপারেটর 0 মান দেয় return


3

হ্যাঁ, ডিফল্ট প্যারামিটারগুলি ES6- এ সম্পূর্ণ সমর্থনযোগ্য :

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

অথবা

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

তবে ইএস 5 এর পূর্বে আপনি সহজেই এটি করতে পারেন:

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

যার অর্থ যদি মানটি থাকে তবে মানটি ব্যবহার করুন, অন্যথায় ||অপারেশনের পরে দ্বিতীয় মানটি ব্যবহার করুন যা একই জিনিসটি করে ...

নোট: সেখানে তাদের মধ্যে একটি বড় পার্থক্য আপনি একটি মান পাস হয় ES6 যে নতুন মান, ভালো কিছু সঙ্গে প্রতিস্থাপন করা হবে এমনকি মান falsy হতে এক, nullবা ""... কিন্তু ES5 এক শুধুমাত্র যদি শুধুমাত্র গৃহীত মান প্রতিস্থাপন করা হবে সত্য কথা, কারণ ||কাজ করার উপায় ...


2

যদি কোনও কারণে আপনি ES6 এ না থাকেন এবং এখানে ব্যবহার করছেন তবে পদ্ধতির 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 , নাল , বা সংজ্ঞায়িত হলে কোনটি ডিফল্ট সেট করবে


1

ভবিষ্যতের শব্দ

ভবিষ্যতে, আপনি একটি বস্তুর অন্যটিতে "স্প্রেড" করতে সক্ষম হবেন (বর্তমানে এজ দ্বারা সমর্থিত নয় 2019 !) - অর্ডার নির্বিশেষে কীভাবে দুর্দান্ত ডিফল্ট বিকল্পগুলির জন্য এটি ব্যবহার করতে হবে তা প্রদর্শন করুন:

function test(options) {
    var options = {
       // defaults
       url: 'defaultURL',
       some: 'somethingDefault',
       // override with input options
       ...options
    };
    
    var body = document.getElementsByTagName('body')[0];
    body.innerHTML += '<br>' + options.url + ' : ' + options.some;
}
test();
test({});
test({url:'myURL'});
test({some:'somethingOfMine'});
test({url:'overrideURL', some:'andSomething'});
test({url:'overrideURL', some:'andSomething', extra:'noProblem'});

MDN রেফারেন্স: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটরস / স্প্রেড_সেন্টাক্স

... ইতিমধ্যে এজ এজোটাস্যাসাইনটি কী সমর্থন করে তা হ'ল () হয় না, তবে আমি সত্যই আশা করি আমরা আইই পিছনে রাখতে পারি :))

একইভাবে আপনি করতে পারেন

    function test(options) {
        var options = Object.assign({
           // defaults
           url: 'defaultURL',
           some: 'somethingDefault',
        }, options); // override with input options
        
        var body = document.getElementsByTagName('body')[0];
        body.innerHTML += '<br>' + options.url + ' : ' + options.some;
    }
    test();
    test({});
    test({url:'myURL'});
    test({some:'somethingOfMine'});
    test({url:'overrideURL', some:'andSomething'});
    test({url:'overrideURL', some:'andSomething', extra:'noProblem'});

সম্পাদনা:const বিকল্পগুলির বিষয়ে মন্তব্যের কারণে - বাকী ফাংশনটিতে ধ্রুবক বিকল্পগুলি ব্যবহার করার ক্ষেত্রে সমস্যাটি আসলে এটি নয় যে আপনি এটি করতে পারবেন না, কেবল এটিই যে আপনি তার নিজের ঘোষণায় ধ্রুবক পরিবর্তনশীলটি ব্যবহার করতে পারবেন না - আপনার কাছে হবে এর মতো কিছুতে ইনপুট নামকরণ সামঞ্জস্য করতে

function test(input_options){
   const options = {
     // defaults
     someKey:    'someDefaultValue',
     anotherKey: 'anotherDefaultValue',

     // merge-in input options
     ...input_options
   };

   // from now on use options with no problem
}

সমস্যাটি হ'ল আপনি স্বাভাবিক কখনই এটি করতে চান না কারণ এটি ইতিমধ্যে সংজ্ঞায়িত বিকল্পগুলি পুনর্নির্মাণ করবে তবে আপনি বৈধ হতে পারে এমন একটি অন্য বর্ণের সাথে এটি ব্যবহার করতে পারেন।
খোলামেলা-ডিএসপিড

ফাংশন পরীক্ষা (বিকল্পসমূহ) {/ * বিকল্পগুলি সংজ্ঞায়িত করা হয়েছে এটি
কনস্ট

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

@ গুগল-ফ্র্যাঙ্ক-ডিএসপিড আহ, আপনি কি করতে পারছেন না function(opt){ const opt = /*some merging*/; }? এটি নিশ্চিতভাবে কাজ করবে না কারণ এটি ঘোষণার আগে আপনি constভেরিয়েবল ব্যবহার করবেন - আপনাকে সামঞ্জস্য করতে হবেfunction test(input_opt){ const opt = { someKey: 'someDefaultValue', ...input_opt} }
jave.web

@ গুগল-ফ্র্যাঙ্ক-ডিএসপিড যাইহোক আরও নতুন মানুষ সম্ভবত এটি সম্পর্কে অবাক হবেন, সুতরাং আমি সম্পাদনা করার জন্য কোডটি কীভাবে যুক্ত করেছি :) তাই অন্যদের জন্য এটি উল্লেখ করার জন্য ধন্যবাদ :)
jave.web

1

কেবল আমার দক্ষতাগুলিও দেখানোর জন্য (এলওএল), উপরের ফাংশনটি নীচে যেমন যুক্তি যুক্ত না করেও লেখা যেতে পারে:

ES5 এবং উপরে

function foo() {
    a = typeof arguments[0] !== 'undefined' ? a : 42;
    b = typeof arguments[1] !== 'undefined' ? b : 'default_b';
    ...
}

ES6 এবং উপরে

function foo(...rest) {
    a = typeof rest[0] !== 'undefined' ? a : 42;
    b = typeof rest[1] !== 'undefined' ? b : 'default_b';
    ...
}

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

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


0

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

ডিফল্ট ফাংশন প্যারামিটারগুলি কোনও মান বা অপরিজ্ঞাত পাস না হলে ডিফল্ট মানগুলির সাথে প্রথাগত পরামিতিগুলির সূচনা করতে দেয়।

বাক্য গঠন:

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

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

প্যাডিং অপরিজ্ঞাত বনাম অন্যান্য মিথ্যা মানগুলি:

কল করার সময় মানটি স্পষ্টভাবে সেট করা থাকলেও সংখ্যা যুক্তির মানটি ডিফল্ট হয়।

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

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

ডিফল্ট পরামিতিগুলির পরে খেলাপি ছাড়াই পরামিতি:

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

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

0

ডিফল্ট প্যারামগুলি সেট করার জন্য কেবল একটি পৃথক পদ্ধতি হ'ল সরাসরি আর্গুমেন্টের পরিবর্তে আর্গুমেন্টের মানচিত্র ব্যবহার করা। উদাহরণ স্বরূপ,

const defaultConfig = {
 category: 'Animals',
 legs: 4
};

function checkOrganism(props) {
 const category = props.category || defaultConfig.category;
 const legs = props.legs || defaultConfig.legs;
}

এইভাবে, আর্গুমেন্টগুলি প্রসারিত করা সহজ হবে এবং আর্গুমেন্টের দৈর্ঘ্যের অমিল সম্পর্কে চিন্তা করা উচিত নয়।


-1

উত্তরটি হল হ্যাঁ. আসলে, অনেকগুলি ভাষা রয়েছে যারা ডিফল্ট পরামিতিগুলিকে সমর্থন করে। পাইথন তাদের মধ্যে একটি:

def(a, enter="Hello"):
   print(a+enter)

যদিও প্রথম বন্ধনীগুলির কারণে এটি পাইথন 3 কোড হলেও ফাংশনে ডিফল্ট পরামিতিগুলি জেএসেও কাজ করে।

উদাহরণস্বরূপ, এবং আপনার ক্ষেত্রে:

function read_file(file, deleteAfter=false){
  console.log(deleteAfter);
}

read_file("test.txt");

তবে কখনও কখনও আপনার সত্যিই ডিফল্ট পরামিতিগুলির প্রয়োজন হয় না।

ফাংশন শুরুর ঠিক পরে আপনি ঠিক এই পরিবর্তনকটি সংজ্ঞায়িত করতে পারেন:

function read_file(file){
  var deleteAfter = false;
  console.log(deleteAfter);
}

read_file("test.txt");

আমার উভয় উদাহরণে, এটি একই জিনিসটি ফেরত দেয়। তবে কখনও কখনও এগুলি আসলে খুব কার্যকর প্রকল্পগুলির মতো কার্যকর হতে পারে।

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

সম্পাদনা: এবং এটি অত্যন্ত গুরুত্বপূর্ণ! এটিIE তে কাজকরবে নাডকুমেন্টেশন দেখুন। আইই এর সাথে আপনাকে "ফাংশনের শীর্ষে ভেরিয়েবলের সংজ্ঞা দিন" পদ্ধতিটি ব্যবহার করতে হবে। ডিফল্ট প্যারামিটারগুলি IE এ কাজ করবে না।


-3

হ্যাঁ, এটি জাভাস্ক্রিপ্টে কাজ করবে। আপনি এটি করতে পারেন:

function func(a=10,b=20)
{
    alert (a+' and '+b);
}

func(); // Result: 10 and 20

func(12); // Result: 12 and 20

func(22,25); // Result: 22 and 25

2
এটি বর্তমানে পোর্টেবল নয় ... আইই ... বিকাশকারী.মোজিলা.আর.ইন /
গার্ট ভ্যান ডান বার্গ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.