জাভাস্ক্রিপ্ট ফাংশনে কোনও আর্গুমেন্ট না প্রেরণ করা হয়েছে তা নির্ধারণ করার পক্ষে কতটা ভাল


236

কোনও যুক্তি জাভাস্ক্রিপ্ট ফাংশনে প্রেরণ করা হয়েছে কিনা তা নির্ধারণের জন্য আমি এখন 2 টি পদ্ধতি দেখেছি। আমি ভাবছি একটি পদ্ধতি অন্যের চেয়ে ভাল কিনা বা যদি কোনও ব্যবহারের পক্ষে খারাপ হয় তবে?

 function Test(argument1, argument2) {
      if (Test.arguments.length == 1) argument2 = 'blah';

      alert(argument2);
 }

 Test('test');

অথবা

 function Test(argument1, argument2) {
      argument2 = argument2 || 'blah';

      alert(argument2);
 }

 Test('test');

আমি যতদূর বলতে পারি, তারা উভয়ই একই জিনিসটির ফলস্বরূপ, তবে আমি কেবল উত্পাদন প্রথম আগে ব্যবহার করেছি।

টম দ্বারা উল্লিখিত অন্য বিকল্প :

function Test(argument1, argument2) {
    if(argument2 === null) {
        argument2 = 'blah';
    }

    alert(argument2);
}

জুয়ানর মন্তব্য অনুসারে, টমের পরামর্শটি এতে পরিবর্তন করা ভাল:

function Test(argument1, argument2) {
    if(argument2 === undefined) {
        argument2 = 'blah';
    }

    alert(argument2);
}

এটা আসলে একই। আপনার যদি সবসময় স্থির সংখ্যক যুক্তি থাকে তবে দ্বিতীয় পদ্ধতিটি নিয়ে যান, অন্যথায় আর্গুমেন্ট অ্যারে ব্যবহার করে পুনরাবৃত্তি করা সম্ভবত সহজ।
লুকা ম্যাটেইস

7
একটি যুক্তি যা পাস করা হয় নি তা সংজ্ঞায়িত হিসাবে আসে। নাল বিরুদ্ধে কঠোর সাম্য সঙ্গে পরীক্ষা ব্যর্থ হবে। আপনার অনির্ধারিত সাথে কঠোর সমতা ব্যবহার করা উচিত।
হুয়ান মেন্ডেস

19
মনে রাখবেন: argument2 || 'blah';'বাজে কথা' পরিণাম ডেকে আনবে যদি argument2হয় false, সহজভাবে না যদি এটা অনির্দিষ্ট হয় (!)। যদি argument2এটি বুলিয়ান হয়, এবং এর জন্য ফাংশনটি পাস falseকরা হয় তবে সেই লাইনটি argument2সঠিকভাবে সংজ্ঞায়িত করা সত্ত্বেও 'বেলা' ফিরে আসবে
স্যান্ডি গিফোর্ড

9
@SandyGifford: একই সমস্যা যদি argument2হয় 0, ''কিংবা null
rvighne

@ আরভিঘনে জাভাস্ক্রিপ্টের অবজেক্ট এবং কাস্টিংয়ের অনন্য ব্যাখ্যা এটি একবারে এটি সেরা এবং সবচেয়ে খারাপ অংশ।
স্যান্ডি গিফোর্ড

উত্তর:


274

কোনও কার্যক্রমে কোনও আর্গুমেন্ট পাস হয়েছিল কিনা তা পরীক্ষা করার বিভিন্ন উপায় রয়েছে। আপনার (মূল) প্রশ্নে আপনি উল্লিখিত দু'এর পাশাপাশি - ডিফল্ট মান সরবরাহ করতে অপারেটরটি পরীক্ষা করা arguments.lengthবা ব্যবহার করা - এটির মাধ্যমে বা যদি কোনও ভৌগলিক হয় তবে ||তার পক্ষে যুক্তিগুলি স্পষ্টভাবে পরীক্ষা করতে পারে (মন্তব্য দেখুন)।undefinedargument2 === undefinedtypeof argument2 === 'undefined'

