জাভাস্ক্রিপ্টে অপরিজ্ঞাত পরিবর্তে নাল ব্যবহার করার কী কারণ আছে?


103

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


এই একটি সম্ভাব্য সদৃশ stackoverflow.com/questions/461966/...
lawnsea

ঠিক আছে যে পদ্ধতি document.getElementById()ফিরে আসতে পারে nullকিন্তু না undefined, তাই এই ক্ষেত্রে আপনি কেন রিটার্ন পরীক্ষা করবেন undefined? (অবশ্যই, আপনি যদি এর ==পরিবর্তে ব্যবহার করেন তবে এটি কার্যকর হবে ===তবে তবুও আপনি কেন ইচ্ছাকৃতভাবে ভুল জিনিসের জন্য পরীক্ষা করবেন?)
nnnnnn

ভবিষ্যদ্বাণীযোগ্য প্রকারগুলি ধারণ করতে এটি সহায়ক হতে পারে এবং এটি একে অপরকে ব্যবহার করার চিন্তাভাবনাকে গাইড করতে পারে। যেখানে কোনও বস্তু সর্বদা প্রত্যাবর্তিত হয়, নকশার দ্বারা প্রয়োজনীয় বা চায়, সেখানে মিথ্যা ফলাফলের জন্য নাল ব্যবহার করুন (যেমন document.getElementById('does-not-exist'))। ভেরিয়েবল var a;এবং ফাংশন রিটার্ন মানগুলি পূর্বনির্ধারিত থেকে ডিফল্ট হয়। অতীতে নাল বিশ্বব্যাপী ছিল তাই এটি ব্যবহারের ফলে মৃত্যুদণ্ড কার্যকর করা ধীর হয়ে যায় এবং আমাকে অন্যান্য মিথ্যা ধরণের (মিথ্যা, '', 0) রেফারেন্সের ক্ষেত্রে পছন্দ করতে পছন্দ করে। বাধ্যতামূলক কারণ না থাকলে আমি ব্যক্তিগতভাবে নালাকে এড়িয়ে চলি কারণ অন্যথায় আমি বুঝতে পারি যে এটি সহজ, যা সাধারণত ভাল।
জিম্মন্ট

উত্তর:


59

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

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

যে কারণে আমার কোডে আমি কখনই শূন্য ব্যবহার করি না যদি না আমি এমন কিছু রিটার্ন নিয়ন্ত্রণ না করি (উদাহরণস্বরূপ রেজেক্স ম্যাচিং)। এর সৌন্দর্য এটি অনেক কিছুকে অনুকরণ করে। আমি কখনই x === অপরিজ্ঞাত কিনা তা পরীক্ষা করে দেখতে হবে না x === নাল। এবং যদি আপনি == ব্যবহার করার অভ্যাসে থাকেন বা কেবল (x) এর মতো স্টাফ ... বন্ধ কর. !xখালি স্ট্রিং, 0, নাল, এনএএন - এর জন্য সত্য হিসাবে মূল্যায়ন করা হবে - অর্থাত্ যে জিনিসগুলি আপনি সম্ভবত চান না। আপনি যদি জাভাস্ক্রিপ্ট লিখতে চান যা ঘৃণ্য নয়, সর্বদা ট্রিপল সমান === ব্যবহার করুন এবং কখনই নাল ব্যবহার করবেন না (পরিবর্তে অপরিবর্তিত ব্যবহার করুন)। এটি আপনার জীবনকে সহজ করে তুলবে।


137
আমি এর সাথে একমত নই। কর্মসূচিগতভাবে খালি কিছু সংজ্ঞায়িত করতে নাল ব্যবহৃত হয়। অপরিজ্ঞাত বলতে বোঝায় যে রেফারেন্সটি বিদ্যমান নেই। একটি নাল মান "কিছুই না" একটি সংজ্ঞায়িত রেফারেন্স আছে। আপনি যদি কোনও বস্তুর অস্তিত্বের সম্পত্তিটিকে কল করে থাকেন তবে আপনি সংজ্ঞায়িত হয়ে যাবেন। যদি আমি সেই সম্পত্তিটি ইচ্ছাকৃতভাবে খালি করে ফেলি, তবে এটি অবশ্যই বাতিল হবে যাতে আপনি জানেন যে এটি উদ্দেশ্য ভিত্তিতে on অনেক জাভাস্ক্রিপ্ট লাইব্রেরি এইভাবে কাজ করে।
com2ghz

