ভাবলেশহীনতা
আমি কোনও ফাংশন সংজ্ঞায়িত বা ব্যবহার করার চেষ্টা করার পরামর্শ দিচ্ছি না যা পুরো পৃথিবীর কোনও মান খালি কিনা তা গণনা করে। "খালি" থাকার অর্থ কী? যদি আমি আছে let human = { name: 'bob', stomach: 'empty' }
, should isEmpty(human)
আসতে true
? যদি আমি আছে let reg = new RegExp('');
, should isEmpty(reg)
আসতে true
? কি সম্পর্কে isEmpty([ null, null, null, null ])
- এই তালিকায় কেবল শূন্যতা রয়েছে, তাই তালিকাটি নিজেই খালি? আমি এখানে জাভাস্ক্রিপ্টে "শূন্যতা" (একটি ইচ্ছাকৃত অস্পষ্ট শব্দ, প্রাক-বিদ্যমান সংস্থাগুলি এড়াতে) সম্পর্কিত কিছু নোট এখানে রেখে দিতে চাই - এবং আমি যুক্তি দিতে চাই যে জাভাস্ক্রিপ্টের মানগুলিতে "শূন্যতা" কখনই উদারতার সাথে মোকাবেলা করা উচিত নয়।
Truthiness / Falsiness
মূল্যবোধের "শূন্যতা" কীভাবে নির্ধারণ করা যায় তার সিদ্ধান্ত নেওয়ার জন্য, আমাদের মূল্যবোধগুলি "সত্যবাদী" বা "মিথ্যা" কিনা তার অন্তর্নিহিত জাভাস্ক্রিপ্টের অন্তর্নিহিত সংস্থান প্রয়োজন। স্বাভাবিকভাবেই, null
এবং undefined
উভয়ই "মিথ্যা"। স্বভাবতই কম, সংখ্যাটি 0
(এবং অন্য কোনও সংখ্যা ছাড়া NaN
) এছাড়াও "মিথ্যা"। ''
স্বল্পতম প্রাকৃতিক: মিথ্যা, তবে []
এবং {}
(এবং new Set()
, এবং new Map()
) সত্যবাদী - যদিও এগুলি সমস্তই সমান শূন্য বলে মনে হচ্ছে!
নাল বনাম অপরিজ্ঞাত
null
বনাম সম্পর্কিতও কিছু আলোচনা রয়েছে undefined
- আমাদের প্রোগ্রামগুলিতে শূন্যতা প্রকাশ করার জন্য আমাদের কি সত্যই উভয়ের প্রয়োজন? আমি ব্যক্তিগতভাবে কখনই আমার কোডটিতে ইউ, এন, ডি, ই, এফ, আই, এন, ই, ডি বর্ণগুলি উপস্থিত থাকতে পারি। আমি সর্বদা null
"শূন্যতা" বোঝাতে ব্যবহার করি । আবার, যদিও আমাদের জাভাস্ক্রিপ্টের সহজাত ধারণাটি কীভাবে null
এবং undefined
পৃথকভাবে সমন্বিত করতে হবে:
- অস্তিত্বহীন সম্পত্তিটি অ্যাক্সেস করার চেষ্টা করছে
undefined
- সেই প্যারামিটারের কোনও ফাংশনের ফলাফলকে কল করার সময় একটি প্যারামিটার ছাড় দেওয়া
undefined
:
let f = a => a;
console.log(f('hi'));
console.log(f());
- ডিফল্ট মানগুলির সাথে পরামিতিগুলি কেবল তখনই দেওয়া হয় যখন দেওয়া হয়
undefined
না null
:
let f = (v='hello') => v;
console.log(f(null));
console.log(f(undefined));
অ জেনেরিক ভ্যাকুয়্যারনেস
আমি বিশ্বাস করি যে শূন্যতা কখনই জেনেরিক ফ্যাশনে মোকাবেলা করা উচিত নয়। পরিবর্তে আমাদের ডেটা শূন্য কিনা তা নির্ধারণের আগে আমাদের কাছে আরও তথ্য পাওয়ার কঠোরতা থাকা উচিত - আমি মূলত আমি কী ধরণের ডেটা নিয়ে কাজ করছি তা যাচাই করে এটি করি:
let isType = (value, Cls) => {
try {
return Object.getPrototypeOf(value).constructor === Cls;
} catch(err) {
return false;
}
};
নোট করুন যে এই ফাংশনটি বহুবর্ষকে উপেক্ষা করে - এটি value
প্রত্যক্ষ উদাহরণ হিসাবে প্রত্যাশা করে Cls
, এর সাবক্লাসের উদাহরণ নয় Cls
। আমি instanceof
দুটি প্রধান কারণে এড়ানো :
([] instanceof Object) === true
("একটি অ্যারে একটি বিষয়")
('' instanceof String) === false
("স্ট্রিং স্ট্রিং নয়")
লক্ষ্য করুন Object.getPrototypeOf
একটি মামলা এড়াতে মত ব্যবহার করা হয় ফাংশন এখনও জন্য সঠিকভাবে ফেরৎ (মিথ্যা), এবং (সত্য)।let v = { constructor: String };
isType
isType(v, String)
isType(v, Object)
সামগ্রিকভাবে, আমি isType
এই টিপসগুলির সাথে এই ফাংশনটি ব্যবহার করার পরামর্শ দিচ্ছি :
- অজানা প্রকারের কোড প্রসেসিং মানগুলির পরিমাণ হ্রাস করুন। উদাহরণস্বরূপ,
let v = JSON.parse(someRawValue);
আমাদের v
চলকটি এখন অজানা ধরণের। যত তাড়াতাড়ি সম্ভব, আমাদের আমাদের সম্ভাবনাগুলি সীমাবদ্ধ করা উচিত। এটি করার সর্বোত্তম উপায়টি কোনও নির্দিষ্ট ধরণের প্রয়োজনের মাধ্যমে হতে পারে: উদাহরণস্বরূপ if (!isType(v, Array)) throw new Error('Expected Array');
- এটি জেনেরিক প্রকৃতিটি সরিয়ে ফেলার একটি সত্যই দ্রুত এবং অভিব্যক্তিক উপায় v
এবং এটি নিশ্চিত করা যে এটি সর্বদা একটি Array
। যদিও কখনও কখনও আমাদের v
একাধিক ধরণের হতে দেওয়া প্রয়োজন । এই ক্ষেত্রে, আমাদের কোডের ব্লক তৈরি করা উচিত যেখানে v
যত তাড়াতাড়ি সম্ভব জেনেরিক হয় না:
if (isType(v, String)) {
/* v isn't generic in this block - It's a String! */
} else if (isType(v, Number)) {
/* v isn't generic in this block - It's a Number! */
} else if (isType(v, Array)) {
/* v isn't generic in this block - it's an Array! */
} else {
throw new Error('Expected String, Number, or Array');
}
- বৈধতার জন্য সর্বদা "হোয়াইটলিস্ট" ব্যবহার করুন। আপনার যদি মান, যেমন একটি স্ট্রিং, সংখ্যা বা অ্যারে প্রয়োজন হয় তবে সেই 3 "সাদা" সম্ভাবনাগুলি পরীক্ষা করে দেখুন এবং 3 টির মধ্যে কেউ সন্তুষ্ট না হলে একটি ত্রুটি নিক্ষেপ করুন। আমাদের দেখতে হবে যে "কালো" সম্ভাবনাগুলির জন্য পরীক্ষা করা খুব দরকারী নয়: বলুন আমরা লিখি
if (v === null) throw new Error('Null value rejected');
- এটি নিশ্চিত করার জন্য এটি দুর্দান্ত যে null
মানগুলি তা তৈরি করে না, তবে কোনও মান যদি তা তৈরি করে, আমরা এখনও শক্তভাবে জানি know এটি সম্পর্কে কিছু। একটি মান v
যা এই নাল-চেককে পাশ করে তা এখনও খুব জেনেরিক - এটি কিছুই কিন্তুnull
! ব্ল্যাকলিস্টগুলি জেনেরিক-নেসকে শক্তভাবেই বিতরণ করে।
মান null
না থাকলে কখনও "শূন্য মান" বিবেচনা করবেন না। পরিবর্তে, "শূন্য একটি এক্স" বিবেচনা করুন। মূলত, কখনই এর মতো কিছু করার কথা বিবেচনা করবেন না if (isEmpty(val)) { /* ... */ }
- এই isEmpty
ফাংশনটি কীভাবে বাস্তবায়িত হয় (তা আমি জানতে চাই না ...) তা অর্থবহ নয়! এবং এটি উপায় খুব জেনেরিক! শূন্যতা কেবলমাত্র val
এর ধরণের জ্ঞান দিয়ে গণনা করা উচিত । ভ্যাকুয়েন্স-চেকগুলি দেখতে এমন হওয়া উচিত:
- "একটি স্ট্রিং, কোনও অক্ষরবিহীন":
if (isType(val, String) && val.length === 0) ...
- "0 টি প্রপস সহ একটি বস্তু":
if (isType(val, Object) && Object.entries(val).length === 0) ...
- "একটি সংখ্যা, সমান বা শূন্যের চেয়ে কম":
if (isType(val, Number) && val <= 0) ...
"একটি অ্যারে, কোনও আইটেম নেই": if (isType(val, Array) && val.length === 0) ...
কেবলমাত্র ব্যতিক্রমটি যখন null
নির্দিষ্ট কার্যকারিতা বোঝাতে ব্যবহৃত হয়। এই ক্ষেত্রে এটি অর্থবহ: "একটি শূন্য মান":if (val === null) ...