ব্যবহার ||অপারেটর প্রমাণ অভ্যাস হয়ে গেছে - সব শান্ত কিডস এটা করতে - কিন্তু সতর্কতা অবলম্বন করা আবশ্যক: ডিফল্ট মান যদি যুক্তি মূল্যায়ণ করতে ট্রিগার করা হবে না false, যার মানে এটা আসলে হতে পারে undefined, null, false, 0, ''(অথবা, যার জন্য অন্য কিছু Boolean(...)আয় false)।

সুতরাং প্রশ্নটি হল কখন কোন চেকটি ব্যবহার করবেন, কারণ তারা সকলেই কিছুটা আলাদা ফলাফল দেয়।

চেকিং arguments.length'সবচেয়ে সঠিক' আচরণ প্রদর্শন করে, তবে একাধিক optionচ্ছিক যুক্তি থাকলে তা সম্ভব হয় না।

এর জন্য পরীক্ষাটি undefinedপরবর্তী 'সেরা' - এটি কেবল তখনই 'ব্যর্থ হয়' যদি ফাংশনটি স্পষ্টভাবে একটি undefinedমান দিয়ে বলা হয়, যা সমস্ত সম্ভাবনার মধ্যে যুক্তি বাদ দেওয়ার মতোই আচরণ করা উচিত।

ব্যবহারের ||অপারেটর এমনকি যদি একটি বৈধ যুক্তি প্রদান করা হয় ডিফল্ট মান ব্যবহার ট্রিগার করতে পারে। অন্যদিকে, এর আচরণটি সম্ভবত পছন্দসই হতে পারে।

সংক্ষিপ্তসার হিসাবে: আপনি কী করছেন জানেন যদি কেবল এটি ব্যবহার করুন!

আমার মতে, ||একাধিক optionচ্ছিক তর্ক থাকলে এবং নামকরণকৃত প্যারামিটারগুলির জন্য কার্যবিধির হিসাবে কোনও বস্তুকে আক্ষরিক অর্থে পাস করতে না চাইলে ব্যবহার করার উপায়টিও।

ডিফল্ট মানগুলি ব্যবহার করে অন্য একটি সুন্দর উপায় arguments.lengthহ'ল একটি স্যুইচ স্টেটমেন্টের লেবেলগুলির দ্বারা পড়ে:

function test(requiredArg, optionalArg1, optionalArg2, optionalArg3) {
    switch(arguments.length) {
        case 1: optionalArg1 = 'default1';
        case 2: optionalArg2 = 'default2';
        case 3: optionalArg3 = 'default3';
        case 4: break;
        default: throw new Error('illegal argument count')
    }
    // do stuff
}

এতে প্রোগ্রামটির উদ্দেশ্যটি (দৃষ্টিভঙ্গি) সুস্পষ্ট নয় এবং 'ম্যাজিক নম্বরগুলি' ব্যবহার করে; এটি সম্ভবত ত্রুটিযুক্ত প্রবণ।


42
আপনার "টাইপ অফ আর্গুমেন্ট 2 ===" অপরিজ্ঞাত "হওয়া উচিত, যদি কেউ" অপরিজ্ঞাত "সংজ্ঞায়িত করে।
জেডাব্লু

133
আমি একটি বিজ্ঞপ্তি যুক্ত করব - তবে কি অসুস্থ জারজগুলি এ জাতীয় কাজ করে?
ক্রিস্টোফ

12
অপরিবর্তিত বিশ্বব্যাপী স্থানের একটি পরিবর্তনশীল। স্থানীয় স্কোপে পরিবর্তকের চেয়ে বৈশ্বিক স্কোপে এই পরিবর্তনশীলটি অনুসন্ধান করা ধীর। তবে সবচেয়ে দ্রুততম টাইপ x === "অপরিজ্ঞাত" ব্যবহার করা হয়
কিছু

5
মজাদার. অন্যদিকে, তুলনা === অপরিবর্তিত স্ট্রিং তুলনার চেয়ে দ্রুত হতে পারে। আমার পরীক্ষাগুলি আপনাকে ঠিক বলেছে বলে মনে হচ্ছে, যদিও: x === টাইপফর্মের সময়টির জন্য x === অপরিজ্ঞাত প্রয়োজন 1.5x ডলার x === 'অপরিজ্ঞাত'
ক্রিস্টোফ

