javascript - webcoachbd - জাভাস্ক্রিপ্ট লুপ




যা অপারেটর সমান(== বনাম===) জাভাস্ক্রিপ্ট তুলনা মধ্যে ব্যবহার করা উচিত? (20)

আপনার ব্যবহারের দুটি ক্রিয়াকলাপের মধ্যে কোন পারফরম্যান্স পার্থক্য হওয়ার সম্ভাবনা নেই। কোন ধরনের রূপান্তর করা হবে না কারণ উভয় পরামিতি ইতিমধ্যে একই ধরণের। উভয় অপারেশন একটি মান তুলনা অনুসরণ করে একটি টাইপ তুলনা হবে।

আমি জাভাস্ক্রিপ্টের মাধ্যমে যেতে JSLint ব্যবহার করছি, এবং idSele_UNVEHtype.value.length == 0 সাথে তুলনা করার মতো জিনিসগুলি করার সময় এটি === (দুটি সমান লক্ষণ) দিয়ে == (দুটি সমান লক্ষণ) প্রতিস্থাপন করার জন্য অনেকগুলি প্রস্তাব প্রত্যাবর্তন করছে। বিবৃতি।

== দিয়ে === প্রতিস্থাপন করার জন্য একটি কর্মক্ষমতা সুবিধা আছে?

অনেক তুলনা অপারেটর বিদ্যমান হিসাবে কোন কর্মক্ষমতা উন্নতি স্বাগত জানানো হবে।

যদি কোন ধরনের রূপান্তর ঘটে না, তাহলে == উপর একটি কর্মক্ষমতা লাভ হবে?


আমাকে এই পরামর্শ যোগ করা যাক:

সন্দেহ থাকলে, specification !

ECMA-262 একটি স্ক্রিপ্টিং ভাষার জন্য স্পেসিফিকেশন যা জাভাস্ক্রিপ্টটি একটি উপভাষা। অবশ্যই অনুশীলনে এটি কীভাবে গুরুত্বপূর্ণ হয় যে কীভাবে সবচেয়ে গুরুত্বপূর্ণ ব্রাউজারগুলি কীভাবে পরিচালিত হওয়া উচিত তার একটি গোপনীয় সংজ্ঞা ব্যতীত আচরণ করে। কিন্তু নতুন স্ট্রিং ("a") কেন! == "a" কেন তা বুঝতে সহায়ক।

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

=== এর জন্য পিডিএফ ফাইল অনুসন্ধান করা হচ্ছে আমাকে স্পেসিফিকেশন পৃষ্ঠা 56 এ নিয়ে আসে: 11.9.4। কঠোর সমান অপারেটর (===) , এবং নির্দিষ্টকরণের মাধ্যমে wading পরে আমি খুঁজে পেতে:

11.9.6 কঠোর সমতা তুলনা অ্যালগরিদম
তুলনা x === y, যেখানে x এবং y মানগুলি, সত্য বা মিথ্যা উত্পন্ন করে। যেমন একটি তুলনা অনুসরণ করা হয়:
1. যদি প্রকার (x) টাইপ (y) থেকে আলাদা হয়, মিথ্যা ফেরত দিন।
2. যদি টাইপ (এক্স) অনির্ধারিত হয়, সত্য ফিরে।
3. টাইপ (এক্স) নাল হয়, সত্য ফিরে।
4. যদি টাইপ (এক্স) সংখ্যা না হয় তবে ধাপ 11 এ যান।
5. যদি এক্স NaN হয় , মিথ্যা ফেরত।
6. যদি YN NaN হয় , মিথ্যা ফেরত।
7. যদি x হল y হিসাবে একই নম্বর মান, সত্য ফিরে।
8. যদি x +0 এবং y হয় -0, সত্য ফেরত।
9. যদি x -0 এবং y হয় + 0, সত্য ফিরে।
10. মিথ্যা ফিরে।
11. যদি টাইপ (x) স্ট্রিং হয় তবে x এবং y অক্ষরগুলির একই ক্রমিক (একই দৈর্ঘ্য এবং একই অক্ষরগুলিতে একই অক্ষর) হলে সত্য ফিরে আসবে; অন্যথায়, মিথ্যা ফিরে।
12. যদি টাইপ (এক্স) হল বুলিয়ান, তাহলে সত্য এবং সত্য উভয় মিথ্যা এবং উভয় মিথ্যা হলে সত্য ফিরে আসবে; অন্যথায়, মিথ্যা ফিরে।
13. যদি x এবং y একই বস্তুর সাথে সম্পর্কিত হয় অথবা যদি তারা একে অপরের সাথে যুক্ত বস্তুগুলি বোঝায় তবে সত্য ফিরে আসুন (13.1.2 দেখুন)। অন্যথায়, মিথ্যা ফেরত।

