টাইপ! == “অপরিবর্তিত” বনাম! = নাল


491

আমি প্রায়শই জাভাস্ক্রিপ্ট কোড দেখতে পাই যা এইভাবে অপরিজ্ঞাত পরামিতিগুলি পরীক্ষা করে:

if (typeof input !== "undefined") {
    // do stuff
}

এটি এক ধরণের অপব্যয়জনক বলে মনে হচ্ছে, কারণ এটিতে টাইপ লুকিং এবং স্ট্রিং তুলনা উভয়ই জড়িত, এর অক্ষরটি উল্লেখ না করে। undefinedযদিও এটির নামকরণ করা যেতে পারে, এটি দরকার ।

আমার প্রশ্ন হল:
এই পদ্ধতির চেয়ে কোডটি কীভাবে আরও ভাল:

if (null != input) {
    // do stuff
}

আমি যতদূর জানি, আপনি নতুন করে সংজ্ঞা দিতে পারবেন না null, সুতরাং এটি অপ্রত্যাশিতভাবে ভেঙে যাচ্ছে না। এবং, !=অপারেটরের টাইপ-জবরদস্তির কারণে , এই উভয় undefinedএবং null... যা আপনি প্রায়শই ঠিক যা চান (যেমন optionচ্ছিক ফাংশন পরামিতিগুলির জন্য) যাচাই করে ।

তবুও এই ফর্মটি বিস্তৃত বলে মনে হচ্ছে না এবং এটি জেএসলিন্টকে দুষ্ট !=অপারেটর ব্যবহারের জন্য আপনাকে চিত্কার করার কারণও করে ।

কেন এটি খারাপ শৈলী হিসাবে বিবেচিত হয়?


13
@ মার্সেল, বাস্তব পার্থক্য নেই, তবে এটি করার দুটি কারণ রয়েছে। এক, কারও জন্য এটি পড়া আরও পরিষ্কার cle এবং দ্বিতীয় কারণ, এটি কোনও ভেরিয়েবলের দুর্ঘটনাজনিত ওভাররাইটিং প্রতিরোধ করে। আপনি কি কখনও এটি করেছেন: যদি (foo = "মান") কোনও তুলনা করার ইচ্ছা করে। যদি আপনি অ্যাসাইনমেন্ট / তুলনা অপারেটরে ভেরিয়েবলটি উল্টানোর অভ্যাসে পান তবে আপনার সমস্যাটি হবে না।
লাইক

29
কারও জন্য (আমাকে সহ) এটি পড়তে আসলে আরও বেশি অসুবিধা হয়। এছাড়াও, বেশিরভাগ আইডিই আপনাকে দুর্ঘটনাজনিত কার্যভার সম্পর্কে সতর্ক করে দেয়। তুলনামূলক পরিবর্তনশীল খুব দীর্ঘ হলে আমি এখনও এই ফর্মটি ব্যবহার করি। YMMV।
জনোদোদো

15
@ মার্সেলকর্পেল এটিকে "ইয়োদা অবস্থা" বলা হয়: umumble.com/blogs/Pogramming/321
কল

55
এটি পড়া আরও কঠিন। কেউ "খালি নয় বোতলটি" বলে না।
নোল আব্রাহামস

11
if (null != input)ইংরেজি স্পিকারের কাছে কেবল "যোদা স্পিক" (একজনের মধ্যে আমি .... ইউআউএমএমএমএম) তাই যদি তারা একই জিনিসটির সাথে সমান হয় তবে এটি সত্যই শব্দার্থক। এই প্রোগ্রামটিতে।
webLacky3rdClass

উত্তর:


709

typeof এটি নিরাপদ হিসাবে এটি শনাক্তকারীকে আগে কখনও ঘোষণা করা হয়নি:

if(typeof neverDeclared === "undefined") // no errors

if(neverDeclared === null) // throws ReferenceError: neverDeclared is not defined

3
যদি ((typof neverDeclared! == "অপরিজ্ঞাত")) && (neverDaclared! == নাল)) true সত্য প্রত্যাবর্তন; } অন্য {মিথ্যা প্রত্যাবর্তন; }
অ্যান্টনি ডি সান্টি 21