4
@ ক্রিস্টফ: আপনার মন্তব্য পড়ে, আমি প্রায় জিজ্ঞাসা। আমি প্রমাণ করতে সক্ষম হয়েছি যে স্ট্রিং তুলনাটি পয়েন্টার তুলনায় অবশ্যই নয় (কেবলমাত্র) যেহেতু একটি বিশাল স্ট্রিংয়ের তুলনা একটি ছোট স্ট্রিংয়ের চেয়ে বেশি সময় নেয়। যাইহোক, দুটি বিশাল স্ট্রিংগুলির তুলনা করা কেবল ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে ওঠে with সুতরাং এটি সম্ভবত পয়েন্টার টেস্টের পরে লেটার টেস্টিংয়ের পরে চিঠিটি পরীক্ষা করে কাজ করে তাই, হ্যাঁ, আমি বাজে ছিলাম :) আমাকে আলোকিত করার জন্য ধন্যবাদ ...
হুয়ান মেন্ডেস

17

আপনি যদি jQuery ব্যবহার করে থাকেন তবে একটি বিকল্প যা দুর্দান্ত (বিশেষত জটিল পরিস্থিতির জন্য) হ'ল jQuery এর প্রসারিত পদ্ধতিটি ব্যবহার করা ।

function foo(options) {

    default_options = {
        timeout : 1000,
        callback : function(){},
        some_number : 50,
        some_text : "hello world"
    };

    options = $.extend({}, default_options, options);
}

আপনি যদি ফাংশনটি কল করেন তবে এটি পছন্দ করুন:

foo({timeout : 500});

বিকল্পগুলির পরিবর্তনশীলগুলি তখন হ'ল:

{
    timeout : 500,
    callback : function(){},
    some_number : 50,
    some_text : "hello world"
};

15

আমি পরীক্ষা খুঁজে পাই এমন কয়েকটি ক্ষেত্রে এটি একটি:

if(! argument2) {  

}

বেশ সুন্দরভাবে কাজ করে এবং সঠিক সংশ্লেষটি সঠিকভাবে বহন করে।

(একসাথে বিধিনিষেধের সাথে যে আমি বৈধ নাল মানকে অনুমতি দেব না argument2যার জন্য অন্য কিছু অর্থ রয়েছে; তবে এটি সত্যই বিভ্রান্তিকর হবে ))

সম্পাদনা করুন:

আলগাভাবে টাইপ করা এবং দৃ strongly়ভাবে টাইপ করা ভাষার মধ্যে শৈলীগত পার্থক্যের এটি একটি দুর্দান্ত উদাহরণ; এবং একটি স্টাইলিস্টিক বিকল্প যা জাভাস্ক্রিপ্টটি কোদালগুলি সরবরাহ করে।

আমার ব্যক্তিগত পছন্দ (অন্যান্য পছন্দগুলির জন্য কোনও সমালোচনা ছাড়া) সংক্ষিপ্ততা। কোডটি যত কম বলবে, যতক্ষণ না আমি সুসংগত এবং সংক্ষিপ্ত, অন্য কাউকে আমার অর্থ সঠিকভাবে অনুধাবন করার জন্য কম বুঝতে হবে।

সেই পছন্দটির একটি নিদর্শন হ'ল আমি চাই না - এটি দরকারী মনে করি না - একগুচ্ছ টাইপ-নির্ভরতা পরীক্ষাগুলি পাইল করে। পরিবর্তে, আমি কোডটির অর্থ দেখতে কেমন বোঝায় বোঝানোর চেষ্টা করি; এবং কেবলমাত্র আমার যা পরীক্ষা করতে হবে তার জন্য পরীক্ষা করুন।

আমি অন্য কিছু লোকের কোডে যে উদ্বেগ পেয়েছি তার মধ্যে একটি বৃহত্তর পরিপ্রেক্ষিতে তারা যে মামলাগুলির জন্য পরীক্ষা করছে সেগুলি চালানোর জন্য তারা প্রত্যাশা করে কি না তা নির্ধারণ করা দরকার। অথবা যদি তারা সম্ভাব্য সমস্ত কিছুর জন্য পরীক্ষার চেষ্টা করে থাকে, সেই সুযোগে তারা প্রসঙ্গটি সম্পূর্ণরূপে প্রত্যাশা করে না। যার অর্থ আমি আত্মবিশ্বাসের সাথে অদূরদর্শক বা কোনও কিছু সংশোধন করার আগে উভয় দিকেই সেগুলি নিখুঁতভাবে অনুসরণ করতে হবে। আমি অনুভব করেছি যে তারা এই বিভিন্ন পরীক্ষাগুলি স্থাপন করতে পারে এমন একটি ভাল সম্ভাবনা রয়েছে কারণ তারা আগে থেকেই দেখেছিল যে তাদের যেখানে প্রয়োজন হবে (এবং যা সাধারণত আমার কাছে প্রকাশিত হয় না)।

