জেএসলিন্ট প্রত্যাশিত '===' এবং এর পরিবর্তে '==' দেখেছেন


90

এই ত্রুটিটি নিয়ে এসে আমি সম্প্রতি জেএসলিন্টের মাধ্যমে আমার কিছু কোড চালাচ্ছিলাম। এই ত্রুটিটি সম্পর্কে আমি যে জিনিসটি মজার মনে করি তা হ'ল এটি স্বয়ংক্রিয়ভাবে ধরে নেয় যে সমস্ত == হওয়া উচিত ===।

এটি কি আসলেই কোনও অর্থবোধ করে? আমি প্রচুর উদাহরণ দেখতে পেলাম যে আপনি টাইপের তুলনা করতে চান না এবং আমি আশঙ্কা করছি যে এটি আসলে সমস্যার কারণ হতে পারে।

"প্রত্যাশিত" শব্দটি বোঝায় যে এটি প্রতিটি সময় করা উচিত ..... এটি আমার কাছে বোধগম্য নয়।


7
আমি জেএসলিন্টের সাথে এটির মধ্যে দৌড়েছি। আমি == থেকে === থেকে একটি আপডেট করেছি এবং এটি আসলে পূর্ববর্তী কার্য কোডটি ভেঙে দিয়েছে।
কেমিলার2002

4
যদি আপনার কোডে 100 টিরও বেশি লাইন থাকে তবে এটি jslint পাস করবে না, সত্যই, এটি অসম্ভব।

4
"ব্রোক" খুব শক্ত শব্দ। এটি আপনার কোডের অর্থ পরিবর্তন করেছে। আপনি যদি একটি myVar == nullচেক করছেন , হ্যাঁ, বড় পরিবর্তনগুলি। ;।) ক্রকফোর্ডের যুক্তি হ'ল এটি কোডটির অর্থ আরও সুনির্দিষ্ট করে তুলেছে এবং তর্ক করা শক্ত।
রাফিন

উত্তর:


127

আইএমও, অন্ধভাবে ব্যবহার করে ===, ধরণের রূপান্তর কীভাবে কাজ করে তা বোঝার চেষ্টা না করেই কী বোঝায় না।

ইক্যুয়াল অপারেটর সম্পর্কে প্রাথমিক ভয়== হ'ল তুলনার বিধিগুলি তুলনার ধরণের উপর নির্ভর করে অপারেটরটিকে অ-ট্রানজিটিভ করতে পারে, উদাহরণস্বরূপ, যদি:

A == B AND
B == C

সত্যিই গ্যারান্টি দেয় না:

A == C

উদাহরণ স্বরূপ:

'0' == 0;   // true
 0  == '';  // true
'0' == '';  // false

===আপনি যদি একই ধরণের মানগুলির তুলনা করেন তবে সর্বাধিক সাধারণ উদাহরণস্বরূপ স্ট্রাইক্ট ইকুয়ালস অপারেটরটি সত্যই প্রয়োজন হয় না:

if (typeof foo == "function") {
  //..
}

আমরা typeofঅপারেটরের ফলাফলকে তুলনা করি , যা সর্বদা একটি স্ট্রিং থাকে একটি স্ট্রিং আক্ষরিক সাথে ...

বা যখন আপনি জাভাস্ক্রিপ্টের এই মাতব্বরী নিয়ম জানেন, উদাহরণস্বরূপ, চেক যদি কিছু nullবা undefinedকিছু:

if (foo == null) {
  // foo is null or undefined
}

// Vs. the following non-sense version:

if (foo === null || typeof foo === "undefined") {
  // foo is null or undefined
}

4
আমি জেএসলিন্টের এই নিয়মকে ঘৃণা করি। আমার মনে হয় আসল সমস্যাটি হ'ল লোকেরা অপারেটরদের যেভাবে বোঝে না সেভাবে ব্যবহার করা উচিত নয় (হাস্যকরভাবে এগুলি প্রায়শই একই ধরণের লোক যারা অন্ধভাবে '===' '==' দিয়ে প্রতিস্থাপন করবে)। অবশ্যই, 0 টি বিভিন্ন স্ট্রিংয়ের সাথে সংখ্যার তুলনা করার সময় কয়েকটি সাধারণ ঘটনা দেখা দেয় তবে আপনি যদি 0 == 'এটি একটি স্ট্রিং' এর মতো সম্পর্কিত সম্পর্কযুক্ত ডেটা তুলনা করেন - আপনার কোডটিতে সম্ভবত দ্বিগুণ সমানর চেয়ে বড় সমস্যা রয়েছে! আপনি যদি জানেন যে আপনি কী ধরণের সাথে व्यवहार করছেন এবং তারা ঠিক কীভাবে == এর সাথে কীভাবে ইন্টারঅ্যাক্ট করে তা আপনি জানেন তবে আমার মনে হয় আপনার এটি ব্যবহার করা উচিত।
জন