88
নাল / অপরিজ্ঞাত সাথে তুলনা করার সময় === ব্যবহার করুন।
MyGGaN

47
@ মাইজিগ্যান কেবলমাত্র যদি আপনি দুজনের মধ্যে পার্থক্য করতে চান। বেশিরভাগ ক্ষেত্রেই ==এটি আরও ভাল হতে পারে, কারণ এটি নাল এবং অপরিজ্ঞাত উভয়ের জন্য পরীক্ষা করে।
seanmonstar

10
টাইপফোন সোমবার == 'অপরিজ্ঞাতকৃত' এবং টাইপফোন সোমবার === 'অপরিজ্ঞিত' এর মধ্যে আমি কোনও পার্থক্য খুঁজে পাচ্ছি না, কারণ টাইপফ সর্বদা স্ট্রিং দেয়। নাল জন্য এটি 'অবজেক্ট' ফিরে আসবে। নাকি আমি ভুল হতে পারি?
টমটম

2
আমি বিশ্বাস করি @ টমটম এর মন্তব্য সমস্যা মূল অংশ হতে - আমি বুঝতে পারছি না কেন এক ব্যবহার করেন !==বা ===অপারেটার যখন যার টাইপ পরিচিত হয় একটি স্ট্রিং হতে একটি মান তুলনা।
নিকোলাস রিনাডো

49

যদি ভেরিয়েবলটি ঘোষিত হয় (হয় মূলশব্দ দিয়ে var, একটি ফাংশন আর্গুমেন্ট হিসাবে, বা বৈশ্বিক চলক হিসাবে), আমি মনে করি এটি করার সর্বোত্তম উপায় হ'ল:

if (my_variable === undefined)

jQuery এটি করে, তাই এটি আমার পক্ষে যথেষ্ট :-)

অন্যথায়, আপনি একটি typeofএড়ানোর জন্য ব্যবহার করতে হবে ReferenceError

যদি আপনি অপরিবর্তিত পুনরায় সংজ্ঞায়িত হওয়ার প্রত্যাশা করেন তবে আপনি নিজের কোডটি এভাবে মোড়ানো করতে পারেন:

(function(undefined){
    // undefined is now what it's supposed to be
})();

অথবা voidঅপারেটরের মাধ্যমে এটি পান :

const undefined = void 0;
// also safe

1
যদি অপরিবর্তিত ইতিমধ্যে সংজ্ঞায়িত করা হয়, তবে আপনি কি কিছুই অনির্ধারিত নামের একটি প্যারামিটারের মাধ্যমে আপনার বেনামে ফাংশনটিতে পৌঁছে দিবেন না?
অ্যান্টনি ডি সান্টি 21

20
@ অ্যান্থনি ডি সান্টি: না, undefinedফাংশন প্যারামিটারে দেওয়া নাম, এর মান নয়। ফাংশনে কিছুই দেওয়া হয় না, মানে প্রথম প্যারামিটারের মান অপরিজ্ঞাত।
জোয়ে অ্যাডামস

3
আহ আমার ভুল, অনুসরণ করার জন্য ধন্যবাদ। আমি আমার ভোটটি সরিয়ে দিয়েছি, এর জন্য দুঃখিত।
অ্যান্টনি ডিসান্টি

2
অন্য বিকাশকারী দ্বারা ঘোষিত অনির্ধারিত হ্যান্ডেল করার ব্যতিক্রম কেন লিখবেন যখন আপনি কেবল এটির সাথে সঠিকভাবে শুরু করতে পারেন? সংজ্ঞায়িত সংজ্ঞায়িত না করা এবং সংক্ষিপ্ত আকার হ্রাস করার জন্য আপনার ফাংশনে দেখানোর সাথে সাথে jQuery প্রাথমিক বেনামে ফাংশনটি গুটিয়ে রাখে। সহজভাবে বলা যায় যদি এটি এটির জন্য অপ্রত্যাশিত ফলাফল দিতে পারে তবে টাইপ আউট এড়াতে অলস প্রোগ্রামিংয়ের জন্য এটি ঝুঁকিপূর্ণ কেন (টাইপফ ভেরিয়েবল === 'অপরিজ্ঞাত')। আমরা কী চাইলে (টাইপফ ভেরিয়েবল === 'অবজেক্ট') যদি আমরা একটি ডিফল্ট ভেরিয়েবল সরবরাহ করি যা একটি বস্তু যেমন হয় তবে আমরা (ভেরিয়েবল === অবজেক্ট) করতে পারি?
fyrye