(আমি বিবেচনা করি যে এই লোকেরা যেভাবে গতিশীল ভাষাগুলি ব্যবহার করে তার জন্য মারাত্মক ক্ষতি হচ্ছে T খুব সহজেই লোকেরা সমস্ত স্থির পরীক্ষা ছেড়ে দিতে চায় না এবং শেষ পর্যন্ত তা নষ্ট করে দেয়))

মার্জিত জাভাস্ক্রিপ্ট কোডের সাথে বিস্তৃত অ্যাকশনস্ক্রিপ্ট 3 কোডের তুলনা করার ক্ষেত্রে আমি এটি সবচেয়ে স্পষ্টভাবে দেখেছি। এএস 3 জেএস এর প্রচুর পরিমাণে 3 বা 4 গুণ হতে পারে, এবং আমার বিশ্বাসযোগ্য বিশ্বাসযোগ্যতা কমপক্ষে এর চেয়ে ভাল আর কিছু নয়, কেবলমাত্র কোডিং সিদ্ধান্তগুলির সংখ্যার (3-4x) কারণে হয়েছিল।

আপনি যেমনটি বলেছেন, শোগ 9, ওয়াইএমএমভি। : ডি


1
যদি (! আর্গুমেন্ট 2) আর্গুমেন্ট = = 'ডিফল্ট' আর্গুমেন্ট 2 = আর্গুমেন্ট 2 এর সমতুল্য || 'ডিফল্ট' - আমি দ্বিতীয় সংস্করণটি আরও দৃশ্যমানভাবে দেখতে পেয়েছি ...
ক্রিস্টোফ

5
এবং আমি এটি আরও ভার্জোজ এবং বিভ্রান্তিকর মনে করি; তবে এটি ব্যক্তিগত পছন্দ, আমি নিশ্চিত।
dkretz

4
@ এল ডরফায়ার: এটি 0 টি ফাঁকা স্ট্রিং এবং বুলিয়ান মিথ্যা ব্যবহারকেও নিষিদ্ধ করে।
শোগ 9

@ এল ডরফায়ার: নান্দনিকতার বাইরেও একটি মূল পার্থক্য রয়েছে: পরেরটি কার্যকরভাবে মৃত্যুদন্ডের দ্বিতীয় পথ তৈরি করে, যা নির্লিপ্ত রক্ষণাবেক্ষণকারীদেরকে একটি ডিফল্ট মানের সহজ কার্যভারের বাইরে আচরণ যুক্ত করতে প্ররোচিত করতে পারে। ওয়াইএমএমভি অবশ্যই।
শোগ 9

3
যদি প্যারামিটার 2 একটি বুলিয়ান হয় তবে === মিথ্যা; বা একটি ফাংশন false প্রত্যাবর্তন মিথ্যা;}?
ফ্রেসকো

7

উল্লেখযোগ্য পার্থক্য রয়েছে। আসুন কয়েকটি পরীক্ষার কেস সেট আপ করুন:

var unused; // value will be undefined
Test("test1", "some value");
Test("test2");
Test("test3", unused);
Test("test4", null);
Test("test5", 0);
Test("test6", "");