6
@ com2ghz আপনি যা বর্ণনা করেছেন তা অনেকগুলি দর্শনের মধ্যে একটি। অনেক জেএস লাইব্রেরি সত্যই সেভাবে কাজ করে। অনেকেও সেভাবে কাজ করেন না। জাভাস্ক্রিপ্টে, আপনি শূন্যতার সাথে সহজেই কোনও বস্তু বা অ্যারেতে একটি স্পষ্ট অনির্ধারিত মান সংরক্ষণ করতে পারেন। উভয়ের অর্থ সম্পূর্ণ এবং সম্পূর্ণ প্রসঙ্গে নির্ভর। IE তারা আপনাকে বোঝাতে চাইছে তার অর্থ।
বিটি

3
এজন্য জেএস একটি ভয়ঙ্কর ভাষা। আপনি যেমনটি বলেছেন, অনেক লাইব্রেরির নিজস্ব দর্শন রয়েছে তবে আপনি 1 প্রকল্পের জন্য অনেকগুলি লাইব্রেরি অন্তর্ভুক্ত করেছেন। সুতরাং আপনি এই লাইব্রেরির অনেক কনভেনশন মুখোমুখি। আপনার কতবার বিভিন্ন মিথ্যা চেক তৈরি করতে হবে। এটি শেষ বার হবে না যখন আপনি কোনও স্ট্রিতে নাল বস্তুটি সংযুক্ত করেন এবং স্ট্রিং হিসাবে "নাল" পান। বা একটি 0 কে সংখ্যাসূচক মান হিসাবে পাস করা এবং কেন যদি আইএফ স্টেটমেন্টটি হ্যান্ডেলগুলি ভুয়া হিসাবে বিবেচিত হয়।
com2ghz

2
@ com2ghz সুতরাং জেএস হ'ল একটি ভয়ঙ্কর ভাষা কারণ এটি উভয় নাল এবং অপরিজ্ঞাত? আমি সমস্ত প্রধান ভাষায় কয়েক ডজন খারাপ ভাষার সিদ্ধান্ত গণনা করতে পারি, জেএস এর কোনও ব্যতিক্রম নেই। আমার কোডে মিথ্যা চেক ব্যবহার করতে বা আক্ষরিক অর্থে আমার কখনই প্রয়োজন বা চাই না এবং সর্বদা ===বা ব্যবহার করতে পারি !==। আপনি যদি এটি কীভাবে ব্যবহার করতে জানেন তবে জেএস একটি চমত্কারভাবে অভিব্যক্তিপূর্ণ ভাষা।
বিটি

6
ঠিক। আমি কেবল শিখেছি যে null/ undefinedডাইকোটমি প্রয়োজনীয় ছিল কারণ জেএসের প্রাথমিক সংস্করণটি ছিল না hasOwnPropertyবা inঅপারেটর নেই। এখন এটি হ'ল, আমি সত্যিই বুঝতে পারি না কেন তাদের একজন কেন ES6 বা আমার দেখা কোনও ES7 প্রস্তাবনায় বাতিল হয়নি।
অ্যান্ডি

86

আমার কাছে সত্যিই উত্তর নেই, তবে নিকোলাস সি জাকাস অনুসারে তাঁর " " ওয়েব বিকাশকারীদের জন্য পেশাদার জাভাস্ক্রিপ্ট " বইয়ের পৃষ্ঠা 30 :

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


8
+1 হ্যাঁ, আমি সম্মত এবং আমি সর্বদা যুদ্ধগুলি শূন্য করার জন্য মনে রাখার চেষ্টা করি। তারপরে আমি (বেশ) নিশ্চিত যে এর undefinedঅর্থ একটি বিপর্যয় ঘটেছে। শুধু imho।
পিট উইলসন

9
@ পিট - তবে এটি আপনাকে "বিপর্যয়" সম্পর্কে কিছুই জানায় না, তবে কী লাভ? এবং আপনি কেবল সেই ধারণাটি তৈরি করতে পারেন যদি আপনি জানেন যে ফাংশনটি কনভেনশন অনুসরণ করে।
রবিজি

