চলক === অপরিবর্তিত বনাম টাইপফ চলক === "অপরিজ্ঞাত"


300

JQuery এর কোর স্টাইল নির্দেশিকা একটি পরিবর্তনশীল সংজ্ঞায়িত করা হয় কিনা তা যাচাই করতে দুটি ভিন্ন উপায়ে সুপারিশ।

  • গ্লোবাল ভেরিয়েবলগুলি: typeof variable === "undefined"
  • স্থানীয় চলক: variable === undefined
  • বিশিষ্টতা: object.prop === undefined

কেন jQuery বিশ্বব্যাপী পরিবর্তনশীলগুলির জন্য একটি পদ্ধতি এবং অন্য স্থানীয় এবং সম্পত্তিগুলির জন্য ব্যবহার করে?


জিকিউরি কেন উভয় পন্থা ব্যবহার করবে এই প্রশ্নের উত্তর আমি দিতে পারছি না, তবে জাভাস্ক্রিপ্টে কিছু আকর্ষণীয় প্রশ্ন রয়েছে যার অর্থ এই দুটি জিনিসই আলাদা আলাদা। বেশিরভাগ সময় এটি বিবেচনা করা উচিত নয় (যেমন আপনার কোডটি বুদ্ধিমান হয়) তবে তবুও পার্থক্য রয়েছে: একটি লেখার জন্য এখানে দেখুন - wtfjs.com/2010/02/15/undefined-is- পরিবর্তনযোগ্য
স্পডলি

2
@ স্ট্রাপ্পি যেমন উল্লেখ করেছেন, jQuery এর বহিরাগততম কার্যক্রমে একটি যুক্তি রয়েছে যার নাম অপরিজ্ঞাত। JQuery এর মধ্যে, foo === undefinedবৈশ্বিক (উইন্ডো.উন্ডফাইন্ডড) এর পরিবর্তে অপরিজ্ঞাতকৃত স্থানীয় অনুলিপিটির বিরুদ্ধে যাচাই করা হচ্ছে, যা পাগল কোড দ্বারা সংশোধিত হতে পারে। অপরিজ্ঞাত যে পরিবর্তনযোগ্য তা সত্যই লক্ষণীয় এবং আপনি খুশী হয়ে আমি আনন্দিত। (+1)
প্যাট্রিক ম্যাকএলহানি

1
নিবন্ধটির জন্য বর্তমান লিঙ্কটি wtfjs.com/wtfs/2010-02-15-undefined-is- পরিবর্তনযোগ্য
enাকা

উত্তর:


366

অঘোষিত ভেরিয়েবলের জন্য, typeof fooস্ট্রিংকে আক্ষরিক ফিরিয়ে দেবে "undefined", যেখানে পরিচয় চেকটি "foo সংজ্ঞায়িত নয়"foo === undefined ত্রুটিটি ট্রিগার করবে ।

স্থানীয় ভেরিয়েবলগুলির জন্য (যা আপনি জানেন যে কোথাও ঘোষণা করা হয়েছে), এ জাতীয় কোনও ত্রুটি ঘটবে না, সুতরাং পরিচয় চেক করুন।


3
@goreSplatter আপনি এখন এটি মুছতে পারবেন না। :-) এটি নির্বাচন করা কঠিন ছিল, তবে প্রশ্নটি যেভাবে বর্ণিত হয়েছে, এই উত্তরটি আরও ভাল। যে কেউ সাধারণভাবে কীভাবে অপরিজ্ঞাত কাজ করে সে সম্পর্কে আগ্রহী (যেমন আমি ছিলাম) অন্যান্য উত্তরগুলিও বিশেষত @ টিম এর দিকে লক্ষ্য করা উচিত।
প্যাট্রিক ম্যাকএলহানি 21

4
আমি typeof foo; // -> "undefined"জোর দেওয়ার জন্য উদ্ধৃতি চিহ্নগুলি যুক্ত করব ) এটি একটি স্ট্রিং এবং আদিম মান নয় undefined
c24w

117

আমি typeof foo === "undefined"সর্বত্র ব্যবহার করতে দৃ stick় থাকব । এটি কখনই ভুল হতে পারে না।