আপনার বর্ণিত প্রথম পদ্ধতিটির সাথে কেবল দ্বিতীয় পরীক্ষাটি ডিফল্ট মান ব্যবহার করবে। দ্বিতীয় পদ্ধতি সব কিন্তু প্রথম ডিফল্ট করবে (যেমন জাতীয় রূপান্তর করবে undefined, null, 0, এবং ""বুলিয়ান মধ্যে false। আর তুমি টম এর পদ্ধতি ব্যবহার করত, শুধুমাত্র চতুর্থ টেস্টে ডিফল্ট ব্যবহার করতে হবে!

আপনি কোন পদ্ধতিটি পছন্দ করেন তা নির্ভর করে আপনার উদ্দেশ্যযুক্ত আচরণের উপর। যদি মান ব্যতীত অন্য মানগুলি undefinedঅনুমোদিত হয় argument2তবে আপনি সম্ভবত প্রথমে কিছুটা ভিন্নতা চান; যদি একটি শূন্য, নন-নাল, নন-খালি মানটি পছন্দ করা হয়, তবে দ্বিতীয় পদ্ধতিটি আদর্শ - প্রকৃতপক্ষে, এটি প্রায়শই বিবেচনা থেকে এত বিস্তৃত মানগুলি দ্রুত নির্মূল করতে ব্যবহৃত হয়।


7
url = url === undefined ? location.href : url;

বেয়ার হাড়ের উত্তর। কিছু ব্যাখ্যা আঘাত করবে না।
পল রুনি

এটি একটি ত্রৈমাসিক অপারেটর যা সংক্ষিপ্তভাবে বলে: ইউআরএল যদি অপরিজ্ঞাত (অনুপস্থিত) হয় তবে ইউআরএল ভেরিয়েবলকে অবস্থানের শিরোনাম (বর্তমান ওয়েব পৃষ্ঠা) হিসাবে সেট করুন, অন্যথায় ইউআরএল ভেরিয়েবলকে সংজ্ঞায়িত ইউআরএল হিসাবে সেট করুন।
rmooney

5

ES6 (ES2015) এ আপনি ডিফল্ট প্যারামিটার ব্যবহার করতে পারেন

function Test(arg1 = 'Hello', arg2 = 'World!'){
  alert(arg1 + ' ' +arg2);
}

Test('Hello', 'World!'); // Hello World!
Test('Hello'); // Hello World!
Test(); // Hello World!


এই উত্তরটি সত্যিই আকর্ষণীয় এবং বিকল্পটি কার্যকর হতে পারে। যদিও এটা সত্যিই নেই উত্তর প্রশ্ন
উলিসে বিএন

আমি দেখতে পেয়েছি - তিনি
যুক্তিটি

আমার বক্তব্যটি হ'ল আপনি জাভাস্ক্রিপ্ট ফাংশনে কোনও আর্গুমেন্ট না প্রেরণ করা হয়েছে কিনা তা নির্ধারণ করার পক্ষে সবচেয়ে ভাল উত্তর দিচ্ছেন না । তবে ডিফল্ট যুক্তি ব্যবহার করে প্রশ্নের উত্তর দেওয়া যেতে পারে: উদাহরণস্বরূপ আপনার সাথে যুক্তি নামকরণ "default value"এবং মানটি সত্য কিনা তা পরীক্ষা করে "default value"
ইউলিস বিএন

4

আমি দুঃখিত, আমি এখনও মন্তব্য করতে পারছি না, তাই টমের জবাবের উত্তর দিতে ... জাভাস্ক্রিপ্টে (অপরিজ্ঞাত! = নাল) == মিথ্যা সত্য যে ফাংশনটি "নাল" দিয়ে কাজ করবে না, আপনার "অপরিজ্ঞাত" ব্যবহার করা উচিত


1
এবং টম একটি ভুল উত্তরের জন্য দুটি উপকার পেয়েছিল - এই সম্প্রদায় সিস্টেমগুলি কতটা ভাল কাজ করে তা জেনে সর্বদা চমৎকার nice)
ক্রিস্টোফ

3

!!অপারেটর ব্যবহার করছেন না কেন ? ভেরিয়েবলের আগে স্থাপন করা এই অপারেটরটি এটিকে একটি বুলিয়ানে পরিণত করুন (যদি আমি ভাল করে বুঝতে পারি), !!undefinedএবং !!null(এবং এমনকি !!NaN, যা বেশ আকর্ষণীয়ও হতে পারে) ফিরে আসবে false

এখানে একটি উদাহরণ:

function foo(bar){
    console.log(!!bar);
}

foo("hey") //=> will log true

foo() //=> will log false

বুলিয়ান সত্য, শূন্য এবং খালি স্ট্রিংয়ের সাথে কাজ করে না। উদাহরণস্বরূপ, foo (0); মিথ্যা লগ করা হবে, কিন্তু foo (1) সত্য লগ হবে
rosell.dk

2