আকর্ষণীয় 11 ধাপ। হ্যাঁ, স্ট্রিং মান ধরনের হিসাবে গণ্য করা হয়। কিন্তু এই নতুন স্ট্রিং ("একটি") কেন! == "একটি" ব্যাখ্যা করে না। আমাদের কি একটি ব্রাউজার আছে যা ECMA-262 এর সাথে সামঞ্জস্যপূর্ণ নয়?

এত দ্রুত না!

এর অপারেশন ধরনের চেক করা যাক। Typeof () এ মোড়ানো দ্বারা নিজের জন্য এটি চেষ্টা করুন। আমি দেখি যে নতুন স্ট্রিং ("a") একটি বস্তু, এবং ধাপ 1 ব্যবহার করা হয়: যদি ধরন ভিন্ন হয় তবে মিথ্যাটি ফেরত দিন।

আপনি যদি নতুন স্ট্রিং ("একটি") কোন স্ট্রিং না ফেরত দিচ্ছেন, তাহলে কিছু ব্যায়াম কীভাবে স্পেসিফিকেশন পড়ছে? আনন্দ কর!

এইডিয়াকপি নীচের একটি মন্তব্যে লিখেছেন:

স্পেসিফিকেশন থেকে

11.2.2 নতুন অপারেটর :

যদি টাইপ (কন্সট্রাকটর) বস্তু না হয় তবে টাইপ ইরেকর ব্যতিক্রমটি নিক্ষেপ করুন।

অন্য কথায়, স্ট্রিং টাইপ অবজেক্টের না থাকলে এটি নতুন অপারেটরের সাথে ব্যবহার করা যাবে না।

নতুন সবসময় স্ট্রিং কনস্ট্রাক্টরদের জন্য এমনকি একটি বস্তু প্রদান করে। আর হায়! স্ট্রিংগুলির জন্য মান শব্দার্থক (পদক্ষেপ 11 দেখুন) হারিয়ে গেছে।

এবং এই পরিশেষে মানে: নতুন স্ট্রিং ("একটি")! == "একটি"


একটি সাধারণ স্ক্রিপ্ট মধ্যে কোন কর্মক্ষমতা পার্থক্য থাকবে। আরো গুরুত্বপূর্ণ হতে পারে যে হাজার "===" হাজারের চেয়ে 1 কেবি ভারী "==" :) আপনার ক্ষেত্রে পারফরম্যান্সের পার্থক্য থাকলে জাভাস্ক্রিপ্ট প্রোফাইলার আপনাকে বলতে পারে।

কিন্তু ব্যক্তিগতভাবে আমি JSLint প্রস্তাব কি করবে। এই সুপারিশটি কর্মক্ষমতা সমস্যাগুলির কারণে নেই, তবে টাইপ জোরপূর্বক মানে ('\t\r\n' == 0) সত্য।


এখানে উত্তরগুলিতে, আমি সমান উপায় সম্পর্কে কিছু পড়িনি। কেউ কেউ বলবেন যে === মানে সমান এবং একই রকম , তবে এটি সত্য নয়। এটি আসলেই বোঝায় যে উভয় অপারেড একই বস্তুর রেফারেন্স করে , অথবা মান প্রকারের ক্ষেত্রে একই মান থাকে

সুতরাং, আসুন নিম্নলিখিত কোডটি গ্রহণ করি:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

এখানেও একই:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

অথবা এমনকি:

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

এই আচরণ সবসময় সুস্পষ্ট নয়। সমান হচ্ছে এবং একই ধরনের হচ্ছে চেয়ে গল্প আরো আছে।

নিয়ম হল:

মান প্রকারের জন্য (সংখ্যা):
a === b সত্যকে ফেরত দেয় যদি a এবং b একই মান থাকে এবং একই রকম থাকে

রেফারেন্স ধরনের জন্য:
a === b যদি true এবং একই b ঠিক একই বস্তুর উল্লেখ করে তবে সত্য ফিরে আসে

স্ট্রিং জন্য:
a === b যদি সত্য হয় তবে a এবং b উভয় স্ট্রিং থাকে এবং একই অক্ষর থাকে

স্ট্রিং: বিশেষ ক্ষেত্রে ...

স্ট্রিংগুলি মানের ধরন নয়, তবে জাভাস্ক্রিপ্টে তারা মানের মতো আচরণ করে, সুতরাং তারা একই সমান হবে যখন তারা একই সমান (যখন তৃতীয় নিয়মটিতে ব্যাখ্যা করা হয়েছে)

