জাভাস্ক্রিপ্ট নাল চেক


170

আমি নিম্নলিখিত কোড জুড়ে এসেছি:

function test(data) {
    if (data != null && data !== undefined) {
        // some code here
    }
}

আমি জাভাস্ক্রিপ্টে কিছুটা নতুন, কিন্তু অন্যান্য প্রশ্নগুলি থেকে আমি এখানে পড়ছি, আমি এই ধারণাটির আওতায় আছি যে এই কোডটি খুব বেশি বোঝায় না।


বিশেষত, এই উত্তরটি বলে যে

আপনি ব্যতীত অন্য যে কোনও প্রসঙ্গে একটি অনির্ধারিত পরিবর্তনশীল অ্যাক্সেস করলে আপনি একটি ত্রুটি পাবেন typeof

আপডেট: উপরের উত্তরটির (এর উদ্ধৃতি) বিভ্রান্তিকর হতে পারে। এটা বলা উচিত «অঘোষিত পরিবর্তনশীল» , পরিবর্তে «অনির্ধারিত পরিবর্তনশীল»

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


আমার উপলব্ধি থেকে, নিম্নলিখিত পরিস্থিতিতে অভিজ্ঞতা হতে পারে:

  • কোনও তর্ক ছাড়াই ফাংশনটি ডাকা হয়েছিল, এভাবে dataএকটি সংজ্ঞায়িত পরিবর্তনশীল তৈরি করা এবং ত্রুটি বাড়ানো data != null

  • ফাংশনটি বিশেষত null(বা undefined) এর সাথে যুক্তি হিসাবে ডাকা হত , যার ক্ষেত্রে data != nullইতিমধ্যে অভ্যন্তরীণ কোড রক্ষা করে, && data !== undefinedঅকেজো করে।

  • ফাংশন একটি অ নাল যুক্তি, যা ক্ষেত্রে এটি জাভাস্ক্রিপ্টে গার্বেজ উভয় পাস হবে সঙ্গে বলা হয় data != null এবং data !== undefined

প্রশ্ন: আমার বোঝাপড়াটি কি সঠিক?


ফায়ারফক্সের কনসোলে আমি নিম্নলিখিতটি চেষ্টা করেছি:

--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true

আমি কোনও কেস বের করতে পারি না যেখানে এর data !== undefined পরে data != null কোনও ব্যবহার হতে পারে।


9
শুধু ব্যবহার if (data)dataভেরিয়েবলটি সত্য হিসাবে মূল্যায়ন করে কিনা তা যাচাই করার জন্য এটি স্মরণীয় জাভাস্ক্রিপ্টের উপায় । undefined,, nullমিথ্যা, 0, খালি স্ট্রিং, খালি অ্যারে এবং (?) অবজেক্টের কোনও বৈশিষ্ট্য মিথ্যা হিসাবে মূল্যায়ন করে না, বাকীটি সত্য।
J0HN

20
@ জে0 জন - ব্যবহারের if(data)অর্থ হ'ল তিনি উত্তীর্ণ হতে পারবেন না falseবা 0মান হিসাবেও পারবেন না data
টেকফুবার

@ জে0 জন এছাড়াও, আমি যে উত্তরটি উল্লেখ করেছি একই জবাবটিতে আরও বলা হয়:: if(typeof someUndefVar == whatever) -- worksএবং if(someUnderVar) -- error
আফসান্টোস

2
এটি সম্ভবত অনুমান করা যায় data !== null && data !== undefined, যা সমান data != nullসমান data != undefined। পূর্বের ফর্মটি শর্তাবলী সম্পর্কে আরও সুস্পষ্টরূপে অনুগ্রহ করা যায়, যদিও উভয়ই উপেক্ষা করা সহজ হবে nullএবং undefinedপরবর্তী দুটি শর্তের সাথে পরীক্ষা করা হচ্ছে।
zzzzBov

2
যাইহোক, এর জন্য সুস্পষ্ট পরীক্ষাগুলি undefinedহ'ল আইএমও একটি কোড গন্ধ। এটি কোনও সুরক্ষিত কীওয়ার্ড নয় null, এটি একটি পরিবর্তনশীল যা অপরিজ্ঞাত হওয়ার পরে ঘটে। এটি সম্পূর্ণরূপে বৈধ এবং আপনার কোডটি ভঙ্গ করতে চলেছে:undefined = 1
ইজকাটা