Functionচ্ছিক বৈশিষ্ট্যগুলির একটি অবজেক্টের সাথে আপনার ফাংশনটি উড়িয়ে দিয়ে যুক্তি সনাক্তকরণের কাছে যাওয়া সুবিধাজনক হতে পারে:

function foo(options) {
    var config = { // defaults
        list: 'string value',
        of: [a, b, c],
        optional: {x: y},
        objects: function(param){
           // do stuff here
        }
    }; 
    if(options !== undefined){
        for (i in config) {
            if (config.hasOwnProperty(i)){
                if (options[i] !== undefined) { config[i] = options[i]; }
            }
        }
    }
}

2

প্যারামিটারটি কোনও ফাংশনে প্রেরণ করা হয়েছে কিনা তা খুঁজে পাওয়ার জন্যও একটি কৌশলপূর্ণ উপায় রয়েছে । নীচের উদাহরণটি দেখুন:

this.setCurrent = function(value) {
  this.current = value || 0;
};

এর প্রয়োজনীয় অর্থ হ'ল যদি এর মান valueউপস্থিত / পাস না হয় তবে 0 এ সেট করুন।

খুব সুন্দর হাহ!


1
এর অর্থ আসলে "যদি valueসমান হয় তবে falseএটি 0 তে সেট করুন" " এটি একটি সূক্ষ্ম তবে খুব গুরুত্বপূর্ণ পার্থক্য।
চার্লস উড

@ চারলেস উড মানটি পাস হয়নি / বর্তমান উপায়গুলি কেবল মিথ্যা
মোহাম্মদ জমির

1
অবশ্যই, যদি এটি আপনার ফাংশনের জন্য প্রয়োজনীয়তা ফিট করে। তবে, উদাহরণস্বরূপ, যদি আপনার প্যারামিটারটি বুলিয়ান হয় trueএবং তারপরে falseবৈধ মান হয় এবং প্যারামিটারটি মোটেও পাস না করা হয় (বিশেষত যদি ফাংশনটির একাধিক পরামিতি থাকে) তবে আপনি তৃতীয় আচরণ করতে চান।
চার্লস উড

1
এবং আমার স্বীকার করা উচিত যে এটি কম্পিউটার বিজ্ঞানের একটি বিশাল যুক্তি এবং কেবলমাত্র একটি মতামত হিসাবে শেষ হতে পারে: ডি
চার্লস উড

@ চার্লসউড পার্টিতে দেরি হওয়ার জন্য দুঃখিত। আমি আপনাকে সম্পাদনা বিকল্পের সাথে
উত্তরটিতে

1

কিছু সময় আপনি টাইপ পরীক্ষা করতেও পারেন, বিশেষত যদি আপনি ফাংশনটি গেটর এবং সেটার হিসাবে ব্যবহার করছেন। নিম্নলিখিত কোডটি ES6 (5 বা তার বেশি বয়সী ইকামাস্ক্রিপ্টে চলবে না):

class PrivateTest {
    constructor(aNumber) {
        let _aNumber = aNumber;

        //Privileged setter/getter with access to private _number:
        this.aNumber = function(value) {
            if (value !== undefined && (typeof value === typeof _aNumber)) {
                _aNumber = value;
            }
            else {
                return _aNumber;
            }
        }
    }
}

0
function example(arg) {
  var argumentID = '0'; //1,2,3,4...whatever
  if (argumentID in arguments === false) {
    console.log(`the argument with id ${argumentID} was not passed to the function`);
  }
}

কারণ অ্যারে থেকে উত্তরাধিকারী Object.prototype। বিশ্বকে আরও উন্নত করতে Consider বিবেচনা করুন।


-1

fnCalledFunction (প্যারাম 1, প্যারাম 2, উইন্ডো.আপনি অপশনালপ্যারামিটার)

উপরের ফাংশনটি যদি অনেকগুলি স্থান থেকে কল করা হয় এবং আপনি নিশ্চিত হন যে প্রথম থেকে 2 পরামিতি প্রতিটি জায়গা থেকে পাস হয়েছে তবে 3 য় প্যারামিটার সম্পর্কে নিশ্চিত নন তবে আপনি উইন্ডোটি ব্যবহার করতে পারবেন।

উইন্ডো.প্রেম 3 হ্যান্ডেল করবে যদি এটি কলার পদ্ধতি থেকে সংজ্ঞায়িত না হয়।

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