আমি কল্পনা করলাম যে jQuery দুটি পৃথক পদ্ধতির প্রস্তাব দেয় তা হ'ল undefinedjQuery কোড যে ফাংশনে বাস করে সেগুলির মধ্যেই তারা তাদের নিজস্ব ভেরিয়েবলটি সংজ্ঞায়িত করে , সুতরাং সেই ফাংশনের মধ্যেই undefinedবাইরে থেকে চলাচল করা নিরাপদ। আমি আরও কল্পনা করব যে কেউ কোথাও দুটি পৃথক পদ্ধতির বেঞ্চমার্ক করেছে এবং foo === undefinedএটি দ্রুত আবিষ্কার করেছে এবং তাই সিদ্ধান্ত নিয়েছে যে এটিই যাওয়ার পথ। [আপডেট: মন্তব্যগুলিতে উল্লিখিত হিসাবে, তুলনাটিও undefinedসামান্য খাটো, যা বিবেচনা হতে পারে]] তবে, ব্যবহারিক পরিস্থিতিতে লাভ একেবারেই তুচ্ছ হবে: এই চেক কখনও কখনও কোনও ধরণের বাধা হয়ে দাঁড়াবে না এবং কী হবে what আপনি হারান তাৎপর্যপূর্ণ: তুলনার জন্য একটি হোস্ট অবজেক্টের একটি সম্পত্তি মূল্যায়ন করা একটি ত্রুটি ফেলতে পারে যখন এtypeof চেক করবে না।

উদাহরণস্বরূপ, এক্সএমএল পার্স করার জন্য নীচে আইই ব্যবহার করা হয়েছে:

var x = new ActiveXObject("Microsoft.XMLDOM");

এটির loadXMLনিরাপদে কোনও পদ্ধতি আছে কিনা তা পরীক্ষা করতে :

typeof x.loadXML === "undefined"; // Returns false

অন্য দিকে:

x.loadXML === undefined; // Throws an error

হালনাগাদ

typeofআমি যে চেকটি উল্লেখ করতে ভুলে গিয়েছিলাম তার আরেকটি সুবিধা হ'ল এটি অঘোষিত ভেরিয়েবলগুলির সাথেও কাজ করে, যা foo === undefinedচেকটি করে না এবং বাস্তবে এটি একটিকে ছুঁড়ে দেয় ReferenceError। আমাকে স্মরণ করিয়ে দেওয়ার জন্য @ লিনাসক্লিনকে ধন্যবাদ। উদাহরণ স্বরূপ:

typeof someUndeclaredVariable; // "undefined"
someUndeclaredVariable === undefined; // throws a ReferenceError

নীচের লাইন: সর্বদা typeofচেক ব্যবহার করুন ।


10
ধন্যবাদ টিম কর্মক্ষমতা সম্পর্কে আপনার বক্তব্য অর্থবোধ করে। JQuery টিম সম্ভবত ফাইল আকারের প্রভাব সম্পর্কে আরও উদ্বিগ্ন। foo === undefinedযখন ছোট করা হয় তখন সম্ভবত এটি এমন কিছু f===u, যেখানে typeof foo === "undefined"কেবল হ্রাস করা যায় typeof f==="undefined"
প্যাট্রিক ম্যাকএলহানি

1
আপনি var u = "undefined"এটিকে সংজ্ঞায়িত করতে এবং হ্রাস করতে পারেন typeof f==uযা জিনিসগুলিতে উন্নতি করে তবে আরও বড়।
টিম ডাউন

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

2
@ বক্স ৯: আমি অন্য লাইব্রেরির উপস্থিতি যাচাই করার জন্য এটি একটি লাইব্রেরিতে ব্যবহার করার বিষয়টি কল্পনা করতে পারি।
টিম ডাউন

2
@ জন্ট্রো: তখন জেএসলিন্ট ব্যবহার না করার এক কারণ।
টিম ডাউন

29

টাইপফ-ভেরিয়েন্ট ব্যবহারের আরও একটি কারণ: undefinedনতুন সংজ্ঞা দেওয়া যেতে পারে।

undefined = "foo";
var variable = "foo";
if (variable === undefined)
  console.log("eh, what?!");

না পারার ফল typeof variable

আপডেট : নোট করুন যে ES5 এ এটির ক্ষেত্রে নেই সেখানে বিশ্বব্যাপী undefinedএকটি অ-কনফিগারযোগ্য, অ-লিখিতযোগ্য সম্পত্তি:

15.1.1 গ্লোবাল অবজেক্টের মান বৈশিষ্ট্য
[...]
15.1.1.3 অপরিবর্তিত
এর মান অপরিজ্ঞাতundefined (দেখুন 8.1)। এই সম্পত্তিতে
{[[লিখিতযোগ্য]] বৈশিষ্ট্য রয়েছে : মিথ্যা, [[গণনাযোগ্য]]: মিথ্যা, [[কনফিগারযোগ্য]]: মিথ্যা}}

তবে এটি স্থানীয় ভেরিয়েবল দ্বারা ছায়া গোছানো হতে পারে:

(function() {
  var undefined = "foo";
  var variable = "foo";
  if (variable === undefined)
    console.log("eh, what?!");  
})()

বা পরামিতি:

(function(undefined) {
  var variable = "foo";
  if (variable === undefined)
    console.log("eh, what?!");  
})("foo")

17
ইএস 5 এ নতুন সংজ্ঞা দেওয়া যায় না।
রাই-

