آنچه که در این مقاله خواهید خواند:
سوال
من از JSLint برای مرور جاوا اسکریپت استفاده می کنم، و پیشنهادات زیادی را برای جایگزینی ==(دو علامت مساوی) با ===(سه علامت مساوی) در هنگام انجام کار هایی مانند مقایسه idSele_UNVEHtype.value.length == 0 درون یک عبارت if برمی گرداند.
آیا جایگزین کردن == با === مزیت عملکردی دارد؟
با توجه به وجود بسیاری از اپراتور های مقایسه، از هرگونه بهبود عملکرد استقبال می شود.
اگر هیچ تبدیل نوع صورت نگیرد، آیا == افزایش عملکرد دارد؟
پاسخ
عملگر برابری دقیق ( === ) مانند عملگر برابری انتزاعی ( == ) رفتار می کند به جز اینکه هیچ تبدیل نوع انجام نمی شود و انواع باید یکسان باشند تا برابر در نظر گرفته شوند.
اپراتور == پس از انجام هر نوع تبدیل ضروری، برای برابری مقایسه خواهد کرد . اپراتور === تبدیل را انجام نمی دهد، بنابراین اگر دو مقدار یک نوع === نباشند، به سادگی false برمی گرداند. هر دو به یک اندازه سریع هستند.
جاوا اسکریپت دو مجموعه از عملگر های برابری دارد: === و !==، و دو قلو های بدشان == و !=. موارد خوب آنطور که شما انتظار دارید کار می کنند. اگر دو عملوند از یک نوع باشند و مقدار یکسانی داشته باشند، ===تولید true و !== تولید false می کند. دو قلو های شیطانی وقتی عملوند ها از یک نوع هستند کار درست را انجام می دهند، اما اگر از انواع مختلف باشند، سعی می کنند مقادیر را وادار کنند. قوانینی که آنها این کار را انجام می دهند پیچیده و فراموش نشدنی است. اینها چند مورد جالب است:
'' == '0' // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
' \t\r\n ' == 0 // true
فقدان گذرا نگران کننده است. توصیه من این است که هرگز از دو قلو های شیطانی استفاده نکنید. در عوض، همیشه از === و !== استفاده کنید. تمام مقایسه هایی که نشان داده شده است false با اپراتور === تولید می شود.
به روز رسانی
یک نکته خوب توسط @Casebash در نظرات و در پاسخ @Phillipe Laybaert در مورد اشیا مطرح شد. برای اشیا، == و === به طور هماهنگ با یکدیگر عمل کنید (به جز در موارد خاص).
var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // false
a === b // false
c == d // false
c === d // false
e == f // true
e === f // true
مورد خاص زمانی است که شما یک بدوی را با یک شی که با توجه به روش toString یا روش valueOf به همان ابتدایی ارزیابی می شود، مقایسه می کنید. به عنوان مثال، مقایسه یک رشته ابتدایی با یک شی رشته ایجاد شده با استفاده از String سازنده را در نظر بگیرید.
"abc" == new String("abc") // true
"abc" === new String("abc") // false
در اینجا اپراتور == مقادیر دو شی را بررسی می کند و true برمی گرداند، اما === می بیند که آنها یک نوع نیستند و برمی گردند false. کدامیک صحیح می باشد؟ این واقعاً به آنچه می خواهید مقایسه کنید بستگی دارد. توصیه من این است که سوال را به طور کامل دور بزنید و فقط از String سازنده برای ایجاد اشیاء رشته از حروف الفبای رشته استفاده نکنید.
شما می توانید برای یادگیری جاوا اسکریپت از مسیر کارآموزی فرانت اند استفاده کنید.
پاسخها