جستجو در بخش : سوال جواب منابع اسلامی لغت نامه ها قوانین و مصوبات نقل قل ها
×

فرم ورود

ورود با گوگل ورود با گوگل ورود با تلگرام ورود با تلگرام
رمز عبور را فراموش کرده ام عضو نیستم، می خواهم عضو شوم
×

×

آدرس بخش انتخاب شده


جهت کپی کردن میتوانید از دکمه های Ctrl + C استفاده کنید
رویداد ها - امتیازات
در حال بارگذاری
×

رویداد ها - امتیازات

برای بررسی عملکرد فعالیت و امتیازات خود باید در وب سایت وارد باشید. در صورت عضویت از بخش بالای صفحه وارد شوید، در غیر این صورت از دکمه پایین، مستقیم به صفحه ثبت نام وارد شوید.


×
×
با حمایت نقدی خود در افزایش سطح کیفی خدمات لام تا کام سهیم باشید.
×

دلیل درخواست بستن پست

کلیه پست هایی که جنبه تبلیغاتی داشته، محتوای اسپم و بی مفهوم در این دسته قرار میگیرند. همچنین پست هایی که به منظور گرفتن بک لینک درج می شوند شامل این مورد هستند.
حاوی مفاهیم غیر اخلاقی، سیاسی و یا توهین آمیز. کلیه پست هایی که از نظر محتوایی نیاز به بررسی و یا حذف شدن دارند در این دسته قرار می گیرند.
محتوایی با عدم جزئیات کافی و مورد نیاز. کلیه پست هایی که منظور نویسنده به وضوح مشخص نیست و نیازمند توضیحات و جزئیات بیشتر می باشند در این دسته قرار می گیرند.
محتوایی بی ربط با موضوعیت سرفصل کلی. کلیه پست هایی که از منظر مفهوم و مضمون ارتباطی با عنوان اصلی سوال ندارند در این دسته قرار می گیرند.
محتوایی دلخواه و بر پایه سلیقه. کلیه پست هایی که یک پاسخ مشخص ندارند و متوانند چندین پاسخ متفاوت و صحیح داشته باشند که کاملا مبتنی بر نظر شخصی افراد هستند در این دسته قرار می گیرند.
محتوایی در حوزه خیلی وسیع. کلیه پست هایی که از نظر محتوایی در یک حوزه ی وسیعی قرار دارند و مشخصا به یک موضوع خاصی اشاره ندارند که پاسخدهی به آن ها مستلزم تشریح مفاهیمی کلی می باشند در این دسته قرار می گیرند.
قبلا در لام تا کام مطرح شده. پست هایی که دقیقا با همین محتوا و مضمون قبلا در وب سایت لام تا کام درج شده اند، با ذکر آدرس منبع تکراری با پست حال حاضر شامل این دسته هستند. تکراری است با:
به سایر دلایل، نیازمند به بررسی توسط مدیر. به هر دلیل غیری که پست را نیازمند بررسی توسط مدیر کرده، با ذکر دلیل، در این دسته قرار میگیرد.
ارسال رای بستن

تفاوت عملگرهای دو مساوی == و سه مساوی === در جاوااسکریپت چیست؟


1
0
2595

سوال دقیق من این هستش که چه موقع باید از عملگر == استفاده کنم و چه موقع از عملگر ===؟ من از JSLint استفاده می کنم برای کد نویسی جاوااسکریپت. اگه قبلا استفاده کرده باشید میدونید که اون به شدت اصرار داره و پیشنهاد می کنه بجای دو علامت مساوی == بهتره که از سه علامت مساوی === استفاده کنم برای زمانی که می خوام مقایسه انجام بدم. (توی شرط ها طبیعتا)

مثلا اگه این کد رو بنویسی:

if (this.num == 0){ ... }

سریع JSLint میگه که اون دو مساوی رو با سه تاش جایگزین کن. یعنی این چیزیه که پیشنهاد میکنه:

if (this.num === 0){ ... }

خلاصه الان راستش دلیلش رو نمیدونم. آیا مزیت چه میدونم تسریع در عملکرد داره استفاده از عملگر سه تا مساوی === در مقایسه؟ یا مثلا از نظر امنیتی بهتره؟ دلیلش چیه که این همه تاکیید میشه؟

علمی برنامه-نویسی جاوا-اسکریپت کامپیوتر
سوال شده در سروش قادری نسب
756 امتیاز

500 کاراکتر باقی مانده

1 جواب

7

تفاوت عملگرها