এখন এটি আকর্ষণীয় হয়ে উঠছে:

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

কিন্তু কিভাবে এই সম্পর্কে ?:

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

আমি স্ট্রিং মান ধরনের মত আচরণ ভাবি? আচ্ছা, এটি নির্ভর করে আপনি কে জিজ্ঞাসা করেন ... এই ক্ষেত্রে A এবং B একই রকম নয়। a টাইপ Object , যখন b টাইপ stringString কন্সট্রাকটর ব্যবহার করে একটি স্ট্রিং অবজেক্ট তৈরি করার কথা মনে রাখবেন টাইপ Object এমন কিছু তৈরি করে যা বেশিরভাগ সময়ে স্ট্রিং হিসাবে আচরণ করে।


এটি একই প্রকারের সমান এবং মান সমান কিনা তা পরীক্ষা করে।

উদাহরণ:

'1' === 1 // will return "false" because `string` is not a `number`

সাধারণ উদাহরণ:

0 == ''  // will be "true", but it's very common to want this check to be "false"

আরেকটি সাধারণ উদাহরণ:

null == undefined // returns "true", but in most cases a distinction is necessary

কঠোর সমতা / তুলনা করার জন্য জাভাস্ক্রিপ্ট নির্বাহ প্রবাহ চিত্রটি '==='

অ কঠোর সমতা / তুলনা জন্য জাভাস্ক্রিপ্ট নির্বাহ প্রবাহ চিত্র '=='


জাভাস্ক্রিপ্টে এটি একই মান এবং টাইপ মানে।

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

4 == "4" // will return true

কিন্তু

4 === "4" // will return false 

পিএইচপি এবং জাভাস্ক্রিপ্টে, এটি একটি কঠোর সমতা অপারেটর। যার মানে, এটি উভয় ধরনের এবং মান তুলনা করবে।


সমতা তুলনা:

অপারেটর ==

উভয় অপারেটিং সমান যখন সত্য ফিরে ,. অপারেটিং তুলনায় একই ধরনের রূপান্তর করা হয়।

>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true

সমতা এবং টাইপ তুলনা:

অপারেটর ===

উভয় অপারেড সমান এবং একই ধরনের যদি উভয় সত্য ফেরত। যদি আপনি এই উপায়ে তুলনা করেন তবে এটি সাধারণত আরও ভাল এবং নিরাপদ, কারণ কোনও পূর্বদৃশ্য ধরন রূপান্তর নেই।

>>> 1 === '1'
false
>>> 1 === 1
true

== অপারেটর ( সমতা ) ব্যবহার করে

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

=== অপারেটর ( পরিচয় ) ব্যবহার করে

true === 1; //false
"2" === 2;  //false

এর কারণ হল সমতা অপারেটর == জোর করে টাইপ করে , অর্থাত্ দোভাষক তুলনা করার আগে মূল্যগুলি রূপান্তরিত করার চেষ্টা করে।

অন্যদিকে, পরিচয় অপারেটর === টাইপ === করে না , এবং এর সাথে তুলনা করার সময় মানগুলি রূপান্তর করে না।


=== অপারেটর সমানতার জন্য ভেরিয়েবলের মানগুলির পাশাপাশি মান পরীক্ষা করে।

== অপারেটর শুধু সমতা জন্য ভেরিয়েবল মান চেক।


সমান তুলনা অপারেটর == বিভ্রান্তিকর এবং এড়ানো উচিত।

যদি আপনি এটির সাথে বাস করতে চান তবে নিম্নলিখিত 3 টি বিষয় মনে রাখবেন:

  1. এটি সংক্রামক নয়: (একটি == বি) এবং (বি == গ) কোনও ( lead == c)
  2. এটি তার নেতিবাচক স্বতন্ত্র একচেটিয়া: (A == b) এবং (a! = B) সর্বদা বুলিয়ান মানগুলি ধরে রাখে, সমস্ত a এবং b।
  3. সন্দেহের ক্ষেত্রে, নিম্নলিখিত সত্য টেবিলে হৃদয় দ্বারা শিখুন:

জাভাস্ক্রিপ্টে একক অপারেটর সত্য টেবিল

  • টেবিলে প্রতিটি সারি 3 পারস্পরিক "সমান" মানগুলির একটি সেট, যার অর্থ হল তাদের মধ্যে যেকোনও 2 সমান সমান == চিহ্ন ব্যবহার করে সমান *