6
গ্লোবাল undefinedসম্পত্তি ইএস 5 এ নতুন সংজ্ঞা দেওয়া যায় না, তবে স্থানীয় ভেরিয়েবলের সাথে ছায়া দেওয়া যায়। void 0খাটো এবং নিরাপদ।
ওরিওল

7

কারণ undefinedসর্বদা ঘোষিত হয় না, তবে jQuery undefinedতার মূল ফাংশনে ঘোষণা করে । সুতরাং তারা undefinedঅভ্যন্তরীণভাবে নিরাপদ মানটি ব্যবহার করে তবে বাইরে, তারা typeofসুরক্ষিত থাকার জন্য স্টাইলটি ব্যবহার করে ।



1

স্থানীয় ভেরিয়েবলের জন্য, চেক করা localVar === undefinedকাজ করবে কারণ তাদের অবশ্যই স্থানীয় ক্ষেত্রের মধ্যেই সংজ্ঞা দেওয়া হয়েছে বা সেগুলি স্থানীয় হিসাবে বিবেচিত হবে না।

ভেরিয়েবলগুলির জন্য যা স্থানীয় নয় এবং কোথাও সংজ্ঞায়িত নয়, চেকটিsomeVar === undefined ব্যতিক্রম ছুঁড়ে দেবে: অপরিবর্তিত রেফারেন্স এরিয়ার: j সংজ্ঞায়িত করা হয়নি

এখানে এমন কিছু কোড রয়েছে যা আমি উপরে যা বলছি তা স্পষ্ট করে দেবে। আরও স্পষ্টতার জন্য দয়া করে ইনলাইন মন্তব্যে মনোযোগ দিন

function f (x) {
    if (x === undefined) console.log('x is undefined [x === undefined].');
    else console.log('x is not undefined [x === undefined.]');

    if (typeof(x) === 'undefined') console.log('x is undefined [typeof(x) === \'undefined\'].');
    else console.log('x is not undefined [typeof(x) === \'undefined\'].');

    // This will throw exception because what the hell is j? It is nowhere to be found.
    try
    {
        if (j === undefined) console.log('j is undefined [j === undefined].');
        else console.log('j is not undefined [j === undefined].');
    }
    catch(e){console.log('Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.');}

    // However this will not throw exception
    if (typeof j === 'undefined') console.log('j is undefined (typeof(x) === \'undefined\'). We can use this check even though j is nowhere to be found in our source code and it will not throw.');
    else console.log('j is not undefined [typeof(x) === \'undefined\'].');
};

যদি আমরা উপরের কোডটি এভাবে কল করি:

f();

আউটপুটটি এই হবে:

x is undefined [x === undefined].
x is undefined [typeof(x) === 'undefined'].
Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.

যদি আমরা উপরের কোডগুলিতে কল করি (আসলে কোনও মান সহ):

f(null); 
f(1);

আউটপুটটি হবে:

x is not undefined [x === undefined].
x is not undefined [typeof(x) === 'undefined'].
Error!!! Cannot use [j === undefined] because j is nowhere to be found in our source code.
j is undefined (typeof(x) === 'undefined'). We can use this check even though j is nowhere to be found in our source code and it will not throw.

আপনি যখন চেকটি এভাবে করেন typeof x === 'undefined':, আপনি মূলত এটি জিজ্ঞাসা করছেন: দয়া করে পরিবর্তনশীল কিনা তা পরীক্ষা করুনx সোর্স কোডের কোথাও উপস্থিত রয়েছে । (বেশি অথবা কম). আপনি যদি সি # বা জাভা জানেন তবে এই ধরণের চেক কখনও করা হয় না কারণ এটি উপস্থিত না থাকলে এটি সংকলন করবে না।

<== আমার কাছে ফিডল ==>


1

সারসংক্ষেপ:

বৈশ্বিক সুযোগে যখন আমরা ভেরিয়েবলটি ঘোষিত না হয় বা এর মান থাকে তবে আমরা সত্যিকার অর্থে ফিরে আসতে চাই undefined:

var globalVar1;

// This variable is declared, but not defined and thus has the value undefined
console.log(globalVar1 === undefined);

// This variable is not declared and thus will throw a referenceError
console.log(globalVar2 === undefined);

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

var globalVar1;

console.log(typeof globalVar1 === 'undefined');
console.log(typeof globalVar2 === 'undefined');

এটি যখন কোনও ভেরিয়েবল ঘোষিত না হয় বা বর্তমানে মানটি ধরে রাখে তখন typeofঅপারেটর স্ট্রিংটি ফিরিয়ে দেয় কারণ আমরা যা চাই ঠিক তাই dueundefinedundefined


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

var obj = {};

console.log(obj.myProp === undefined);


-5

typeof a === 'undefined'a === 'undefined'নোড v6.9.1 এ প্রায় 2 বার দ্রুত হয়।


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