উত্তর:


106

একটি "অপরিবর্তিত ভেরিয়েবল" মান থেকে পৃথক undefined

একটি অপরিবর্তিত ভেরিয়েবল:

var a;
alert(b); // ReferenceError: b is not defined

মান সহ একটি পরিবর্তনশীল undefined:

var a;
alert(a); // Alerts “undefined”

যখন কোনও ফাংশন একটি আর্গুমেন্ট নেয়, তখন সেই যুক্তিটি সর্বদা ঘোষণা করা হয় যদিও এর মান হয় undefinedএবং তাই কোনও ত্রুটি হবে না। আপনি ঠিক চলেছেন != nullদ্বারা অনুসরণ !== undefined, যদিও বেহুদা হচ্ছে।


32
data !== null && data !== undefinedযদিও বুদ্ধিমান হবে।
bfavareto

@ বিভাভেরেটো: হ্যাঁ, তাই এটি আসলে টাইপও হতে পারে। কিন্তু আপনি কি জানেন না ...: D:
Ry-

1
আমি যেমন ভেবেছি, স্পষ্টতার জন্য ধন্যবাদ। এছাড়াও, আমি এটি টাইপো বলে মনে করি না। আমি পুরো স্ক্রিপ্টে একটি অনুসন্ধান ও গণনা চালিয়েছি এবং এটি 10 ​​টি ঘটনা পেয়েছে, তাই ... আমার ধারণা অনুমান লেখকেরও এ সম্পর্কে স্পষ্টতা দরকার।
আফসান্টোস

2
উপরের আমার মন্তব্যটি স্ক্র্যাচ করুন: আসলে, data != nullউভয় nullএবং undefined(তবে আকর্ষণীয়ভাবে, কেবল nullএবং এর জন্য এবং undefinedঅন্যান্য জঘন্য মূল্যবোধের জন্য নয়) যাচাই করবে।
bfavareto

90

জাভাস্ক্রিপ্টে, nullএকটি বিশেষ সিঙ্গলটন অবজেক্ট যা "কোনও মূল্য নেই" সংকেত দেওয়ার জন্য সহায়ক। আপনি তুলনা করে এটি পরীক্ষা করতে পারেন এবং জাভাস্ক্রিপ্টে যথারীতি ===বিভ্রান্তিকর ধরণের চাপ এড়াতে অপারেটরটি ব্যবহার করা ভাল অভ্যাস :

var a = null;
alert(a === null); // true

@ অরিনা যেমন উল্লেখ করেছেন, জাভা স্ক্রিপ্টে "অপরিজ্ঞাত" কিছুটা বিভ্রান্তিকর। তবে, typeof(x)"x" ঘোষিত ভেরিয়েবল না হলেও স্ট্রিংটি "অপরিজ্ঞাত" কিনা তা পরীক্ষা করা সর্বদা নিরাপদ :

alert(typeof(x) === 'undefined'); // true

এছাড়াও, ভেরিয়েবলগুলির আরম্ভ না করা হলে "অপরিবর্তিত মান" থাকতে পারে:

var y;
alert(typeof(y) === 'undefined'); // true

এগুলি একসাথে রেখে, আপনার চেকটি দেখতে এমন হওয়া উচিত:

if ((typeof(data) !== 'undefined') && (data !== null)) {
  // ...

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

function(data) {
  if ((data !== undefined) && (data !== null)) {
    // ...

এই স্নিপেট বলতে "যদি ফাংশনটি এমন একটি যুক্তি দিয়ে ডাকা হত যা সংজ্ঞায়িত হয় এবং নাল না হয় ..."


5
কেন করা উচিত নয় এটা, যদিও যে দেখতে কেমন? এবং != nullবাদে সমস্ত মানগুলির ক্ষেত্রে সত্য হবে এবং আমরা নিশ্চিত যে এই পরিবর্তনশীলটি ঘোষিত হয়েছে। অন্যান্য পরিস্থিতিতে এমনকি বিপজ্জনক হতে পারে - আপনি যদি ভেরিয়েবলের নামটি ভুল টাইপ করেন তবে? এটি একটি দীর্ঘ সময়ের জন্য সনাক্ত করা যেতে পারে কারণ কোনও ত্রুটি নেই। nullundefinedtypeof
রাই-

@ মায়ারিকস, যদি আমি উপরের দৃশ্যের মতো নাল চেক করে আপনার উত্তরটি সঠিকভাবে অনুসরণ করি, আপনি !=কেবলমাত্র কঠোর তুলনা করবেন না !==,?
আফসান্টোস

@ অরিনা: আমি নাল পরীক্ষা উপযুক্ত কিনা তা জানতে ওপি-র সামগ্রিক সমাধান সম্পর্কে পর্যাপ্ত পরিমাণে জানার কথা অনুমান করি না তবে "টাইপফ" ব্যবহার করা অপ্রয়োজনীয় তা উল্লেখ করার জন্য আমি সম্পাদনা করেছি।
maerics

@ আফসান্টোস: বাস্তবে আমি মনে করি না যে অনেকগুলি (কোনও?) মানগুলি বাতিল হয়ে যাবে; তবে, কঠোর তুলনা ( ===) ব্যবহার করা সেরা অভ্যাস যা আপনি যদি না জেনে থাকেন আপনি কী করছেন এবং রূপান্তর ( ==) এর পরে তুলনা না চান ।
maerics

1
@ ইজকাটা: যে কোনও লাইব্রেরি পুনরায় সংজ্ঞায়িত করার চেষ্টা করে তা ফেলে দিন undefined। এছাড়াও, আইপ্যাডে থাকা সাফারি কোনও পরিস্থিতিতে এটি করবে। আপনিও পারবেন না delete window.undefined
রাই-

10

আপনার ক্ষেত্রে ব্যবহার করুন data==null(যা কেবল নাল এবং অপরিজ্ঞাত জন্য সত্য - সারি / কলামগুলিতে দ্বিতীয় চিত্র ফোকাসে নাল-অপরিজ্ঞাত)

এখানে আপনার সমস্ত ( এসসিআর ) রয়েছে:

যদি

এখানে চিত্র বর্ণনা লিখুন

== (এর অবহেলা ! = )

এখানে চিত্র বর্ণনা লিখুন

=== (এর অবহেলা ! == )

এখানে চিত্র বর্ণনা লিখুন


8

প্রশ্ন: ফাংশনটি কোনও যুক্তি ছাড়াই ডাকা হয়েছিল, এভাবে ডেটাটিকে একটি সংজ্ঞায়িত ভেরিয়েবল তৈরি করে এবং ডেটাতে ত্রুটি বাড়িয়ে তোলে! = নাল।

উত্তর: হ্যাঁ, dataসংজ্ঞায়িত করা হবে। অনুচ্ছেদটি 10.5 বিভাগের ঘোষণা বাঁধাই ইনস্ট্যান্টেশন দেখুন । কিন্তু একটি অপরিজ্ঞাত মান অ্যাক্সেস একটি ত্রুটি বাড়ায় না। আপনি সম্ভবত এটি কঠোর মোডে একটি অঘোষিত ভেরিয়েবল অ্যাক্সেস দিয়ে বিভ্রান্ত করছেন যা কোনও ত্রুটি বাড়িয়ে তোলে।

প্রশ্ন: ফাংশনটি বিশেষত নাল (বা অপরিজ্ঞাত) দিয়ে তার যুক্তি হিসাবে ডাকা হত, যার ক্ষেত্রে ডেটা! = নাল ইতিমধ্যে অভ্যন্তরীণ কোড, রেন্ডারিং এবং& ডেটা রক্ষা করে! == অপরিবর্তিত অকেজো।

প্রশ্ন: ফাংশনটি একটি নন-নাল আর্গুমেন্টের সাথে ডাকা হয়েছিল , এক্ষেত্রে এটি তুচ্ছভাবে উভয় ডেটা পাস করবে! = নাল এবং ডেটা! == অপরিবর্তিত।

উঃ সঠিক। নোট করুন যে নিম্নলিখিত পরীক্ষাগুলি সমতুল্য:

data != null
data != undefined
data !== null && data !== undefined

বিভাগ ১১.৯.৩ দেখুন অ্যাবস্ট্রাক্ট সমতা তুলনা অ্যালগরিদম এবং বিভাগ ১১.৯..6 স্পষ্টের কঠোর সমতা তুলনা অ্যালগরিদম


আমি অঘোষিত ভেরিয়েবলগুলির সাথে বিভ্রান্ত হচ্ছিলাম না, যখন কোনও যুক্তি সরবরাহ করা হয়নি তখন এটি কীভাবে কাজ করে তা আমি সত্যিই জানতাম না। আমি নিশ্চিত ছিলামdata সেট করার পরিবর্তে কোনও অস্তিত্বই থাকবে না undefined। আমি স্পষ্টতার প্রশংসা করি এবং সেগুলি উল্লেখগুলি উভয় সমতা কীভাবে কাজ করে তা আরও ভালভাবে আমাকে বুঝতে সাহায্য করেছিল।
আফসান্টোস

3

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

function (data) {
  if (data != null && data !== undefined) {
    // some code here
    // but what if data === false?
    // or data === '' - empty string?
  }
}

এরকম কিছু করুন:

function (data) {
  if (typeof data === 'string' && data.length) {
    // consume string here, it is here for sure
    // cleaner, it is obvious what type you expect
    // safer, less error prone due to implicit coercion
  } 
}

2

typeof foo === "undefined"থেকে আলাদা foo === undefined, তাদের কখনও বিভ্রান্ত করবেন না। typeof foo === "undefined"আপনার যা প্রয়োজন তা হল। এছাড়াও, !==জায়গায় ব্যবহার করুন!=

সুতরাং বিবৃতি হিসাবে লেখা যেতে পারে

function (data) {
  if (typeof data !== "undefined" && data !== null) {
    // some code here
  }
}

সম্পাদনা:

আপনি foo === undefinedঅঘোষিত ভেরিয়েবলের জন্য ব্যবহার করতে পারবেন না ।

var t1;

if(typeof t1 === "undefined")
{
  alert("cp1");
}

if(t1 === undefined)
{
  alert("cp2");
}

if(typeof t2 === "undefined")
{
  alert("cp3");
}

if(t2 === undefined) // fails as t2 is never declared
{
  alert("cp4");
}

1
ঠিক আছে, তবে এই ক্ষেত্রে ভেরিয়েবল ঘোষিত হয়, তবে সমস্যাটি কী?
রাই-

ব্যক্তিগতভাবে, আমি foo === undefinedব্যবহার করা বিপজ্জনক বলে মনে করি । এটি আপনার কোডটিকে একই অবস্থার জন্য ব্যর্থ করে তোলে যা আপনি আটকাতে চাইছিলেন।

আমি প্রশ্নে ফাংশন যুক্তি সম্পর্কে কথা বলছি। আরও দেখুন আমার অন্যান্য মন্তব্য
রাই-

1
কেন এটিকে নিম্নমানের করা হচ্ছে very প্রথম বাক্যটিই একটি সঠিক এবং গুরুত্বপূর্ণ পার্থক্য!
ইজকাটা 21'13

1
@ ইজকাটা: কারণ প্রাথমিক বক্তব্যের কোনও ব্যাখ্যা নেই। foo === undefinedওপি'র পরিস্থিতিতে পুরোপুরি গ্রহণযোগ্য (ধরে undefinedনিলে ওভাররাইড করা হয়নি)। উত্তরটি কেন !== জায়গায় ব্যবহার করা উচিত তা ব্যাখ্যা করতে ব্যর্থ হয় !=
ম্যাট

1

আপনার পরীক্ষাটি করার সহজ উপায় হ'ল:

function (data) {
    if (data) { // check if null, undefined, empty ...
        // some code here
    }
}

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

5
ছাড়া যে যদি "ডেটা" মান আছে ""বা 0অথবা NaN(বা অন্যদের) "যদি" ব্লক এড়ানো হবে; যা অপের অভিপ্রায় বা নাও থাকতে পারে।
মায়ারিক্স

দুঃখিত @ আফসান্টোস, আমি আপনার মন্তব্যটি দেখিনি, আপনি যদি ডেটা অপরিজ্ঞাতকৃত অবস্থায় মিথ্যা পেতে চান, তারিখ শূন্যের তারিখ ব্যতীত আপনার অন্য একটি ট্যারেস্ট = ডেটা তৈরি করতে হবে ; প্রথম পরীক্ষার পরে অন্য পরীক্ষার মতো: যদি (টোস্ট == "") {// এখানে কিছু কোড}
কাদিরি

-5
var a;
alert(a); //Value is undefined

var b = "Volvo"; 
alert(b); //Value is Volvo

var c = null;
alert(c); //Value is null

4
এর অর্থ কী বলে বোঝানো হচ্ছে দয়া করে কিছু ব্যাখ্যা যুক্ত করুন।
Ry-

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