28

ভাল পথ:

if(typeof neverDeclared == "undefined") //no errors

তবে সন্ধানের সর্বোত্তম উপায় হ'ল:

if(typeof neverDeclared === typeof undefined) //also no errors and no strings

6
var অপরিশোধিত = ফাংশন () {}; যদি (typof neverDeclared === টাইপটি অপরিজ্ঞাত); neverDecalred! = 'ফাংশন'; jsfiddle.net/hbPZ5 রিটার্ন টাইপ টাইপ ; একটি স্ট্রিং প্রদান করে। কোনও ত্রুটি বা স্ট্রিং নেই তবে সর্বদা প্রত্যাশিত ফলাফল দেয় না। মঞ্জুরিপ্রাপ্ত বিকাশকারীদের অপরিবর্তিত ঘোষণা করা উচিত নয়, তবে কিছু ফ্রেমওয়ার্ক এবং লাইব্রেরি রয়েছে যা তা করে।
fyrye

1
আমি প্রাথমিকভাবে ব্যবহার করি if (typeof neverDeclared === typeof undefined) { তবে লিন্ট একটি ত্রুটি ছুড়ে ফেলে। "একটি স্ট্রিং প্রত্যাশিত এবং পরিবর্তে 'টাইপফ' দেখেছি।" আপনি কিভাবে এই ত্রুটি পেতে পারি? আমাদের কি লিন্টের দাবিতে দাখিল করা উচিত এবং পরিবর্তে 'ভাল উপায়' ব্যবহার করা উচিত?
আয়েলিস

2
@fyrye আপনি কি এমন কোনও জাভাস্ক্রিপ্ট লাইব্রেরি / ফ্রেমওয়ার্ক সম্পর্কে জানেন যা বাস্তবে অপরিবর্তিত? আমি জানি এটি সম্ভব; তবে আমি এর বন্য উদাহরণ খুঁজে পেতে চাই, "এখানেই আপনি এই দুষ্টু উইলডেবেস্টের মুখোমুখি হতে পারেন!"
বিগুনটাকান

4
typeof neverDeclared === typeof void 0;
ডি

1
এটি ত্রুটি-প্রবণ, কারণ প্রকৃতপক্ষে আপনি কেবলমাত্র একটি নির্দিষ্ট ভেরিয়েবলের উপর নির্ভর করছেন ("অপরিবর্তিত") সংজ্ঞায়িত হচ্ছে না। যা মিথ্যা হতে পারে, যেমন অন্য পোস্টগুলি দেখায়। আপনি সর্বদা করতে পারেন if(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {তবে এটি দীর্ঘ।
পিয়েরে-অলিভিয়ের ভ্যারেস

12

অপরিবর্তিত পুনরায় নামকরণ সম্পর্কে আপনার সত্যিকারের চিন্তা করা উচিত নয়। যদি কেউ অপরিবর্তিত নাম পরিবর্তন করে, চেক ব্যর্থ হয় তবে আপনি কয়েকজনের চেয়ে অনেক বেশি সমস্যায় পড়বেন। আপনি যদি সত্যই আপনার কোডটি সুরক্ষিত করতে চান তবে এটিকে একটি আইএফএফ (তাত্ক্ষণিকভাবে অনুরোধ করা ফাংশন এক্সপ্রেশন) এ এটি মুড়ে দিন:

(function($, Backbone, _, undefined) {
    //undefined is undefined here.
})(jQuery, Backbone, _);

যদি আপনি কোনও ব্রাউজার এনভায়রনমেন্টে গ্লোবাল ভেরিয়েবল (যা ইতিমধ্যে ভুল) নিয়ে কাজ করছেন, আমি এই জাতীয় অপরিবর্তিত পরীক্ষা করে যাব:

if(window.neverDefined === undefined) {
    //Code works
}

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

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


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

দেখে মনে হচ্ছে আপনার এএমডি (প্রয়োজনীয়.js) এর লাইনে কিছু দরকার হতে পারে
পিটার

1
অথবা আমি আমার প্রকল্পে অন্য লাইব্রেরি অন্তর্ভুক্ত না করে কেবল খুব সাধারণ তুলনা করতে চাই :)
আমেরিকানউমলট

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

1
না, কারণ টাইফফ একটি স্ট্রিং দেয়। সুতরাং টাইপ অফ অপরিজ্ঞাপিত আয় "অপরিজ্ঞাত"। উইন্ডো.ইনপুট! == অপরিজ্ঞাপিত (যদি আপনার পরিবর্তনশীল বৈশ্বিক ছড়িয়ে পড়ে)
পিটার

5

আপনি যদি অপরিবর্তিত পুনরায় সংজ্ঞায়িত হওয়ার বিষয়ে সত্যই উদ্বিগ্ন হন তবে আপনি এর মতো কিছু সহায়ক পদ্ধতির সাহায্যে এর বিরুদ্ধে সুরক্ষা দিতে পারেন:

function is_undefined(value) {
   var undefined_check; // instantiate a new variable which gets initialized to the real undefined value
   return value === undefined_check;
}

এটি কাজ করে কারণ যখন কেউ লিখেন undefined = "foo"তিনি কেবল নামের undefined সাথে একটি নতুন মানের উল্লেখ করতে পারেন তবে তিনি এর আসল মান পরিবর্তন করেন না undefined


1
তবে, আপনি এখন একটি ফাংশন কল চালু করেছেন, যা কার্যকারিতা ক্ষতিগ্রস্থ করবে।
টিম ডাউন

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

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

আমি মনে করি এই ফাংশনটি এত সহজ যে এটি ইনলাইন করা হবে, সুতরাং কার্যকারিতা ক্ষতিগ্রস্থ হবে না।
huyz

4
@ টিমডাউন: প্রথমে কোড লিখুন এটি পাঠযোগ্য। দ্বিতীয় রাইট কোড, এটি রক্ষণাবেক্ষণযোগ্য এবং তারপরে, যদি এটি সত্যই ধীর হয়। তারপরে পারফরম্যান্স নিয়ে ভাবুন।
andreas

4

আপনি অপরিবর্তিত মানটি পেতে শূন্য অপারেটরটিও ব্যবহার করতে পারেন:

if (input !== void 0) {
    // do stuff    
}

(এবং হ্যাঁ, অন্য উত্তরে উল্লিখিত হিসাবে, ভেরিয়েবলটি ঘোষিত না হলে এটি ত্রুটি ছুঁড়ে দেবে, তবে এই ক্ষেত্রে প্রায়শই কোড পরিদর্শন, বা কোড রিফ্যাক্টরিং, যেমন window.input !== void 0গ্লোবাল ভেরিয়েবল পরীক্ষা করার জন্য ব্যবহার করে বা যুক্ত করা যায় না var input))


1

আমি যদি সত্যিই (typeof input !== 'undefined')এই পরিস্থিতিতে এসেছি যেখানে এটি ডিফল্ট ফাংশন প্যারামিটারগুলি সরবরাহ করতে ব্যবহৃত হচ্ছে:

function greet(name, greeting) {
  name = (typeof name !== 'undefined') ?  name : 'Student';
  greeting = (typeof greeting !== 'undefined') ?  greeting : 'Welcome';

  return `${greeting} ${name}!`;
}

greet(); // Welcome Student!
greet('James'); // Welcome James!
greet('Richard', 'Howdy'); // Howdy Richard!

ES6 এইভাবে ডিফল্ট ফাংশন পরামিতিগুলি প্রবর্তনের নতুন উপায় সরবরাহ করে:

function greet(name = 'Student', greeting = 'Welcome') {
  return `${greeting} ${name}!`;
}

greet(); // Welcome Student!
greet('James'); // Welcome James!
greet('Richard', 'Howdy'); // Howdy Richard!

এটি প্রথম বিকল্পের চেয়ে কম ভার্বোস এবং ক্লিনার।


1

function greet(name, greeting) {
  name = (typeof name !== 'undefined') ?  name : 'Student';
  greeting = (typeof greeting !== 'undefined') ?  greeting : 'Welcome';

  console.log(greeting,name);
}

greet(); // Welcome Student!
greet('James'); // Welcome James!
greet('Richard', 'Howdy'); // Howdy Richard!

//ES6 provides new ways of introducing default function parameters this way:

function greet2(name = 'Student', greeting = 'Welcome') {
//  return '${greeting} ${name}!';
console.log(greeting,name);
}

greet2(); // Welcome Student!
greet2('James'); // Welcome James!
greet2('Richard', 'Howdy'); // Howdy Richard!


0

(function(){

  var a= b = 3;
  var ed = 103;
  
})();



//console.log(ed); //ed is not defined

console.log("a defined? " + (typeof a !== 'undefined')); //no define
console.log("b defined? " + (typeof b !== 'undefined')); //yes define
console.log(typeof(b)); //number
console.log(typeof(4+7));   //number
console.log(b); //3
console.log(typeof("4"+"7")); //string
var e= "ggg";
console.log(typeof(e)); //string
 var ty=typeof(b);
console.log(ty); //number
console.log(typeof false); //boolean
console.log(typeof 1); //number
console.log(typeof 0); //number
console.log(typeof true); //boolean


console.log(typeof Math.tan);  //function
console.log(typeof function(){}); //function 

if(typeof neverDeclared == "undefined") //no errors
if(typeof neverDeclared === "undefined") //no errors

//if(neverDeclared == null) //showing error 


console.log(typeof {a:1}); //object
console.log(typeof null); //object
console.log(typeof JSON); //object
console.log(typeof Math); //object
console.log(typeof /a-z/); //object
console.log(typeof new Date()); //object

console.log(typeof afbc); //undefined
//console.log(typeof new);//error

document.write("<br> * oprator as math ");
var r=14*"4";
document.write(r);

document.write("<br> + oprator as string ");
var r=14+"44";
document.write(r);

document.write("<br> Minus Operator work as mathematic ");
var r=64-"44";
document.write(r);


document.write("<br>");
console.log(typeof(4*"7")); //returns number
console.log(typeof(4+"7")); //returns string




 
Interview Question in JavaScript


আপনি একটি ব্যাখ্যা প্রদান করতে পারেন?
jhpratt

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

0

var bar = null;
console.log(typeof bar === "object"); //true yes 
//because null a datatype of object

var barf = "dff";
console.log(typeof barf.constructor);//function


console.log(Array.isArray(bar));//falsss


console.log((bar !== null) && (bar.constructor === Object)); //false

console.log((bar !== null) && (typeof bar === "object"));  // logs false
//because bar!==null, bar is a object


console.log((bar !== null) && ((typeof bar === "object") || (typeof bar === "function"))); //false

console.log(typeof bar === typeof object); //false
console.log(typeof bar2 === typeof undefined); //true
console.log(typeof bar3 === typeof undefinedff); //true
console.log(typeof bar2 == typeof undefined); //true

console.log((bar !== null) && (typeof bar === "object") && (toString.call(bar) !== "[object Array]")); //false


-7
if (input == undefined) { ... }

ঠিক কাজ করে। এটি অবশ্যই nullতুলনা নয়, তবে আমি সাধারণত দেখতে পাই যে যদি আমার মধ্যে পার্থক্য করা প্রয়োজন undefinedএবং null, আমার আসলে পরিবর্তে undefinedএবং কেবল কোনও মিথ্যা মানের মধ্যে পার্থক্য করা দরকার , তাই

else if (input) { ... }

এটা কি পারে.

যদি কোনও প্রোগ্রাম পুনরায় সংজ্ঞা দেয় undefinedতবে তা সত্যিই যাইহোক ব্রিন্ডেড।

আমি কেবলমাত্র আই 4 এর সাথে সামঞ্জস্যের জন্য ভাবতে পারি, এটি undefinedকীওয়ার্ডটি বুঝতে পারে নি (যা আসলে কীওয়ার্ড নয়, দুর্ভাগ্যক্রমে), তবে অবশ্যই মানগুলি হতে পারে undefined , সুতরাং আপনার এটি থাকতে হবে:

var undefined;

এবং উপরের তুলনাটি ঠিক কাজ করবে।

আপনার দ্বিতীয় উদাহরণে লিন্টকে খুশি করার জন্য আপনার সম্ভবত ডাবল বন্ধনী প্রয়োজন?


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