برای عملیات x === y یا Strict Equality Comparison جاوااسکریپت از الگوریتم زیر استفاده میکند: (الگوریتم ساده شده)

  1. اگر نوع داده ها یکسان نباشد -> false
  2. اگر نوع داده ها primitive باشد برابر بودن مقادیر آنها مقایسه می شود
  3. اگر نوع داده ها non-primitive باشد برابر بودن در صورتی برابر هستند که به یک شی اشاره کنند.

ولی عملگر == یا Abstract Equality Comparison عملگر پیچیده تری است و برای مقایسه جاوااسکریپت از type coercion استفاده میکند. یعنی برای محاسبه بر روی دو نوع داده مختلف با تبدیل کردن نوع داده سعی بر ایجاد تساوی دارد.

که این باعث به وجود آمدن باور غلط "این عملایت بدون در نظر گرفتن نوع داده فقط مقادیر را فقط بررسی میکند." شده است.

برای محاسبه x == y جاوااسکریپت از الگوریتم زیر استفاده می شود: (الگوریتم ساده شده)

  1. اگر نوع داده ها یکسان باشد:
    • اگر number باشند:
      • اگر یکی از عملوندها NaN باشد ->‌ false
      • اگر مقدار یکسان داشته باشند -> true
      • اگر یکی -0 و دیگری +0 باشد -> true
      • در غیر این صورت -> false
    • اگر string باشند:
      • اگر همه ی کارکترها یکسان باشند -> true
      • در غیر این صورت -> false
    • اگر boolean باشند
      • اگر یکسان باشند -> true
      • در غیر این صورت -> false
  2. اگر یکی undefined و دیگری null باشد ->‌ true
  3. اگر یکی number باشد و دیگری string باشد انگاه رشته را به عدد تبدیل کن و عملیات را تکرار کن
  4. اگر نوع یکی از داده ها boolean باشد آنگاه آن را به عدد تبدیل کن و عملیات را تکرار کن
  5. اگر نوع یکی از داده ها string یا number باشد و دیگری object باشد انگاه object را به primitive تبدیل کن و عملیات را تکرار کن
  6. در غیر این صورت -> false

چرا استفاده از عملگر ==‌ توصیه نمی شود

خوب با توجه به توضیحات بالا میتوانید متوجه شوید که عملیات == خیلی غیر قابل پیشبینی می باشد و هیچنین از قانون تراگذری نیز پیروی نمی کند و این ممکنه باعث به وجود آمدن رفتاری غیر قابل پیشبینی در کد شما شود برای مثال:

// عدم وجود رابطه تراگذری
0 == "0" // => true
0 ==  "" // => true
0 == "0" // => false

از دیگر مشکلات این عملگر میتوان به عدم صراحت و سخت کردن دیباگ برنامه اشاره کرد برای مثال:

function whatIsNum(a) {
  if (this.num == 0){ 
    return "?";
  }
}

در مثال بالا متغیر this.num پس از گذشتن از شرط میتواند مقادیر (0, "0", [], false و...) را داشته باشد و این ممکن است باعث ایجاد رفتاری شود که شما انتظار ندارید.

برای همین استفاده از این عملگر جز Bad Practice ها در جاوااسکریپت است.


استفاده از این عملگر چه زمانی مناسب است؟

با توجه به مشکلاتی که ذکر شد این عملگر میتواند کاربردی باشد. یکی از کاربرد های این عملگر برای چک کردن null یا undefined بودن یک متغییر می باشد. برای مثال

if(a === undefined || a === null) {
  // a is undefined or null
}

را میتوان به سادگی با استفاده از عملگر == به این صورت نوشت:

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

۲ قطعه کد بالا کاملا یکسان هستند.


برای مطالعه بیشتر منابع زیر را پیشنهاد میکنم:

ویرایش شده در 2 سال قبل
جواب داده شده در S Kill
558 امتیاز


ممنون برای توضیحات عالی شما و رفرنس هایی که دادید. ــ سروش قادری نسب در 4 سال قبل

500 کاراکتر باقی مانده


جواب شما
     
.....
×

×

جعبه لام تا کام


وب سایت لام تا کام جهت نمایش استاندارد و کاربردی در تمامی نمایشگر ها بهینه شده است.

تبلیغات توضیحی


اقتصاد رفتاری بررسی روشهای تاثیرگذار بر رفتار کاربران
مردم همیشه به دنبال چیزهایی هستند که نمیتونن اونارو داشته باشن، و با به سادگی نمیتونن اون رو به دست بیارن.

تبلیغات تصویری


محک