7
অন্যদিকে, আপনি ভেরিয়েবলটি আরম্ভ করতে পারেন এবং পরবর্তী সময়ে কোনও অবজেক্ট রেফারেন্স দিয়ে ভরাট হয়েছে কিনা তা নির্ধারণের var myVar;জন্য স্পষ্টরূপে মানটি পরীক্ষা undefinedকরতে পারেন। আমার বক্তব্যটি এটি সম্পূর্ণ একাডেমিক - আপনি এটি যে কোনও উপায়ে করতে পারেন, এবং যে কেউ অন্য উপায়ে এক উপায়ে পরামর্শ দেয় তারা কেবল তাদের নিজস্ব সম্মেলনকে চাপ দিচ্ছে।
thordan

1
আমার একমাত্র সমস্যা (যেহেতু আমি 15 বছর আগে জাভাস্ক্রিপ্ট দিয়ে শুরু করেছি) তা হ'ল আপনাকেও প্রায়শই পরীক্ষা করতে হয় undefinedএবং null। এটি এখনও সত্যই বিরক্তিকর। আমি nullঅতিরিক্ত nullপরীক্ষার সংখ্যা হ্রাস করার জন্য একটি ভেরিয়েবল বরাদ্দ করা এড়াতে চাই ।
জি ম্যান

4
@ জিএমান - এটিই একমাত্র জায়গা যেখানে ==তুলনাটি (এর বিপরীতে ===) অর্থ দেয়: v == null(বা v == undefined) নাল বা অপরিজ্ঞাত পরীক্ষা করবে।
রিক লাভ

14

দিনের শেষে, কারণ উভয়ই nullএবং undefinedএকই মান ( Boolean(undefined) === false && Boolean(null) === false) এর উপর জোর করে , আপনি প্রযুক্তিগতভাবে কাজটি সম্পন্ন করতে হয় ব্যবহার করতে পারেন। তবে সঠিক উপায় আছে, আইএমও।

  1. undefinedজাভাস্ক্রিপ্ট সংকলক ব্যবহার ছেড়ে দিন ।

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

  2. কেবলমাত্র নাল ব্যবহার করুন যদি আপনি সুস্পষ্টভাবে কোনও ভেরিয়েবলের মান "কোনও মূল্য না" হিসাবে চিহ্নিত করতে চান তবে ull

    যেমন @ com2gz বলেছেন: nullপ্রোগ্রামগতভাবে খালি কিছু সংজ্ঞায়িত করতে ব্যবহৃত হয়। undefinedরেফারেন্স বিদ্যমান নেই বলতে বোঝানো হয়। একটি nullমান "কিছুই না" একটি সংজ্ঞায়িত রেফারেন্স আছে। আপনি যদি কোনও বস্তুর অ-বিদ্যমান সম্পত্তিকে কল করে থাকেন তবে আপনি পাবেন undefined। যদি আমি সেই সম্পত্তিটি ইচ্ছাকৃতভাবে খালি করে ফেলি, তবে এটি অবশ্যই এমন হতে হবে nullযে আপনি জানেন যে এটি উদ্দেশ্য।

TLDR; undefinedআদিম ব্যবহার করবেন না । এটি কোনও মান যে জাস কম্পাইলার স্বয়ংক্রিয়ভাবে আপনার জন্য সেট করবে যখন আপনি অ্যাসাইনমেন্ট ছাড়াই ভেরিয়েবলগুলি ঘোষণা করেন বা যদি আপনি কোনও বস্তুর বৈশিষ্ট্য অ্যাক্সেস করার চেষ্টা করেন যার জন্য কোনও রেফারেন্স নেই। অন্যদিকে, nullআপনি যদি ইচ্ছাকৃতভাবে কোনও ভেরিয়েবলটির "কোনও মূল্য না" চান তবে এবং যদি ব্যবহার করুন ।

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

function printArguments(a,b) {
  console.log(a,b);
}

printArguments(null, " hello") // logs: null hello

এটি নির্বাচিত উত্তর হওয়া উচিত ছিল
আলাবৌদি

13

অপরিজ্ঞাপিত হয় যেখানে জিনিসটির কোন ধারণা বিদ্যমান নেই; এটির কোনও প্রকার নেই, এবং এর আগে আগে কখনও তা উল্লেখ করা হয়নি; নাল হল যেখানে জিনিসটির অস্তিত্ব আছে বলে জানা গেছে, তবে এর কোনও মূল্য নেই।