** স্টারঞ্জি: উল্লেখ্য যে প্রথম কলামে যেকোনো দুটি মান একই অর্থে সমান নয়। **

''       == 0 == false   // Any two values among these 3 ones are equal with the == operator
'0'      == 0 == false   // Also a set of 3 equal values, note that only 0 and false are repeated
'\t'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\r'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\n'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\t\r\n' == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

null == undefined  // These two "default" values are not-equal to any of the listed values above
NaN                // NaN is not equal to any thing, even to itself.

কেন == তাই অনির্দেশ্য?

যখন আপনি শূন্য সংখ্যা 0 দিয়ে একটি খালি স্ট্রিং তুলনা করেন তখন আপনি কী পাবেন?

true

হ্যাঁ, এটি ঠিক == একটি খালি স্ট্রিং এবং সংখ্যা শূন্য অনুযায়ী একই সময়।

এবং এটি শেষ হয় না, এখানে অন্য একটি:

'0' == false // true

জিনিস অ্যারের সঙ্গে সত্যিই অদ্ভুত পেতে।

[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true

তারপর স্ট্রিং সঙ্গে weirder

[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!

এটা খুব খারাপ হচ্ছে:

যখন সমান সমান নয়?

let A = ''  // empty string
let B = 0   // zero
let C = '0' // zero string

A == B // true - ok... 
B == C // true - so far so good...
A == C // **FALSE** - Plot twist!

এটা আমাকে আবার বলতে দাও:

(A == B) && (B == C) // true
(A == C) // **FALSE**

এবং এই আপনি primitives সঙ্গে পেতে শুধু পাগল উপাদান।

যখন আপনি বস্তুর সাথে == ব্যবহার করেন তখন এটি একটি সম্পূর্ণ নতুন স্তরের পাগল।

এই সময়ে আপনার সম্ভবত বিস্ময়কর ...

কেন এটা ঘটবে?

ওয়েল এটি কারণ "ট্রিপল সমান" ( === ) এর বিপরীতে যা দুটি মান একই কিনা তা যাচাই করে।

== অন্যান্য স্টাফ একটি সম্পূর্ণ গুচ্ছ আছে

এটি ফাংশন জন্য বিশেষ পরিচালনা, nulls জন্য বিশেষ হ্যান্ডলিং, অনির্ধারিত, স্ট্রিং, আপনি এটি নাম।

এটা বেশ বেদনাদায়ক পেতে।

আসলে, যদি আপনি এমন একটি ফাংশন লিখতে চেষ্টা করেন যা == এরকম কিছু দেখায় তবে এটি == মতো দেখাবে:

function isEqual(x, y) { // if `==` were a function
    if(typeof y === typeof x) return y === x;
    // treat null and undefined the same
    var xIsNothing = (y === undefined) || (y === null);
    var yIsNothing = (x === undefined) || (x === null);

    if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing);

    if(typeof y === "function" || typeof x === "function") {
        // if either value is a string 
        // convert the function into a string and compare
        if(typeof x === "string") {
            return x === y.toString();
        } else if(typeof y === "string") {
            return x.toString() === y;
        } 
        return false;
    }

    if(typeof x === "object") x = toPrimitive(x);
    if(typeof y === "object") y = toPrimitive(y);
    if(typeof y === typeof x) return y === x;

    // convert x and y into numbers if they are not already use the "+" trick
    if(typeof x !== "number") x = +x;
    if(typeof y !== "number") y = +y;
    // actually the real `==` is even more complicated than this, especially in ES6
    return x === y;
}

function toPrimitive(obj) {
    var value = obj.valueOf();
    if(obj !== value) return value;
    return obj.toString();
}

তাহলে এর অর্থ কি?

এটা মানে == জটিল।

এটি জটিল কারণ এটি যখন আপনি এটি ব্যবহার করবেন তখন কী ঘটবে তা জানা কঠিন।

যা আপনি বাগ সঙ্গে শেষ হতে পারে মানে।

তাই গল্পের নৈতিক ...

আপনার জীবন কম জটিল করুন।

=== পরিবর্তে === ব্যবহার করুন।

শেষ।


হ্যাঁ! এটা ব্যাপার না।

===জাভাস্ক্রিপ্টে অপারেটর চেক মান এবং সেইসাথে টাইপ যেখানে ==অপারেটর ঠিক মান যাচাই করে (প্রয়োজন হলে টাইপ রূপান্তর করে)

আপনি সহজে এটি পরীক্ষা করতে পারেন। একটি HTML ফাইলে কোডটি পেস্ট করুন এবং ব্রাউজারে এটি খুলুন

<script>

function onPageLoad()
{
    var x = "5";
    var y = 5;
    alert(x === 5);
};

</script>

</head>

<body onload='onPageLoad();'>

আপনি সতর্কতায় ' মিথ্যা ' পাবেন । এখন সংশোধন onPageLoad()করার পদ্ধতি alert(x == 5);আপনি পাবেন সত্য


এটি একটি কঠোর চেক পরীক্ষা।

এটি একটি ভাল জিনিস বিশেষ করে যদি আপনি 0 এবং মিথ্যা এবং নিল মধ্যে চেক করছেন।

উদাহরণস্বরূপ, যদি আপনার থাকে:

$a = 0;

তারপর:

$a==0; 
$a==NULL;
$a==false;

সমস্ত সত্য ফিরে এবং আপনি এই চান না হতে পারে। ধরুন আপনার একটি ফাংশন রয়েছে যা অ্যারের 0 র্থ সূচী ফিরিয়ে আনতে পারে বা ব্যর্থতার ক্ষেত্রে মিথ্যা। আপনি যদি "==" মিথ্যা দিয়ে পরীক্ষা করেন তবে আপনি বিভ্রান্তিকর ফলাফল পেতে পারেন।

তাই উপরে হিসাবে একই জিনিস সঙ্গে, কিন্তু কঠোর পরীক্ষা:

$a = 0;

$a===0; // returns true
$a===NULL; // returns false
$a===false; // returns false

কেবল

==এর সাথে অপারেড মধ্যে তুলনা মানে type conversion

&

===মানে তুলনা operands মধ্যে ছাড়া type conversion

জাভাস্ক্রিপ্টে রূপান্তর টাইপ করুন মানে জাভাস্ক্রিপ্ট স্বয়ংক্রিয়ভাবে স্ট্রিং ডেটা প্রকারে অন্য কোনও ডাটা টাইপ রূপান্তর করে।

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

123=='123'   //will return true, because JS convert integer 123 to string '123'
             //as we used '==' operator 

123==='123' //will return false, because JS do not convert integer 123 to string 
            //'123' as we used '===' operator 

সমস্যাটি হল যে জাভাস্ক্রিপ্টটির বেশিরভাগ ইনফেকশান রূপান্তরিত হওয়ার কারণে আপনি সহজেই সমস্যার সম্মুখীন হতে পারেন ...

var x = 0;
var isTrue = x == null;
var isFalse = x === null;

যা চমত্কার শীঘ্রই একটি সমস্যা হয়ে। নিখরচায় রূপান্তরটি "মন্দ" কেনার সেরা নমুনাটি MFC / সি ++ এ এই কোড থেকে নেওয়া যেতে পারে যা প্রকৃতপক্ষে CString থেকে HANDLE এ একটি নিরপেক্ষ রূপান্তরের কারণে কম্পাইল করবে যা একটি পয়েন্টার টাইপডফ টাইপ ...

CString x;
delete x;

যা রানটাইম সময় অবশ্যই খুব অনির্ধারিত জিনিস না ...

গুগল এর বিরুদ্ধে কিছু আর্গুমেন্ট পেতে সি ++ এবং STL নিরপেক্ষ রূপান্তরগুলির জন্য ...


* অপারেটর === বনাম == *

1 == true    =>    true
true == true    =>    true
1 === true    =>    false
true === true    =>    true

থাম্ব একটি নিয়ম হিসাবে, আমি সাধারণত ===পরিবর্তে ==(এবং !==পরিবর্তে !=) ব্যবহার করা হবে ।

কারণগুলি উপরে উত্তরগুলিতে ব্যাখ্যা করা হয়েছে এবং ডগলাস ক্রকফোর্ড এটি সম্পর্কে বেশ স্পষ্ট ( জাভাস্ক্রিপ্ট: দ্য গুড পার্টস )।

তবে একটি একক ব্যতিক্রম আছে : == null'নিল বা অনির্ধারিত' চেক করার জন্য কার্যকর উপায়:

if( value == null ){
    // value is either null or undefined
}

উদাহরণস্বরূপ jQuery 1.9.1 এই প্যাটার্নটি 43 বার ব্যবহার করে এবং JSHint সিনট্যাক্স পরীক্ষক এমনকি eqnullএই কারণে আরামদায়ক বিকল্প সরবরাহ করে ।

থেকে jQuery এর শৈলী গাইড :

কঠোর সমতা চেক (===) == এর পক্ষে ব্যবহার করা উচিত। নাল উপায় দ্বারা অনির্ধারিত এবং নল জন্য চেক করার সময় শুধুমাত্র ব্যতিক্রম।

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;





identity-operator