4
@ জন ===অপারেটরের পয়েন্টটি হল কোড স্পষ্টতা। ==এটি ব্যবহারের কোনও যুক্তিসঙ্গত পরিস্থিতি নেই কারণ এটি পরিচয় অপারেটরের মতো কখনও পরিষ্কার এবং বোধগম্য হবে না। আপনি অপারেটরদের বোঝেন বা না এটি সম্পর্কে নয়, এটি এমন কোনও ব্যবহারের বিষয়ে যা আপনার কোডটি প্রায় কোনও ব্যয় ছাড়াই আরও সহজেই পঠনযোগ্য করে তোলে। পরিচয় অপারেটরের বিরুদ্ধে বিতর্ক করা একমাত্র বিকাশকারী হলেন একক বিকাশকারী এবং দলে কাজ করেন না এমন লোক। সংজ্ঞা অনুসারে, যাদের কোড তাদের যথেষ্ট চোখ দ্বারা পর্যালোচনা করা হয় না।
অল্টারনেটেক্স

4
আমি প্রায় অপরিহার্য হতে == নাল তুলনা দেখতে পাই। আপনার কোডটি ভালভাবে পরীক্ষা করা থাকলে বিষয়টি আরও কম গুরুত্বপূর্ণ হয়ে ওঠে।
জন

4
প্রয়োজনীয় সময়গুলি পরীক্ষা করার জন্য এমন সময়গুলি থাকে যখন == ব্যবহার করা আবশ্যক। যদি foo.toString () অনুমানযোগ্য ফ্যাশনে সঞ্চালন করে এবং সেই আউটপুটটির বিরুদ্ধে একটি সরল স্ট্রিং পরীক্ষা করা দরকার তবে foo == স্ট্রিংটোস্টে লেখা foo.toString () === স্ট্রিংটোস্টেস্টের চেয়ে অনেক বেশি পরিষ্কার is
ক্রিসপেন স্মিথ

4
@ অলটারনেটেক্স যদি বিষয়টি পরিষ্কার হয় তবে তাদের এটিকে ট্রিপল সমান করা উচিত হয়নি! কোনও শিক্ষানবিস এটি বুঝতে পারে না। কমপক্ষে দ্বিগুণ সমান অন্যান্য ভাষা থেকে জানা যায়। এছাড়াও, there is no reasonable situationএকটি স্থূল বিভ্রান্তি। (নেটিভ) জাভাস্ক্রিপ্টের ধরণগুলি Numberএবং সম্পর্কে চিন্তা করুন String। তাদের অস্তিত্ব প্রমাণ করে যে জাভাস্ক্রিপ্ট লেখকদের মনে কিছু ব্যবহারের কেস ছিল ==। আপনি কি সত্যিই মনে করেন যে new String('hi') === 'hi'মূল্যায়ন falseখুব পরিষ্কার? দয়া করে একটি কোড স্নিপেট লিখুন 'hi'যা স্ট্রিং এবং স্ট্রিং উভয়ই গ্রহণ করার বিরুদ্ধে আপনার ফাংশন যুক্তির পরীক্ষা করে এবং আমাকে তা পরিষ্কার বলে tell
স্টিজন ডি উইট

25

জাভাস্ক্রিপ্ট সিনট্যাক্সের জন্য জেএসলিন্ট সহজাতভাবে আরও প্রতিরক্ষামূলক।

জেএসলিন্ট ডকুমেন্টেশন থেকে:

==এবং !=অপারেটরদের তুলনা আগে জাভাস্ক্রিপ্টের এই মাতব্বরী না। এটি খারাপ কারণ এটি ' \t\r\n' == 0সত্য হওয়ার কারণ । এটি টাইপ ত্রুটিগুলি মাস্ক করতে পারে।