4
তুমি কিভাবে জানলে যদি একটি প্রয়াস একটি মান নির্ধারণ করা হয়েছে, কিন্তু এটি ব্যর্থ হয়েছে এবং অনির্দিষ্ট পরিবর্তে নিয়োগ করা হয়েছিল?
রবিজি

11

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

ধরা যাক আপনি jQuery প্লাগইনের জন্য বিকল্পগুলির মতো অবজেক্টের বৈশিষ্ট্যগুলির সাথে কাজ করছেন ... নিজেকে জিজ্ঞাসা করুন জাভাস্ক্রিপ্ট কোনও সম্পত্তি দেয় যা এখনও নির্ধারিত হয়নি - উত্তরটি undefined। সুতরাং এই প্রসঙ্গে জাভাস্ক্রিপ্টের সাথে সামঞ্জস্য রাখতে আমি এই ধরণের জিনিসগুলি 'অপরিজ্ঞাত' দিয়ে শুরু করব (ভেরিয়েবলের জন্য, আপনি var myVar;পরিবর্তে এটি করতে পারেন )var myVar = undefined; )।

এখন ধরা যাক আপনি ডিওএম ম্যানিপুলেশন করছেন ... জাভাস্ক্রিপ্ট অমূল্য উপাদানগুলিকে কোন মান নির্ধারণ করে? উত্তরটা হচ্ছেnull । আপনি যদি কোনও স্থানধারক ভেরিয়েবল তৈরি করে থাকেন যা পরে ডিওমের সাথে সম্পর্কিত কোনও উপাদান, ডকুমেন্ট খণ্ড বা অনুরূপ একটি রেফারেন্স ধরে রাখে তবে আমি এটির মানটিই শুরু করব।

আপনি যদি JSON এর সাথে কাজ করছেন তবে একটি বিশেষ কেস তৈরি করা দরকার: অপরিজ্ঞাত সম্পত্তি সম্পত্তিগুলির জন্য আপনাকে সেগুলি সেট করা উচিত ""বা এর nullমান হিসাবেundefined যথাযথ JSON ফর্ম্যাট হিসাবে বিবেচনা করা হয় না।

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


: যদিও এই একটি ভাল ভঙ্গি, আমি এই উত্তর যোগ করতে চান stackoverflow.com/a/37980662/883303
Frederik Krautwald

লিঙ্কটির জন্য @ ফ্রেডরিক ক্রাউটওয়াল্ড ধন্যবাদ - এটি একটি খুব স্পষ্ট বর্ণন ine
thordan

10

আপনি এখানে প্রস্তাবিত কনভেনশন গ্রহণ করতে পারেন, তবে এর আসলে কোনও ভাল কারণ নেই। এটি অর্থবহ হতে যথেষ্ট ধারাবাহিকভাবে ব্যবহৃত হয় না।

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

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


3

শূন্যে একটি দরকারী সম্পত্তি যা অপরিশোধিত যোগ্য নয়:

> null + 3
3
> undefined + 3
NaN

আমি nullযখন একটি সংখ্যার মান 'বন্ধ' করতে চাই বা কিছু শুরু করতে চাই তখন আমি ব্যবহার করি। আমার শেষ ব্যবহারটি সিএসএস রূপান্তরকে হেরফের করছিল:

const transforms = { perspective : null, rotateX : null };
// if already set, increase, if not, set to x
runTimeFunction((x) => { trasforms.perspective += x; });
// still useful, as setting perspective to 0 is different than turning it off
runTimeFunction2((x) => { transforms.perspective = null; });

// toCss will check for 'null' values and not set then at all
runTimeFunction3(() => { el.style.transform = toCss(transforms); });

আমার এই সম্পত্তিটি ভাবা উচিত কিনা তা নিশ্চিত নয় ...


2

ডোম নোড এবং উপাদানগুলি অপরিজ্ঞাত নয়, তবে এটি শূন্য হতে পারে।

  • কোনও উপাদানটির শেষ সন্তানের পরবর্তী শিখরটি শূন্য।

  • প্রথম সন্তানের পূর্ববর্তী শিলিংটি শূন্য।

  • যদি ডকুমেন্টে উপাদান উপস্থিত না থাকে তবে একটি ডকুমেন্ট.জেটএলমেন্টবিআইআইডি রেফারেন্স নাল।

