تابستون داره تموم میشه ها، فرصت‌ها محدودن کلی آفر جذاب در کمپین تابستون🔥👇
۰ ثانیه
۰ دقیقه
۰ ساعت
۱ مهدی تیما
console.log(5 + \'6\');
جامعه جاوا اسکریپت ایجاد شده در ۲۰ مرداد ۱۴۰۲

درود طبق گفته ای استاد موتور جاوا اسکریپت اول میاد به مقدار سمت چپ نگاه میکنه و بر اساس تایپ داده ای اون رفتار operator رو تغییر میده داخل این مثال الان مقدار سمت چپ من 5 هستش و من اومدم + شش از نوع رشته ای کردم ما باید به من 11 بر گردونه چرا 56 بر میگردونه؟

سلام،

ببینید موضوع به این شکله در جاوااسکریپت وقتی دو مقدار با نوع‌های مختلف(مثل عدد و رشته) را با هم ترکیب کنید، مفسر این دو مقدار را ابتدا از لحاظ تایپ یکسان میکند و بعد عملیات انجام میشود. اصطلاحاً میگن type coercion.

  • تبدیل عدد به رشته:

وقتی یک رشته یا مقدار غیر رشته به یک رشته اضافه می‌شود، همیشه مقدار غیر رشته به یک رشته تبدیل می‌شود.

var x = 10 + '20'// 1020
var y = '20' + 10// 2010
var z = true + '10'// true10
  • تبدیل رشته به عدد:

وقتی عملیاتی مانند کسر (-)، ضرب (*), تقسیم (/) یا باقی‌مانده (%) انجام می‌شود، همه مقادیری که عدد نیستند به نوع داده عدد تبدیل می‌شوند.

var w = 10 - '5'// 5
var x = 10 * '5'// 50
var y = 10 / '5'// 2
var z = 10 % '5'// 0
  • بولین به عدد:

وقتی یک مقدار بولین به یک عدد اضافه می‌شود، مقدار بولین به عدد تبدیل می‌شود. مقادیر بولین می‌توانند با 0 برای "false" و 1 برای "true" نمایش داده شوند.

var x = true + 2// 3
var y = false + 2// 2


  • اپراتور == :
var x = (10 == '10');  // true
var y = (true == 1);  // true
var z = (true == 'true');  // false

در مورد مثال آخر توضیح بیشتری میارم که علت false چیست:

var z = (true == 'true');  // false

اول شرایط مختلف را بررسی کنیم...

  • عدد با رشته:

اگر یکی از مقادیر رشته و دیگری عدد باشد، رشته به عدد تبدیل می‌شود و سپس مقایسه می‌شوند.

5 == '5'// true
  • بولین با غیر بولین: (این مورد را یادمان باشد)

اگر یکی از مقادیر بولین باشد، آن مقدار بولین به عدد تبدیل می‌شود (true به 1 و false به 0) و سپس با مقدار دیگر مقایسه می‌شود.

true == 1// true
false == 0// true
  • شیء با عدد یا رشته:

اگر یکی از مقادیر شیء باشد، شیء به رشته یا عدد تبدیل می‌شود (بر اساس متد valueOf و toString).

  • null با undefined:

هر دو مقدار برابر به نظر می‌رسند.

null == undefined// true
  • NaN: (یعنی Not a Number)

هرگز با هیچ چیزی برابر نمی‌شود، حتی خودش!

NaN == NaN; // false

در موارد دیگر، اگر نوع مقادیر یکسان باشد، مقایسه بر اساس مقدار انجام می‌شود. در غیر این صورت، نتیجه false خواهد بود.

  • برای جلوگیری از تبدیل نوع خودکار، از اپراتور === استفاده کنید. این اپراتور مقایسه را بدون تبدیل نوع انجام می‌دهد. (یعنی هم مقدار چک میشود و هم تایپ و هیچ تبدیلی انجام نمیشود.)


حالا برگردیم به این مثال:

var z = (true == 'true');  // false

عبارت 'true == 'true در دسته‌ی مقایسه‌ی بین یک بولین با غیربولین (نکته بالا) قرار می‌گیرد.

پس طبق شرایطی که در بالا آوردیم ابتدا بولین به یک عدد تبدیل می‌شود، یعنی true به 1 و false به 0 تبدیل می‌شود.

پس، در این مورد:

true تبدیل به 1 می‌شود.

اما 1 با رشته 'true' از لحاظ type هنوز برابر نشدن. در اینجا شرایط عدد با رشته را داریم که در نتیجه، مقدار 'true' سعی می‌کند تا به عدد تبدیل شود، اما از آنجا که رشته‌ی 'true' نمی‌تواند به طور معتبر به عدد تبدیل شود، نتیجه‌ی تبدیل NaN خواهد بود.

پس ما در واقع داریم:

1 == NaN

که این شرط نادرست است و نتیجه false خواهد بود.

در نتیجه، عبارت 'true == 'true به false ارزیابی می‌شود.

تست:

Number('true') // NaN
بهترین پاسخ
محسن موحد ۲۰ مرداد ۱۴۰۲، ۲۱:۲۹

پست قبل ویرایش شد و یک مطلب دیگر اضافه شد.

محسن موحد ۲۰ مرداد ۱۴۰۲، ۲۲:۰۱