যখন নিম্নলিখিত মান কোন তুলনা, ব্যবহার ===বা !==অপারেটার (যা জাভাস্ক্রিপ্টের এই মাতব্বরী না):0 '' undefined null false true

যদি আপনি কেবল যত্ন নেন যে কোনও মান সত্যবাদী বা মিথ্যা , তবে সংক্ষিপ্ত রূপটি ব্যবহার করুন। পরিবর্তে

(foo != 0)

শুধু বল

(foo)

এবং পরিবর্তে

(foo == 0)

বলুন

(!foo)

দ্য ===এবং !==অপারেটরদের পছন্দ করা হয়।


8
আমি জেএসলিন্টের লোকদের কিছু খুব উঁচু আইভরি টাওয়ারে কাজ শেষ করে যা তারা কখনই বের হয় না out জাভাস্ক্রিপ্ট অপারেটরের সাথে ব্যবহার করার জন্য ডিজাইন করা হয়েছিল =====একটি বিশেষ ক্ষেত্রে দেখা যায় ... JSLint এটি ব্যবহার ভালো বলে মনে হচ্ছে গড়ে তোলার চেষ্টা করে ==একরকম ভুল হবে ... যাইহোক, এই চেষ্টা করে দেখুন: var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}। আদিম ধরণের প্রাসঙ্গিক শ্রেণি রয়েছে যা তাদের ( Number, String) এবং জাভাস্ক্রিপ্টের পরিবর্তে ==অপারেটরের উপর নির্ভর করে এই প্রাকৃতিকটির তুলনা করতে।
স্টিজন ডি উইট

17

মনে রাখবেন যে জেএসলিন্ট জাভাস্ক্রিপ্ট কী হওয়া উচিত তা সম্পর্কে একজন ব্যক্তির ধারণা প্রয়োগ করে। প্রস্তাবিত পরিবর্তনগুলি কার্যকর করার সময় আপনার এখনও সাধারণ জ্ঞান ব্যবহার করতে হবে।

সাধারণভাবে, ধরণ এবং মানের তুলনা করা আপনার কোডকে আরও সুরক্ষিত করে তুলবে (টাইপ রূপান্তর যখন আপনি যা ভাবেন তা করেন না এমন সময়ে আপনি অপ্রত্যাশিত আচরণে চলে যাবেন না)।


4
প্লাস এটি প্রোগ্রামার হিসাবে প্রসঙ্গে স্মার্ট হতে পারে না। এটি কেবলমাত্র সেই ভিত্তিতে কাজ করছে যে বেশিরভাগ ব্যবহারকারী সিস্টেমে সহজাত স্বয়ংক্রিয় ধরণের রূপান্তর দ্বারা
বিভক্ত

14

ট্রিপল-ইক্যুয়াল দ্বিগুণ-সমান থেকে পৃথক কারণ উভয় পক্ষের সমান মান আছে কিনা তা পরীক্ষা করার পাশাপাশি ট্রিপল-সমানও একই পরীক্ষা করে যে তারা একই ডেটা টাইপ।

তাই ("4" == 4)সত্য, যেখানে ("4" === 4)মিথ্যা।

ট্রিপল-ইক্যুয়ল কিছুটা দ্রুতও চলে, কারণ জাভাস্ক্রিপ্ট আপনাকে উত্তর দেওয়ার আগে কোনও ধরণের রূপান্তর করতে সময় নষ্ট করতে হবে না।

অস্পষ্ট বাগগুলি হ্রাস করার লক্ষ্যে জেএসলিন্ট ইচ্ছাকৃতভাবে আপনার জাভাস্ক্রিপ্ট কোডটিকে যথাসম্ভব কঠোর করে তোলার লক্ষ্য। এটি আপনাকে কোডে আনার চেষ্টা করার জন্য এই ধরণের জিনিসটিকে হাইলাইট করে যা আপনাকে ডেটা ধরণের সম্মান করতে বাধ্য করে।

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

আপনি জেএসলিন্টকে এমন কিছু সতর্কতা দিয়ে বোমা বর্ষণ করতে চান না যদি আপনি চেকের বিভাগগুলিকে উপেক্ষা করতে বলতে পারেন যে আপনি কিছু করতে যাচ্ছেন না।


4
আমি "কি ===" জিজ্ঞাসা করিনি, সুতরাং আপনি কেন জবাব দিয়েছিলেন তা আমি নিশ্চিত নই।
মহানগর