তবে এর কোনও ক্ষেত্রেই মূল্য নির্ধারিত হয় না ; এখানে কোন নোড নেই।


ব্যাখ্যার জন্য ধন্যবাদ. আমার জন্য এটি আরও পাল্টা স্বজ্ঞাত হতে পারে না।
টমেকভি

আপনি যা যাচাই করার চেষ্টা করছেন তার উপর এটি সত্যই নির্ভর করে। উদাহরণস্বরূপ, যদি আপনি দেখতে চান যে 'মাইভার' নামের একটি বৈশ্বিক ভেরিয়েবল রয়েছে কিনা, তার window.myVarঅস্তিত্ব না থাকলে 'অপরিবর্তিত' ফিরে আসবে। জাভাস্ক্রিপ্টে 'অপরিবর্তিত' ফিরে আসা এমন অনেকগুলি জিনিস রয়েছে, কেবল এমন অনেকগুলি জিনিস রয়েছে যা 'নাল' ফেরায় - এটি সমস্ত প্রসঙ্গে নির্ভর করে।
thordan

2

কয়েকজন বলেছেন যে অবজেক্টগুলিতে আরম্ভ করা ঠিক আছে null। আমি কেবল এটি চিহ্নিত করতে চেয়েছিলাম যে ধ্বংসাত্মক যুক্তি ডিফল্টগুলি কাজ করে না null। উদাহরণ স্বরূপ:

const test = ({ name } = {}) => {
  console.log(name)
}

test() // logs undefined
test(null) // throws error

এটি প্রায়শই ঘটতে পারে যা ফাংশন কল করার আগেnull চেক সম্পাদন করা প্রয়োজন ।


1

আমি এখনই এই সঠিক প্রশ্নের মধ্য দিয়ে কাজ করছি, এবং নিম্নলিখিত দর্শনের দিকে তাকিয়েছি:

  1. ফলাফল ফিরিয়ে আনার উদ্দেশ্যে যে কোনও ক্রিয়াকলাপ যদি কোনও ফলাফল খুঁজে না পায় তবে তা বাতিল করতে হবে should
  2. ফলস্বরূপ কোনও ফলাফল ফেরত দেওয়ার উদ্দেশ্যে নয় এমন কোনও ক্রিয়াকলাপ অনির্ধারিতভাবে প্রদান করে।

আমার জন্য, এই প্রশ্নটি তাৎপর্যপূর্ণ কারণ যে কোনও ফাংশন কল করে যার ফলশ্রুতি আসে তার অপরিজ্ঞাত বনাম নাল পরীক্ষা করা উচিত কিনা সে বিষয়ে কোনও প্রশ্নই আসে না।

এই উত্তরটি সম্বোধনের চেষ্টা করে না:

  1. নাল বনাম সম্পত্তির মান Property
  2. আপনার ফাংশনগুলির মধ্যে ভেরিয়েবলগুলি নাল বনাম অপরিবর্তিত

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


1

এখানে একটি কারণ: var undefined = 1 আইনী জাভাস্ক্রিপ্ট, তবে var null = 1এটি একটি সিনট্যাক্স ত্রুটি। পার্থক্যটি হ'ল nullএকটি ভাষা কীওয়ার্ড, যদিও undefinedকোনও কারণে, না।

যদি আপনার কোডটি এমন তুলনাতে নির্ভর করে undefinedযে এটি একটি কীওয়ার্ড ( if (foo == undefined)- তৈরি করা খুব সহজ ভুল) যা কেবলমাত্র কাজ করে কারণ কেউই সেই নামের সাথে একটি ভেরিয়েবল সংজ্ঞা দেয় নি। সমস্ত কোডটি দুর্ঘটনাক্রমে বা দূষিতভাবে সেই নামের সাথে একটি বিশ্বব্যাপী ভেরিয়েবল সংজ্ঞায়িত করা কারও পক্ষে ঝুঁকিপূর্ণ। অবশ্যই, আমরা সবাই জানি যে দুর্ঘটনাক্রমে একটি বৈশ্বিক পরিবর্তনশীল সংজ্ঞা দেওয়া জাভাস্ক্রিপ্টে সম্পূর্ণ অসম্ভব ...


1
অপরিশোধিত void 0পরিবর্তে ব্যবহার করুন ।
ফ্রেডেরিক ক্রাউটওয়াল্ড

1