8
@ মেট্রোপলিস: যদি অন্য কোনও কারণে না হয়, তবে ব্যাকগ্রাউন্ড হিসাবে যদি কেউ উত্তর জানে না যারা জানেন না। যদিও এর পরে অনুচ্ছেদে আপনার প্রশ্নের উত্তর দেওয়ার চেষ্টা করেছি।
স্পডলি

অতিরিক্ত এবং দরকারী তথ্যের জন্য @ স্পডলি +1
বেন জুনিয়র

4
হ্যাঁ, এটি 10-100 গুণ বেশি দ্রুত: jsperf গতি পরীক্ষা
ভ্লাদক্রাস

8

Http://javascript.crockford.com/code.html এর একটি উদ্ধৃতি :

=== এবং! == অপারেটর।

অপারেটরগুলি === এবং ব্যবহার করা প্রায় সর্বদা ভাল always == এবং! = অপারেটররা জোর করে টাইপ করে। বিশেষত, মিথ্যা মানগুলির সাথে তুলনা করতে == ব্যবহার করবেন না।

জেএসলিন্ট খুব কঠোর, তাদের 'ওয়েবজলিন্ট.জেএস' এমনকি তাদের নিজস্ব বৈধতা পাস করে না।


সুন্দর ব্যাখ্যা। সত্য, webjslint.jsবৈধতা না দেওয়ার বিষয়ে - যদিও আমি এখন দেখা বেশিরভাগ ত্রুটিগুলি ফাঁক ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে ফাঁকে করা উচিত। স্পষ্টতই, JSLint ব্যবহার করে জাভাস্ক্রিপ্ট পর্যালোচনা করার সময় একজনকে অবশ্যই সাধারণ জ্ঞান এবং যুক্তিসঙ্গত রায় ব্যবহার করতে হবে।
হটশট 309

শব্দটির ব্যবহার alwaysস্বয়ংক্রিয়ভাবে এই উদ্ধৃতিটিকে জ্ঞান হিসাবে অযোগ্য করে তোলে। স্মার্ট প্রোগ্রামাররা ধর্মান্ধ নয়। তারা প্রদত্ত পরিস্থিতিতে সর্বোত্তম যা ব্যবহার করে। এবং তারা ভাষার একেবারে মূল অংশে তৈরি যে কোনও সরঞ্জামকে স্বাগত জানায় এবং আলিঙ্গন করে, এটিকে কেবল একটি দিয়ে বরখাস্ত করে না just never touch it। নীচের লাইন: আমার কোডটি সংক্ষিপ্ত (এবং কেবল একটি =অক্ষর সংরক্ষণ করে নয়), সুতরাং আমার সাইটটি কম ব্যান্ডউইথ খরচে দ্রুত লোড হয়, এইভাবে আমার ব্যবহারকারীর আরও ভাল পরিবেশিত হয়।
স্টিজন ডি উইট

4

আপনি মিথ্যা জন্য পরীক্ষা করতে চান। জেএসলিন্ট অনুমতি দেয় না

if (foo == null)

কিন্তু অনুমতি দেয় না

if (!foo)

ব্যবহার করুন ===, যা জেএসলিন্ট সুপারিশ করে।
clickbait

4
@ নারাওয়াগেমস এই সমাধানটি পুরোপুরি গ্রহণযোগ্য।

এই উত্তর ভাল না। বিষয়টি এই যে উভয়ই অন্য কিছু বোঝায়। foo == nullনাল বা অপরিশোধিত জন্য চেক। !fooনাল, অপরিজ্ঞাত, 0 এবং খালি স্ট্রিংয়ের জন্য চেক।
মার্কোস

@ মারকোস এই উত্তরটি জেএসলিন্টকে খুশি করার জন্য এবং আপনার কোডের যুক্তিকে অক্ষত রাখতে একটি সহায়ক বিকল্প হিসাবে বোঝানো হয়েছে, কোনও সঠিক সমতুল্য না হয়ে। এই কারণেই আমি উত্তরটি "মিথ্যাচারের জন্য যদি পরীক্ষা করে দেখি" সহ
উপসর্গ করেছিলাম

3

এই প্রশ্নটি ব্যাখ্যা করতে এবং এটি ব্যাখ্যা করার জন্যও যে নেটবিনস (from.৩) থেকে কেন এই সতর্কতাটি দেখাতে শুরু করেছে নেটবিন্স বাগ ট্র্যাকারের প্রতিক্রিয়া থেকে যখন এটি কেউ বাগ হিসাবে প্রকাশিত হয় তখন এটি একটি নিষ্কাশন:

জাভাস্ক্রিপ্টে == এর চেয়ে === ব্যবহার করা ভাল অনুশীলন।

তুলনা করার আগে অপারেটররা == এবং! = টাইপ করুন এটি খারাপ কারণ এটি '\ t \ r \ n' == 0 টি সত্য হতে দেয়। এটি টাইপ ত্রুটিগুলি মাস্ক করতে পারে। জেএসলিন্ট নির্ভরযোগ্যভাবে নির্ধারণ করতে পারে না যে == সঠিকভাবে ব্যবহৃত হচ্ছে, তাই == এবং! = ব্যবহার না করা এবং সর্বদা আরও নির্ভরযোগ্য === এবং! == অপারেটর ব্যবহার করা ভাল।

রেফারেন্স


4
আমি এখনই নেটবিনগুলি ব্যবহার করে এই ত্রুটিটি পেয়েছি। আশ্চর্যের বিষয় যে তারা তাদের দেওয়া উদ্ভট উদাহরণের কারণে সতর্কতার তীব্রতার সাথে এটিকে আচরণ করবে।
omikes

4
আমি বোঝাতে চাইছি, এটি সত্য, তবে ব্যবহারের অনেকগুলি ক্ষেত্রেই ব্যক্তি জানেন যে দুটি তুলনা করা জিনিস একই রকম হবে, তাই এটি আশ্চর্যজনক বলে মনে হয় যে এই অদ্ভুত মামলার কারণে যেখানে কোনও গাড়ি ফেরার সংখ্যার সাথে তুলনা করা যেতে পারে == এর সমস্ত ব্যবহারকে ভুল হিসাবে বিবেচনা করার কারণ শূন্য। কোনও ধরণের রূপান্তর সম্পন্ন না হওয়ায় আমি === যদিও দ্রুততর তা খুঁজে পাচ্ছি। আমি অবাক হয়েছি নেটবিনের আগে আমি এটি খুঁজে পেলাম না।
omikes

@ ওমিকেই হ্যাঁ আমি কী বলতে চাইছি তা তারা দেখতে পাচ্ছে, তারা আরও বাস্তব উদাহরণ দিতে পারে!
ইএম-ক্রিয়েশনস

2

ঠিক আছে এটি আসলে সমস্যা সৃষ্টি করতে পারে না, এটি আপনাকে কেবল পরামর্শ দিচ্ছে। এটি গ্রহন করুন অথবা ত্যাগ করুন। এটি বলেছিল, আমি নিশ্চিত না যে এটি কত চালাক। এমন প্রসঙ্গগুলি থাকতে পারে যেখানে এটি এটিকে সমস্যা হিসাবে উপস্থাপন করে না।


4
তবে "প্রত্যাশিত" শব্দটি কেন ব্যবহার করা হয়েছে? এটি আপনার কাছে সর্বদা এটি করা উচিত বলে মনে হয়।
মহানগর

4
মূল্যায়নকারী বৈধ প্রতিক্রিয়া খুঁজছেন, কারণ এটি এটিকে বৈধ করার চেষ্টা করছে। যদি এটি কোনও বৈধ প্রতিক্রিয়া না পায়, তবে এটি যা প্রত্যাশা করেছিল তা নয়। যাচাইকারী এই ধারণাটি দিয়ে শুরু করে যে সবকিছু ঠিক আছে এবং তারপরে কোডটি ট্র্যাভার করার সাথে সাথে ত্রুটিগুলি নির্দেশ করে। এটি অকার্যকর প্রতিক্রিয়া কী তা অগত্যা বুঝতে পারে না, এটি যখন অযৌক্তিক প্রতিক্রিয়া দেখায় তখনই তা জানে। এটি বিপরীতে কাজ করতে পারে, ইচ্ছাকৃতভাবে খারাপগুলির নিয়ম অনুসারে খারাপ কোড সন্ধান করতে পারে। হোয়াইটলিস্টিং বনাম কালো তালিকাভুক্তকরণ।
রাশিও

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