কিছু নির্দিষ্ট জাভাস্ক্রিপ্ট লাইব্রেরির ব্যবহারের সাথে কেবল এটি যোগ করতে চাই, নাল এবং অপরিজ্ঞাত অনিচ্ছাকৃত পরিণতি হতে পারে।

উদাহরণস্বরূপ, লোডাশের getফাংশন, যা তৃতীয় আর্গুমেন্ট হিসাবে একটি ডিফল্ট মান গ্রহণ করে:

const user = {
  address: {
    block: null,
    unit: undefined,
  }
}
console.log(_.get(user, 'address.block', 'Default Value')) // prints null
console.log(_.get(user, 'address.unit', 'Default Value')) // prints 'Default Value'
console.log(_.get(user, 'address.postalCode', 'Default Value')) // prints 'Default Value'

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

class MyComponent extends React.Component {
   static defaultProps = {
      callback: () => {console.log('COMPONENT MOUNTED')},
   }
   componentDidMount() {
      this.props.callback();
   }
}
//in some other component
<MyComponent />   // Console WILL print "COMPONENT MOUNTED"
<MyComponent callback={null}/>   // Console will NOT print "COMPONENT MOUNTED"
<MyComponent callback={undefined}/>   // Console WILL print "COMPONENT MOUNTED"

0

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

নাল ব্যবহারের পুরো অর্থ হ'ল কেবলমাত্র বস্তুর সাথে ভেরিয়েবল বা সম্পত্তি বাঁধাই যা এককভাবে এবং শূন্যতার অর্থ এবং নাল ব্যবহারের কার্য সম্পাদনের উদ্দেশ্যও রয়েছে। এই 2 কোডের পার্থক্য সম্পাদনের সময় রয়েছে।

var p1 = function(){this.value = 1};
var big_array = new Array(100000000).fill(1).map((x, index)=>{
    p = new p1();
    if(index > 50000000){
       p.x = "some_string";
    }

    return p;
});
big_array.reduce((sum, p)=> sum + p.value, 0)

var p2 = function(){this.value = 1, p.x = null};
var big_array = new Array(100000000).fill(1).map((x, index)=>{
    p = new p2();
    if(index > 50000000){
       p.x = "some_string";
    }

    return p; 
});
big_array.reduce((sum, p)=> sum + p.value, 0)

0

অজানা পরিবর্তনশীল: undefined

জ্ঞাত পরিবর্তনশীল এখনো কোন মান: null

  1. আপনি একটি সার্ভার থেকে একটি অবজেক্ট পাবেন server_object,।
  2. আপনি রেফারেন্স server_object.errj। এটা আপনাকে বলে undefined। তার মানে এটি কী তা জানে না।
  3. এখন আপনি রেফারেন্স server_object.err। এটা আপনাকে বলে null। এর অর্থ আপনি একটি সঠিক পরিবর্তনশীল উল্লেখ করছেন তবে এটি খালি; সুতরাং কোন ত্রুটি।

সমস্যাটি যখন আপনি কোনও ভেরিয়েবলের নাম ঘোষনা করেন ( var hello) জেএস ঘোষণা করে যে undefined: এই পরিবর্তনশীলটির অস্তিত্ব নেই; প্রোগ্রামারদের বেশিরভাগ অর্থ: "আমি এখনও এটির কোনও মূল্য দিইনি", এর সংজ্ঞা null

সুতরাং প্রোগ্রামারটির ডিফল্ট আচরণ nothing মান হিসাবে কিছুই না করে একটি ভেরিয়েবল ঘোষণা করা j জেএসের সাথে বিরোধিতা করে। এটিকে বিদ্যমান নয় বলে ঘোষণা করে। এবং পাশাপাশি, !undefinedএবং !nullউভয়ই trueতাই বেশিরভাগ প্রোগ্রামাররা তাদের সমতুল্য বলে মনে করে।

আপনি অবশ্যই নিশ্চিত করতে পারেন যে আপনি সর্বদা করেন var hello = nullতবে বেশিরভাগ তাদের কোডগুলি লিখিতভাবে জঞ্জাল না করে ইচ্ছাকৃতভাবে শিথিলভাবে টাইপ করা ভাষায় টাইপ স্যানিটি নিশ্চিত করার জন্য, যখন তারা এবং !অপারেটর উভয় undefinedএবং nullসমতুল্য হিসাবে আচরণ করে ।

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