Codespian | کدسپین
https://medium.com/codetobits/dealing-with-nan-in-javanoscript-320e3eca9a1a
مقاله: مدیریت NaN در جاوااسکریپت
من معتقدم که ما، توسعهدهندگان، همگی لحظات گیجکنندهای را در حین توسعه در جاوااسکریپت تجربه کردهایم. مدیریت NaN یکی از این موارد است.
MDN تعریف میکند که NaN یک ویژگی جهانی است که نمایانگر "Not-a-Number" (عدد نیست) میباشد. با استفاده از عملگر typeof، میتوانیم بررسی کنیم که NaN از نوع داده اولیه Number است.
بهطور معمول، ما باید با NaN زمانی روبرو شویم که توابع ریاضی شکست بخورند یا هنگام تلاش برای تجزیه یک عدد، مانند مثالهای زیر.
خوب، تا اینجا همه چیز خوب به نظر میرسد. اما چگونه میتوانیم بدانیم که آیا یک مقدار برگشتی NaN است؟ همانطور که قبلاً دیدیم، typeof NaN از نوع Number است، اما typeof 0 نیز از نوع Number است. این بدان معناست که عملگر typeof به ما نمیگوید که آیا مقداری که بررسی میکنیم NaN است یا نه.
پس اگر نمیتوانیم از عملگر typeof استفاده کنیم، چه کار دیگری میتوانیم انجام دهیم تا بررسی کنیم که آیا یک مقدار NaN است؟ پاسخ به این سوال ممکن است بسیار ساده به نظر برسد. چرا مقدار برگشتی را با NaN مقایسه نکنیم؟ اگر NaN باشد، نتیجه true خواهیم داشت و در غیر این صورت false خواهیم داشت و میدانیم که NaN نیست. بیایید امتحان کنیم:
صبر کنید. چه؟ اما… ما میدانیم که Math.round('a') نتیجه NaN را برمیگرداند. چگونه میتواند NaN == NaN نتیجه false بدهد؟
NaN تنها مقداری در جاوااسکریپت است که وقتی با خودش مقایسه میشود، نتیجه false را برمیگرداند. هرچند عجیب به نظر میرسد، حداقل حالا یک راه داریم تا زمانی که یک مقدار NaN است، شناسایی کنیم.
بله، میدانم که این موضوع بسیار گیجکننده است، اما با من همراه باشید. در مثال بالا، roundNum NaN است زیرا وقتی roundNum را برای برابری با خودش مقایسه میکنیم، نتیجه false است. همانطور که قبلاً یاد گرفتیم، این تنها زمانی اتفاق میافتد که با NaN روبرو باشیم. در حالت دوم، roundNum2 NaN نیست، زیرا وقتی با خودش مقایسه میشود، نتیجه true است.
isNaN()
به نظر میرسد جاوااسکریپت یک تابع دارد که به ما کمک میکند تا زمانی که یک مقدار NaN است را شناسایی کنیم. خوب، بیایید امتحان کنیم!
شاید دوباره گیج شدهاید. 'lalala' و ' ' هر دو رشته هستند. چرا مورد اول به عنوان NaN در نظر گرفته میشود و دومی نه؟ یک نکتهای که باید به آن توجه کنید این است که بسته به نوع ورودی، تابع سعی خواهد کرد تا از طریق تبدیل نوع (coercion) استفاده کند و سپس بررسی کند که آیا مقدار تبدیل شده NaN است یا خیر. به نوعی شبیه به این است:
همچنین به یاد داشته باشید که شما در حال بررسی این هستید که آیا یک مقدار خاص NaN است یا نه، که به سادگی به معنای "این مقدار عدد نیست" نیست. بلکه به طور خاص به معنای "این مقدار یک عدد Not-a-Number طبق IEEE-754 است".
Number.isNaN()
این یک ویژگی نسبتاً جدید است که در ECMAScript 2015 (ES6) مشخص شده و یک تفاوت عمده با isNaN() معمولی دارد: آرگومان به طور اجباری تبدیل نمیشود. این بدان معناست که این تابع اکنون بررسی میکند که آیا مقدار ارائهشده (به همان شکل) NaN است یا نه.
آنچه در اینجا اتفاق میافتد این است که در مورد اول، تابع isNaN() سعی میکند 'lalala' را به عدد تبدیل کند. در نتیجه یک محاسبه ناموفق رخ میدهد و NaN برمیگردد و سپس بررسی میشود که آیا برابر با NaN است یا نه، که نتیجه true را برمیگرداند.
با این حال، در مورد دوم، تابع Number.isNaN() سعی نمیکند پارامتر را به طور اجباری به عدد تبدیل کند. در عوض، فقط بررسی میکند که آیا مقدار ورودی NaN است یا نه.
نتیجهگیری
این موضوع میتواند بسیار گیجکننده باشد، اما به طور کلی به یاد داشته باشید که NaN یک مقدار از نوع Number است؛ معمولاً زمانی ظاهر میشود که محاسبات متدهای ریاضی شکست بخورند و مقایسه آن با خودش false باشد (NaN == NaN = false). تابعی به نام isNaN() وجود دارد که پارامتر را قبل از مقایسه با NaN به عدد تبدیل میکند. برای داشتن یک راهحل مطمئنتر، ES6 تابع Number.isNaN() را معرفی کرد که بررسی میکند آیا پارامتر NaN است یا نه بدون اینکه از طریق هرگونه تبدیل اجباری عبور کند.
در نهایت، اگر بخواهید بررسی کنید که آیا یک مقدار "عدد نیست" به جای NaN، کافیست از typeof variable !== 'number' استفاده کنید.
امیدوارم این مطلب مفید بوده باشد. کدنویسی خوش بگذره! :)
من معتقدم که ما، توسعهدهندگان، همگی لحظات گیجکنندهای را در حین توسعه در جاوااسکریپت تجربه کردهایم. مدیریت NaN یکی از این موارد است.
MDN تعریف میکند که NaN یک ویژگی جهانی است که نمایانگر "Not-a-Number" (عدد نیست) میباشد. با استفاده از عملگر typeof، میتوانیم بررسی کنیم که NaN از نوع داده اولیه Number است.
بهطور معمول، ما باید با NaN زمانی روبرو شویم که توابع ریاضی شکست بخورند یا هنگام تلاش برای تجزیه یک عدد، مانند مثالهای زیر.
خوب، تا اینجا همه چیز خوب به نظر میرسد. اما چگونه میتوانیم بدانیم که آیا یک مقدار برگشتی NaN است؟ همانطور که قبلاً دیدیم، typeof NaN از نوع Number است، اما typeof 0 نیز از نوع Number است. این بدان معناست که عملگر typeof به ما نمیگوید که آیا مقداری که بررسی میکنیم NaN است یا نه.
پس اگر نمیتوانیم از عملگر typeof استفاده کنیم، چه کار دیگری میتوانیم انجام دهیم تا بررسی کنیم که آیا یک مقدار NaN است؟ پاسخ به این سوال ممکن است بسیار ساده به نظر برسد. چرا مقدار برگشتی را با NaN مقایسه نکنیم؟ اگر NaN باشد، نتیجه true خواهیم داشت و در غیر این صورت false خواهیم داشت و میدانیم که NaN نیست. بیایید امتحان کنیم:
صبر کنید. چه؟ اما… ما میدانیم که Math.round('a') نتیجه NaN را برمیگرداند. چگونه میتواند NaN == NaN نتیجه false بدهد؟
NaN تنها مقداری در جاوااسکریپت است که وقتی با خودش مقایسه میشود، نتیجه false را برمیگرداند. هرچند عجیب به نظر میرسد، حداقل حالا یک راه داریم تا زمانی که یک مقدار NaN است، شناسایی کنیم.
بله، میدانم که این موضوع بسیار گیجکننده است، اما با من همراه باشید. در مثال بالا، roundNum NaN است زیرا وقتی roundNum را برای برابری با خودش مقایسه میکنیم، نتیجه false است. همانطور که قبلاً یاد گرفتیم، این تنها زمانی اتفاق میافتد که با NaN روبرو باشیم. در حالت دوم، roundNum2 NaN نیست، زیرا وقتی با خودش مقایسه میشود، نتیجه true است.
isNaN()
به نظر میرسد جاوااسکریپت یک تابع دارد که به ما کمک میکند تا زمانی که یک مقدار NaN است را شناسایی کنیم. خوب، بیایید امتحان کنیم!
شاید دوباره گیج شدهاید. 'lalala' و ' ' هر دو رشته هستند. چرا مورد اول به عنوان NaN در نظر گرفته میشود و دومی نه؟ یک نکتهای که باید به آن توجه کنید این است که بسته به نوع ورودی، تابع سعی خواهد کرد تا از طریق تبدیل نوع (coercion) استفاده کند و سپس بررسی کند که آیا مقدار تبدیل شده NaN است یا خیر. به نوعی شبیه به این است:
همچنین به یاد داشته باشید که شما در حال بررسی این هستید که آیا یک مقدار خاص NaN است یا نه، که به سادگی به معنای "این مقدار عدد نیست" نیست. بلکه به طور خاص به معنای "این مقدار یک عدد Not-a-Number طبق IEEE-754 است".
Number.isNaN()
این یک ویژگی نسبتاً جدید است که در ECMAScript 2015 (ES6) مشخص شده و یک تفاوت عمده با isNaN() معمولی دارد: آرگومان به طور اجباری تبدیل نمیشود. این بدان معناست که این تابع اکنون بررسی میکند که آیا مقدار ارائهشده (به همان شکل) NaN است یا نه.
آنچه در اینجا اتفاق میافتد این است که در مورد اول، تابع isNaN() سعی میکند 'lalala' را به عدد تبدیل کند. در نتیجه یک محاسبه ناموفق رخ میدهد و NaN برمیگردد و سپس بررسی میشود که آیا برابر با NaN است یا نه، که نتیجه true را برمیگرداند.
با این حال، در مورد دوم، تابع Number.isNaN() سعی نمیکند پارامتر را به طور اجباری به عدد تبدیل کند. در عوض، فقط بررسی میکند که آیا مقدار ورودی NaN است یا نه.
نتیجهگیری
این موضوع میتواند بسیار گیجکننده باشد، اما به طور کلی به یاد داشته باشید که NaN یک مقدار از نوع Number است؛ معمولاً زمانی ظاهر میشود که محاسبات متدهای ریاضی شکست بخورند و مقایسه آن با خودش false باشد (NaN == NaN = false). تابعی به نام isNaN() وجود دارد که پارامتر را قبل از مقایسه با NaN به عدد تبدیل میکند. برای داشتن یک راهحل مطمئنتر، ES6 تابع Number.isNaN() را معرفی کرد که بررسی میکند آیا پارامتر NaN است یا نه بدون اینکه از طریق هرگونه تبدیل اجباری عبور کند.
در نهایت، اگر بخواهید بررسی کنید که آیا یک مقدار "عدد نیست" به جای NaN، کافیست از typeof variable !== 'number' استفاده کنید.
امیدوارم این مطلب مفید بوده باشد. کدنویسی خوش بگذره! :)
👏1
Codespian | کدسپین
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN
▎تابع isNaN()
تابع isNaN() تعیین میکند که آیا یک مقدار NaN است یا خیر، ابتدا در صورت لزوم مقدار را به عدد تبدیل میکند. به دلیل اینکه تبدیل نوع در داخل تابع isNaN() میتواند غافلگیرکننده باشد، ممکن است ترجیح دهید از Number.isNaN() استفاده کنید.
▎امتحان کنید
نحو (Syntax)
پارامترها
• value: مقداری که باید آزمایش شود.
مقدار بازگشتی
• true اگر مقدار دادهشده پس از تبدیل به عدد، NaN باشد؛ در غیر این صورت، false.
توضیحات
isNaN() یک ویژگی تابعی از شیء جهانی است.
برای مقادیر عددی، isNaN() بررسی میکند که آیا عدد برابر با NaN است یا خیر. وقتی آرگومان تابع isNaN() از نوع Number نباشد، ابتدا مقدار به عدد تبدیل میشود و سپس مقدار حاصل با NaN مقایسه میشود.
این رفتار isNaN() برای آرگومانهای غیر عددی میتواند گیجکننده باشد! به عنوان مثال، یک رشته خالی به 0 تبدیل میشود، در حالی که یک بولین به 0 یا 1 تبدیل میشود؛ هر دو مقدار به طور شهودی "عدد نیستند"، اما به NaN ارزیابی نمیشوند، بنابراین isNaN() false را برمیگرداند. بنابراین، isNaN() نه تنها به سوال "آیا ورودی برابر با مقدار NaN است" پاسخ میدهد و نه به سوال "آیا ورودی عدد نیست".
Number.isNaN() راهی مطمئنتر برای آزمایش اینکه آیا یک مقدار برابر با NaN است یا خیر، میباشد. بهعلاوه، عبارت x !== x نیز میتواند استفاده شود و هیچیک از این راهحلها تحت تأثیر مثبتهای کاذب که isNaN() جهانی را غیرقابل اعتماد میکند، قرار نمیگیرد. برای بررسی اینکه آیا یک مقدار عدد است یا نه، از typeof x === "number" استفاده کنید.
تابع isNaN() به سوال "آیا ورودی از نظر عملکردی معادل NaN است زمانی که در یک زمینه عددی استفاده میشود" پاسخ میدهد. اگر isNaN(x) false را برگرداند، میتوانید از x در یک عبارت ریاضی به عنوان یک عدد معتبر که NaN نیست استفاده کنید. اگر isNaN(x) true را برگرداند، x به NaN تبدیل خواهد شد و بیشتر عبارات ریاضی نتیجه NaN را برمیگردانند (زیرا NaN گسترش مییابد). شما میتوانید از این موضوع استفاده کنید تا بررسی کنید آیا یک آرگومان برای یک تابع از نظر ریاضی قابل پردازش است (قابل استفاده "مانند" یک عدد) و مقادیر غیر عددی را با پرتاب خطا، ارائه یک مقدار پیشفرض و غیره مدیریت کنید. به این ترتیب، میتوانید تابعی داشته باشید که از تمام تنوعی که جاوااسکریپت ارائه میدهد با تبدیلهای ضمنی مقادیر بسته به زمینه استفاده کند.
نکته: عملگر + هم عملیات جمع عددی و هم الحاق رشتهای را انجام میدهد. بنابراین، حتی اگر isNaN() برای هر دو عملوند false را برگرداند، عملگر + ممکن است هنوز یک رشته را برگرداند، زیرا به عنوان یک عملگر ریاضی استفاده نمیشود. به عنوان مثال، isNaN("1") false را برمیگرداند، اما "1" + 1 برابر با "11" خواهد بود. برای اطمینان از اینکه با اعداد کار میکنید، مقدار را به عدد تبدیل کرده و از Number.isNaN() برای آزمایش نتیجه استفاده کنید.
▎مثال
به یاد داشته باشید که isNaN() برای مقادیر که برابر با NaN نیستند اما همچنین عدد هم نیستند true را برمیگرداند:
تابع isNaN() تعیین میکند که آیا یک مقدار NaN است یا خیر، ابتدا در صورت لزوم مقدار را به عدد تبدیل میکند. به دلیل اینکه تبدیل نوع در داخل تابع isNaN() میتواند غافلگیرکننده باشد، ممکن است ترجیح دهید از Number.isNaN() استفاده کنید.
▎امتحان کنید
نحو (Syntax)
پارامترها
• value: مقداری که باید آزمایش شود.
مقدار بازگشتی
• true اگر مقدار دادهشده پس از تبدیل به عدد، NaN باشد؛ در غیر این صورت، false.
توضیحات
isNaN() یک ویژگی تابعی از شیء جهانی است.
برای مقادیر عددی، isNaN() بررسی میکند که آیا عدد برابر با NaN است یا خیر. وقتی آرگومان تابع isNaN() از نوع Number نباشد، ابتدا مقدار به عدد تبدیل میشود و سپس مقدار حاصل با NaN مقایسه میشود.
این رفتار isNaN() برای آرگومانهای غیر عددی میتواند گیجکننده باشد! به عنوان مثال، یک رشته خالی به 0 تبدیل میشود، در حالی که یک بولین به 0 یا 1 تبدیل میشود؛ هر دو مقدار به طور شهودی "عدد نیستند"، اما به NaN ارزیابی نمیشوند، بنابراین isNaN() false را برمیگرداند. بنابراین، isNaN() نه تنها به سوال "آیا ورودی برابر با مقدار NaN است" پاسخ میدهد و نه به سوال "آیا ورودی عدد نیست".
Number.isNaN() راهی مطمئنتر برای آزمایش اینکه آیا یک مقدار برابر با NaN است یا خیر، میباشد. بهعلاوه، عبارت x !== x نیز میتواند استفاده شود و هیچیک از این راهحلها تحت تأثیر مثبتهای کاذب که isNaN() جهانی را غیرقابل اعتماد میکند، قرار نمیگیرد. برای بررسی اینکه آیا یک مقدار عدد است یا نه، از typeof x === "number" استفاده کنید.
تابع isNaN() به سوال "آیا ورودی از نظر عملکردی معادل NaN است زمانی که در یک زمینه عددی استفاده میشود" پاسخ میدهد. اگر isNaN(x) false را برگرداند، میتوانید از x در یک عبارت ریاضی به عنوان یک عدد معتبر که NaN نیست استفاده کنید. اگر isNaN(x) true را برگرداند، x به NaN تبدیل خواهد شد و بیشتر عبارات ریاضی نتیجه NaN را برمیگردانند (زیرا NaN گسترش مییابد). شما میتوانید از این موضوع استفاده کنید تا بررسی کنید آیا یک آرگومان برای یک تابع از نظر ریاضی قابل پردازش است (قابل استفاده "مانند" یک عدد) و مقادیر غیر عددی را با پرتاب خطا، ارائه یک مقدار پیشفرض و غیره مدیریت کنید. به این ترتیب، میتوانید تابعی داشته باشید که از تمام تنوعی که جاوااسکریپت ارائه میدهد با تبدیلهای ضمنی مقادیر بسته به زمینه استفاده کند.
نکته: عملگر + هم عملیات جمع عددی و هم الحاق رشتهای را انجام میدهد. بنابراین، حتی اگر isNaN() برای هر دو عملوند false را برگرداند، عملگر + ممکن است هنوز یک رشته را برگرداند، زیرا به عنوان یک عملگر ریاضی استفاده نمیشود. به عنوان مثال، isNaN("1") false را برمیگرداند، اما "1" + 1 برابر با "11" خواهد بود. برای اطمینان از اینکه با اعداد کار میکنید، مقدار را به عدد تبدیل کرده و از Number.isNaN() برای آزمایش نتیجه استفاده کنید.
▎مثال
به یاد داشته باشید که isNaN() برای مقادیر که برابر با NaN نیستند اما همچنین عدد هم نیستند true را برمیگرداند:
👏3
Codespian | کدسپین
https://getbem.com/introduction
برای نامگذاری بهتر کلاس های css این مقاله میتونه کمک کنه ❤️
❤1
Codespian | کدسپین
https://javanoscript.info/switch
بیانیه "switch"
بیانیه switch میتواند جایگزین چندین بررسی if شود.
این یک روش توصیفیتر برای مقایسه یک مقدار با چندین حالت مختلف ارائه میدهد.
سینتکس
بیانیه switch شامل یک یا چند بلوک case و یک بلوک default اختیاری است.
به این صورت به نظر میرسد:
مقدار x برای برابری سخت (strict equality) با مقدار اولین case (یعنی value1) بررسی میشود، سپس با دومین (value2) و به همین ترتیب.
اگر برابری پیدا شود، switch شروع به اجرای کد از case مربوطه میکند تا نزدیکترین break (یا تا پایان switch).
اگر هیچ case مطابقت نداشته باشد، کد default اجرا میشود (اگر وجود داشته باشد).
یک مثال
مثالی از switch (کد اجرایی هایلایت شده است):
در اینجا switch شروع به مقایسه a از اولین حالت که 3 است میکند. تطابق ناموفق است.
سپس 4. این یک تطابق است، بنابراین اجرا از case 4 آغاز میشود تا نزدیکترین break.
اگر break وجود نداشته باشد، اجرا با case بعدی بدون هیچ چک دیگری ادامه مییابد.
مثالی بدون break:
در مثال بالا ما سه alert متوالی را خواهیم دید:
❕هر بیانیهای میتواند آرگومان switch/case باشد.
هم switch و هم case اجازه میدهند که عبارات دلخواه استفاده شوند.
برای مثال:
در اینجا +a برابر با 1 است که با b + 1 در case مقایسه میشود و کد مربوطه اجرا میشود.
گروهبندی "case"
چندین حالت case که کد مشترکی دارند میتوانند گروهبندی شوند.
برای مثال، اگر بخواهیم همان کد برای case 3 و case 5 اجرا شود:
اکنون هم 3 و هم 5 همان پیام را نشان میدهند.
توانایی "گروهبندی" حالات نتیجه جانبی نحوه کار switch/case بدون break است. در اینجا اجرای case 3 از خط (*) شروع میشود و از case 5 عبور میکند، زیرا break وجود ندارد.
نوع اهمیت دارد
بگذارید تأکید کنیم که بررسی برابری همیشه سخت است. مقادیر باید از همان نوع باشند تا مطابقت داشته باشند.
برای مثال، بیایید کد زیر را در نظر بگیریم:
1. برای 0 و 1، اولین alert اجرا میشود.
2. برای 2، alert دوم اجرا میشود.
3. اما برای 3، نتیجه prompt یک رشته "3" است که به عدد 3 به طور سخت === برابر نیست. بنابراین ما یک کد مرده در case 3 داریم! گزینه default اجرا خواهد شد.
بیانیه switch میتواند جایگزین چندین بررسی if شود.
این یک روش توصیفیتر برای مقایسه یک مقدار با چندین حالت مختلف ارائه میدهد.
سینتکس
بیانیه switch شامل یک یا چند بلوک case و یک بلوک default اختیاری است.
به این صورت به نظر میرسد:
مقدار x برای برابری سخت (strict equality) با مقدار اولین case (یعنی value1) بررسی میشود، سپس با دومین (value2) و به همین ترتیب.
اگر برابری پیدا شود، switch شروع به اجرای کد از case مربوطه میکند تا نزدیکترین break (یا تا پایان switch).
اگر هیچ case مطابقت نداشته باشد، کد default اجرا میشود (اگر وجود داشته باشد).
یک مثال
مثالی از switch (کد اجرایی هایلایت شده است):
در اینجا switch شروع به مقایسه a از اولین حالت که 3 است میکند. تطابق ناموفق است.
سپس 4. این یک تطابق است، بنابراین اجرا از case 4 آغاز میشود تا نزدیکترین break.
اگر break وجود نداشته باشد، اجرا با case بعدی بدون هیچ چک دیگری ادامه مییابد.
مثالی بدون break:
در مثال بالا ما سه alert متوالی را خواهیم دید:
❕هر بیانیهای میتواند آرگومان switch/case باشد.
هم switch و هم case اجازه میدهند که عبارات دلخواه استفاده شوند.
برای مثال:
در اینجا +a برابر با 1 است که با b + 1 در case مقایسه میشود و کد مربوطه اجرا میشود.
گروهبندی "case"
چندین حالت case که کد مشترکی دارند میتوانند گروهبندی شوند.
برای مثال، اگر بخواهیم همان کد برای case 3 و case 5 اجرا شود:
اکنون هم 3 و هم 5 همان پیام را نشان میدهند.
توانایی "گروهبندی" حالات نتیجه جانبی نحوه کار switch/case بدون break است. در اینجا اجرای case 3 از خط (*) شروع میشود و از case 5 عبور میکند، زیرا break وجود ندارد.
نوع اهمیت دارد
بگذارید تأکید کنیم که بررسی برابری همیشه سخت است. مقادیر باید از همان نوع باشند تا مطابقت داشته باشند.
برای مثال، بیایید کد زیر را در نظر بگیریم:
1. برای 0 و 1، اولین alert اجرا میشود.
2. برای 2، alert دوم اجرا میشود.
3. اما برای 3، نتیجه prompt یک رشته "3" است که به عدد 3 به طور سخت === برابر نیست. بنابراین ما یک کد مرده در case 3 داریم! گزینه default اجرا خواهد شد.
Codespian | کدسپین
http://javanoscript.info/logical-operators
▎عملگرهای منطقی
در جاوا اسکریپت چهار عملگر منطقی وجود دارد: || (یا)، && (و)، ! (نفی). در اینجا به بررسی سه مورد اول میپردازیم و عملگر ?? (تجمیع نال) در مقاله بعدی بررسی خواهد شد.
اگرچه این عملگرها "منطقی" نامیده میشوند، اما میتوانند به مقادیر از هر نوعی اعمال شوند و نتیجه آنها نیز میتواند از هر نوعی باشد.
بیایید جزئیات را بررسی کنیم.
▎|| (یا)
عملگر "یا" با دو علامت عمودی نمایش داده میشود:
در برنامهنویسی کلاسیک، عملگر منطقی OR معمولاً برای کار با مقادیر بولی طراحی شده است. اگر هر یک از آرگومانها درست (true) باشد، نتیجه درست (true) خواهد بود و در غیر این صورت، نادرست (false) خواهد بود.
در جاوا اسکریپت، این عملگر کمی پیچیدهتر و قدرتمندتر است. اما ابتدا بیایید ببینیم که با مقادیر بولی چه اتفاقی میافتد.
چهار ترکیب منطقی ممکن وجود دارد:
همانطور که مشاهده میکنید، نتیجه همیشه درست است مگر اینکه هر دو عملوند نادرست باشند.
اگر یک عملوند بولی نباشد، برای ارزیابی به بولی تبدیل میشود.
برای مثال، عدد 1 به عنوان درست (true) و عدد 0 به عنوان نادرست (false) در نظر گرفته میشود:
بیشتر اوقات، OR || در یک دستور if برای آزمایش اینکه آیا هر یک از شرایط داده شده درست است استفاده میشود.
به عنوان مثال:
ما میتوانیم شرایط بیشتری را نیز اضافه کنیم:
عملگر "یا" || اولین مقدار درست را پیدا میکند.
منطق توصیف شده در بالا تا حدی کلاسیک است. حالا بیایید ویژگیهای "اضافی" جاوا اسکریپت را بررسی کنیم.
الگوریتم گسترشیافته به شرح زیر عمل میکند:
با توجه به چندین مقدار OR شده:
عملگر OR || کارهای زیر را انجام میدهد:
1. عملوندها را از چپ به راست ارزیابی میکند.
2. برای هر عملوند، آن را به بولی تبدیل میکند. اگر نتیجه درست باشد، متوقف شده و مقدار اصلی آن عملوند را برمیگرداند.
3. اگر همه عملوندها ارزیابی شدند (یعنی همه نادرست بودند)، آخرین عملوند را برمیگرداند.
به عبارت دیگر، زنجیرهای از OR || اولین مقدار درست یا آخرین مقدار را اگر هیچ مقدار درستی پیدا نشود، برمیگرداند.
برای مثال:
این منجر به برخی استفادههای جالب در مقایسه با یک OR صرفاً کلاسیک و مخصوص بولی میشود.
1. دریافت اولین مقدار درست از یک لیست از متغیرها یا عبارات.
برای مثال، ما متغیرهای firstName، lastName و nickName داریم که همه اختیاری هستند (یعنی ممکن است undefined یا دارای مقادیر نادرست باشند).
بیایید از OR || استفاده کنیم تا یکی از آنها که دارای داده است را انتخاب کنیم و آن را نمایش دهیم (یا "Anonymous" اگر هیچکدام تنظیم نشده باشند):
اگر همه متغیرها نادرست بودند، "Anonymous" نمایش داده میشود.
2. ارزیابی کوتاهمدت.
یکی دیگر از ویژگیهای عملگر OR || ارزیابی کوتاهمدت است.
این بدان معنی است که || آرگومانهای خود را تا زمانی که به اولین مقدار درست برسد پردازش میکند و سپس بلافاصله مقدار را برمیگرداند، بدون اینکه به آرگومان دیگر حتی نگاه کند.
اهمیت این ویژگی زمانی مشخص میشود که یک عملوند فقط یک مقدار نیست، بلکه یک عبارت با اثر جانبی مانند انتساب متغیر یا فراخوانی تابع باشد.
در مثال زیر، فقط پیام دوم چاپ میشود:
در خط اول، عملگر OR || بلافاصله پس از دیدن true ارزیابی را متوقف میکند، بنابراین alert اجرا نمیشود.
گاهی اوقات افراد از این ویژگی برای اجرای دستورات تنها در صورتی که شرط در سمت چپ نادرست باشد استفاده میکنند.
▎&& (و)
عملگر AND با دو علامت نمایش داده میشود:
در برنامهنویسی کلاسیک، AND زمانی درست است که هر دو عملوند درست باشند و در غیر این صورت نادرست است:
مثالی با if:
همانند OR، هر مقداری به عنوان عملوند AND مجاز است:
عملگر AND && اولین مقدار را پیدا میکند.
با توجه به چندین مقدار AND شده:
عملگر AND && کارهای زیر را انجام میدهد:
1. عملوندها را از چپ به راست ارزیابی میکند.
2. برای هر عملوند، آن را به بولی تبدیل میکند. اگر نتیجه نادرست باشد، متوقف شده و مقدار اصلی آن عملوند را برمیگرداند.
3. اگر همه عملوندها ارزیابی شدند (یعنی همه درست بودند)، آخرین عملوند را برمیگرداند.
به عبارت دیگر، AND اولین مقدار نادرست یا آخرین مقدار را اگر هیچ مقدار نادرستی پیدا نشود، برمیگرداند.
قوانین فوق مشابه OR هستند. تفاوت این است که AND اولین مقدار نادرست را برمیگرداند در حالی که OR اولین مقدار درست را برمیگرداند.
مثالها:
ما همچنین میتوانیم چندین مقدار را به صورت پیدرپی پاس دهیم. ببینید چگونه اولین مقدار نادرست برمیگردد:
وقتی همه مقادیر درست باشند، آخرین مقدار برگردانده میشود:
در جاوا اسکریپت چهار عملگر منطقی وجود دارد: || (یا)، && (و)، ! (نفی). در اینجا به بررسی سه مورد اول میپردازیم و عملگر ?? (تجمیع نال) در مقاله بعدی بررسی خواهد شد.
اگرچه این عملگرها "منطقی" نامیده میشوند، اما میتوانند به مقادیر از هر نوعی اعمال شوند و نتیجه آنها نیز میتواند از هر نوعی باشد.
بیایید جزئیات را بررسی کنیم.
▎|| (یا)
عملگر "یا" با دو علامت عمودی نمایش داده میشود:
در برنامهنویسی کلاسیک، عملگر منطقی OR معمولاً برای کار با مقادیر بولی طراحی شده است. اگر هر یک از آرگومانها درست (true) باشد، نتیجه درست (true) خواهد بود و در غیر این صورت، نادرست (false) خواهد بود.
در جاوا اسکریپت، این عملگر کمی پیچیدهتر و قدرتمندتر است. اما ابتدا بیایید ببینیم که با مقادیر بولی چه اتفاقی میافتد.
چهار ترکیب منطقی ممکن وجود دارد:
همانطور که مشاهده میکنید، نتیجه همیشه درست است مگر اینکه هر دو عملوند نادرست باشند.
اگر یک عملوند بولی نباشد، برای ارزیابی به بولی تبدیل میشود.
برای مثال، عدد 1 به عنوان درست (true) و عدد 0 به عنوان نادرست (false) در نظر گرفته میشود:
بیشتر اوقات، OR || در یک دستور if برای آزمایش اینکه آیا هر یک از شرایط داده شده درست است استفاده میشود.
به عنوان مثال:
ما میتوانیم شرایط بیشتری را نیز اضافه کنیم:
عملگر "یا" || اولین مقدار درست را پیدا میکند.
منطق توصیف شده در بالا تا حدی کلاسیک است. حالا بیایید ویژگیهای "اضافی" جاوا اسکریپت را بررسی کنیم.
الگوریتم گسترشیافته به شرح زیر عمل میکند:
با توجه به چندین مقدار OR شده:
عملگر OR || کارهای زیر را انجام میدهد:
1. عملوندها را از چپ به راست ارزیابی میکند.
2. برای هر عملوند، آن را به بولی تبدیل میکند. اگر نتیجه درست باشد، متوقف شده و مقدار اصلی آن عملوند را برمیگرداند.
3. اگر همه عملوندها ارزیابی شدند (یعنی همه نادرست بودند)، آخرین عملوند را برمیگرداند.
به عبارت دیگر، زنجیرهای از OR || اولین مقدار درست یا آخرین مقدار را اگر هیچ مقدار درستی پیدا نشود، برمیگرداند.
برای مثال:
این منجر به برخی استفادههای جالب در مقایسه با یک OR صرفاً کلاسیک و مخصوص بولی میشود.
1. دریافت اولین مقدار درست از یک لیست از متغیرها یا عبارات.
برای مثال، ما متغیرهای firstName، lastName و nickName داریم که همه اختیاری هستند (یعنی ممکن است undefined یا دارای مقادیر نادرست باشند).
بیایید از OR || استفاده کنیم تا یکی از آنها که دارای داده است را انتخاب کنیم و آن را نمایش دهیم (یا "Anonymous" اگر هیچکدام تنظیم نشده باشند):
اگر همه متغیرها نادرست بودند، "Anonymous" نمایش داده میشود.
2. ارزیابی کوتاهمدت.
یکی دیگر از ویژگیهای عملگر OR || ارزیابی کوتاهمدت است.
این بدان معنی است که || آرگومانهای خود را تا زمانی که به اولین مقدار درست برسد پردازش میکند و سپس بلافاصله مقدار را برمیگرداند، بدون اینکه به آرگومان دیگر حتی نگاه کند.
اهمیت این ویژگی زمانی مشخص میشود که یک عملوند فقط یک مقدار نیست، بلکه یک عبارت با اثر جانبی مانند انتساب متغیر یا فراخوانی تابع باشد.
در مثال زیر، فقط پیام دوم چاپ میشود:
در خط اول، عملگر OR || بلافاصله پس از دیدن true ارزیابی را متوقف میکند، بنابراین alert اجرا نمیشود.
گاهی اوقات افراد از این ویژگی برای اجرای دستورات تنها در صورتی که شرط در سمت چپ نادرست باشد استفاده میکنند.
▎&& (و)
عملگر AND با دو علامت نمایش داده میشود:
در برنامهنویسی کلاسیک، AND زمانی درست است که هر دو عملوند درست باشند و در غیر این صورت نادرست است:
مثالی با if:
همانند OR، هر مقداری به عنوان عملوند AND مجاز است:
عملگر AND && اولین مقدار را پیدا میکند.
با توجه به چندین مقدار AND شده:
عملگر AND && کارهای زیر را انجام میدهد:
1. عملوندها را از چپ به راست ارزیابی میکند.
2. برای هر عملوند، آن را به بولی تبدیل میکند. اگر نتیجه نادرست باشد، متوقف شده و مقدار اصلی آن عملوند را برمیگرداند.
3. اگر همه عملوندها ارزیابی شدند (یعنی همه درست بودند)، آخرین عملوند را برمیگرداند.
به عبارت دیگر، AND اولین مقدار نادرست یا آخرین مقدار را اگر هیچ مقدار نادرستی پیدا نشود، برمیگرداند.
قوانین فوق مشابه OR هستند. تفاوت این است که AND اولین مقدار نادرست را برمیگرداند در حالی که OR اولین مقدار درست را برمیگرداند.
مثالها:
ما همچنین میتوانیم چندین مقدار را به صورت پیدرپی پاس دهیم. ببینید چگونه اولین مقدار نادرست برمیگردد:
وقتی همه مقادیر درست باشند، آخرین مقدار برگردانده میشود:
Codespian | کدسپین
http://javanoscript.info/logical-operators
▎اولویت عملگرهای منطقی
اولویت عملگر AND && از OR || بالاتر است.
بنابراین کد a && b c && a به طور اساسی مشابه با این است که فرض کنیم عبارات AND در پرانتز قرار دارند: (a && b) (c && d).
⚠️ از جایگزینی if با || یا & خودداری کنید
گاهی اوقات، افراد از عملگر AND && به عنوان یک "روش کوتاهتر برای نوشتن if" استفاده میکنند.
برای مثال:
عملی که در سمت راست && وجود دارد فقط در صورتی اجرا میشود که ارزیابی به آن برسد. یعنی، تنها اگر (x > 0) درست باشد.
بنابراین، ما اساساً یک معادل برای:
داریم.
اگرچه نسخهای که با && نوشته شده کوتاهتر به نظر میرسد، استفاده از if واضحتر است و معمولاً کمی خواناتر است. بنابراین توصیه میشود که از هر ساختار برای هدف خود استفاده کنید: از if برای موارد شرطی و از && برای عملگر AND استفاده کنید.
▎! NOT
عملگر NOT منطقی با علامت تعجب ! نمایش داده میشود.
سینتکس آن بسیار ساده است:
این عملگر یک آرگومان را میپذیرد و کارهای زیر را انجام میدهد:
1. عملوند را به نوع بولی تبدیل میکند: true/false.
2. مقدار معکوس را برمیگرداند.
برای مثال:
یک دو بار NOT !! گاهی برای تبدیل یک مقدار به نوع بولی استفاده میشود:
یعنی، اولین NOT مقدار را به بولی تبدیل کرده و معکوس آن را برمیگرداند و دومین NOT دوباره آن را معکوس میکند. در نهایت، ما یک تبدیل ساده از مقدار به بولی داریم.
یک روش کمی طولانیتر برای انجام همین کار، استفاده از تابع داخلی Boolean است:
اولویت عملگر NOT ! بالاترین اولویت را در بین تمام عملگرهای منطقی دارد، بنابراین همیشه اول از همه اجرا میشود، قبل از && یا ||.
اولویت عملگر AND && از OR || بالاتر است.
بنابراین کد a && b
⚠️ از جایگزینی if با || یا & خودداری کنید
گاهی اوقات، افراد از عملگر AND && به عنوان یک "روش کوتاهتر برای نوشتن if" استفاده میکنند.
برای مثال:
عملی که در سمت راست && وجود دارد فقط در صورتی اجرا میشود که ارزیابی به آن برسد. یعنی، تنها اگر (x > 0) درست باشد.
بنابراین، ما اساساً یک معادل برای:
داریم.
اگرچه نسخهای که با && نوشته شده کوتاهتر به نظر میرسد، استفاده از if واضحتر است و معمولاً کمی خواناتر است. بنابراین توصیه میشود که از هر ساختار برای هدف خود استفاده کنید: از if برای موارد شرطی و از && برای عملگر AND استفاده کنید.
▎! NOT
عملگر NOT منطقی با علامت تعجب ! نمایش داده میشود.
سینتکس آن بسیار ساده است:
این عملگر یک آرگومان را میپذیرد و کارهای زیر را انجام میدهد:
1. عملوند را به نوع بولی تبدیل میکند: true/false.
2. مقدار معکوس را برمیگرداند.
برای مثال:
یک دو بار NOT !! گاهی برای تبدیل یک مقدار به نوع بولی استفاده میشود:
یعنی، اولین NOT مقدار را به بولی تبدیل کرده و معکوس آن را برمیگرداند و دومین NOT دوباره آن را معکوس میکند. در نهایت، ما یک تبدیل ساده از مقدار به بولی داریم.
یک روش کمی طولانیتر برای انجام همین کار، استفاده از تابع داخلی Boolean است:
اولویت عملگر NOT ! بالاترین اولویت را در بین تمام عملگرهای منطقی دارد، بنابراین همیشه اول از همه اجرا میشود، قبل از && یا ||.
https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Structuring_content/Basic_HTML_syntax
#HTML
#HTML
MDN Web Docs
Basic HTML syntax - Learn web development | MDN
In this article, we cover the absolute basics of HTML. To get you started, this article defines elements, attributes, and all the other important terms you may have heard. It also explains where these fit into HTML. You will learn how HTML elements are structured…
https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Structuring_content/Webpage_metadata
#HTML
#HTML
MDN Web Docs
What's in the head? Web page metadata - Learn web development | MDN
The head of an HTML document is the part that is not displayed in the web browser when the page is loaded. It contains metadata information such as the page <noscript>, links to CSS (if you choose to style your HTML content with CSS), links to custom favicons…
https://www.w3schools.com/tags/att_lang.asp#:~:text=The%20lang%20attribute%20specifies%20the,for%20French%20and%20so%20on.
#HTML
#HTML
W3Schools
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
https://www.w3schools.com/tags/att_dir.asp#:~:text=Definition%20and%20Usage,right%20to%20left%20text%20direction
#HTML
#HTML
W3Schools
W3Schools offers free online tutorials, references and exercises in all the major languages of the web. Covering popular subjects like HTML, CSS, JavaScript, Python, SQL, Java, and many, many more.
Codespian | کدسپین
https://javanoscript.info/function-basics #JS
▎توابع
بسیاری اوقات نیاز داریم که یک عمل مشابه را در نقاط مختلف یک اسکریپت انجام دهیم.
به عنوان مثال، نیاز داریم که یک پیام زیبا را هنگام ورود کاربر، خروج کاربر و شاید در جاهای دیگر نمایش دهیم.
توابع اصلیترین "اجزای سازنده" برنامه هستند. آنها اجازه میدهند که کد بدون تکرار چندین بار فراخوانی شود.
ما قبلاً نمونههایی از توابع داخلی مانند alert(message)، prompt(message, default) و confirm(question) را دیدهایم. اما میتوانیم توابع خودمان را نیز ایجاد کنیم.
▎اعلام تابع
برای ایجاد یک تابع میتوانیم از اعلام تابع استفاده کنیم.
این به شکل زیر است:
کلیدواژه function ابتدا میآید، سپس نام تابع، سپس لیستی از پارامترها درون پرانتز (با کاما جدا شده، خالی در مثال بالا، که بعداً نمونههایی خواهیم دید) و در نهایت کد تابع، که به آن "بدنه تابع" نیز گفته میشود، درون آکولادها قرار دارد.
تابع جدید ما میتواند با نام خود فراخوانی شود: showMessage().
به عنوان مثال:
فراخوانی showMessage() کد تابع را اجرا میکند. در اینجا ما پیام را دو بار مشاهده خواهیم کرد.
این مثال به وضوح یکی از اهداف اصلی توابع را نشان میدهد: جلوگیری از تکرار کد.
اگر هر زمان نیاز به تغییر پیام یا نحوه نمایش آن داشته باشیم، کافی است کد را در یک مکان تغییر دهیم: تابعی که آن را نمایش میدهد.
▎متغیرهای محلی
یک متغیر که درون یک تابع اعلام شده باشد فقط درون همان تابع قابل مشاهده است.
به عنوان مثال:
▎متغیرهای خارجی
یک تابع میتواند به یک متغیر خارجی نیز دسترسی داشته باشد، به عنوان مثال:
تابع به طور کامل به متغیر خارجی دسترسی دارد. همچنین میتواند آن را تغییر دهد.
به عنوان مثال:
متغیر خارجی فقط در صورتی استفاده میشود که متغیر محلی وجود نداشته باشد.
اگر یک متغیر با همان نام درون تابع اعلام شود، متغیر خارجی سایهدار خواهد شد. به عنوان مثال، در کد زیر تابع از userName محلی استفاده میکند و متغیر خارجی نادیده گرفته میشود:
▎❕متغیرهای جهانی
متغیرهایی که خارج از هر تابع اعلام شدهاند، مانند userName خارجی در کد بالا، به عنوان متغیرهای جهانی شناخته میشوند.
متغیرهای جهانی از هر تابع قابل مشاهده هستند (مگر اینکه توسط متغیرهای محلی سایهدار شوند).
استفاده حداقلی از متغیرهای جهانی یک عمل خوب است. کدهای مدرن معمولاً تعداد کمی یا هیچ متغیر جهانی ندارند. بیشتر متغیرها درون توابع خود قرار دارند. با این حال، گاهی اوقات ممکن است برای ذخیره دادههای سطح پروژه مفید باشند.
▎پارامترها
ما میتوانیم دادههای دلخواهی را با استفاده از پارامترها به توابع منتقل کنیم.
در مثال زیر، تابع دارای دو پارامتر: from و text است.
زمانی که تابع در خطوط (*) و (**) فراخوانی میشود، مقادیر داده شده به متغیرهای محلی from و text کپی میشوند. سپس تابع از آنها استفاده میکند.
در اینجا یک مثال دیگر: ما یک متغیر from داریم و آن را به تابع منتقل میکنیم. لطفاً توجه داشته باشید: تابع from را تغییر میدهد، اما تغییرات در خارج دیده نمیشود، زیرا یک تابع همیشه یک کپی از مقدار را دریافت میکند:
وقتی که یک مقدار به عنوان پارامتر تابع منتقل میشود، همچنین به آن آرگومان گفته میشود.
به عبارت دیگر، برای شفاف کردن این اصطلاحات:
• پارامتر: متغیری است که درون پرانتزها در اعلام تابع ذکر شده است (این یک اصطلاح مربوط به زمان اعلام است).
• آرگومان: مقداری است که هنگام فراخوانی تابع به آن منتقل میشود (این یک اصطلاح مربوط به زمان فراخوانی است).
ما توابع را با ذکر پارامترهایشان اعلام میکنیم و سپس آنها را با ارسال آرگومانها فراخوانی میکنیم.
در مثال بالا، میتوان گفت: "تابع showMessage با دو پارامتر اعلام شده است، سپس با دو آرگومان: from و "Hello" فراخوانی شده است".
▎مقادیر پیشفرض
اگر یک تابع فراخوانی شود اما آرگومانی ارائه نشود، آنگاه مقدار مربوطه undefined خواهد شد.
به عنوان مثال، تابع فوقالذکر showMessage(from, text) میتواند با یک آرگومان فراخوانی شود:
این یک خطا نیست. چنین فراخوانی "*Ann*: undefined" را نمایش خواهد داد. از آنجایی که مقدار برای text منتقل نشده است، این مقدار undefined میشود.
ما میتوانیم مقدار "پیشفرض" (برای استفاده در صورت حذف) را برای یک پارامتر در اعلام تابع مشخص کنیم، با استفاده از =:
اکنون اگر پارامتر text منتقل نشود، مقدار "no text given" را دریافت خواهد کرد.
مقدار پیشفرض همچنین اگر پارامتر وجود داشته باشد اما برابر با undefined باشد نیز وارد عمل میشود.
بسیاری اوقات نیاز داریم که یک عمل مشابه را در نقاط مختلف یک اسکریپت انجام دهیم.
به عنوان مثال، نیاز داریم که یک پیام زیبا را هنگام ورود کاربر، خروج کاربر و شاید در جاهای دیگر نمایش دهیم.
توابع اصلیترین "اجزای سازنده" برنامه هستند. آنها اجازه میدهند که کد بدون تکرار چندین بار فراخوانی شود.
ما قبلاً نمونههایی از توابع داخلی مانند alert(message)، prompt(message, default) و confirm(question) را دیدهایم. اما میتوانیم توابع خودمان را نیز ایجاد کنیم.
▎اعلام تابع
برای ایجاد یک تابع میتوانیم از اعلام تابع استفاده کنیم.
این به شکل زیر است:
کلیدواژه function ابتدا میآید، سپس نام تابع، سپس لیستی از پارامترها درون پرانتز (با کاما جدا شده، خالی در مثال بالا، که بعداً نمونههایی خواهیم دید) و در نهایت کد تابع، که به آن "بدنه تابع" نیز گفته میشود، درون آکولادها قرار دارد.
تابع جدید ما میتواند با نام خود فراخوانی شود: showMessage().
به عنوان مثال:
فراخوانی showMessage() کد تابع را اجرا میکند. در اینجا ما پیام را دو بار مشاهده خواهیم کرد.
این مثال به وضوح یکی از اهداف اصلی توابع را نشان میدهد: جلوگیری از تکرار کد.
اگر هر زمان نیاز به تغییر پیام یا نحوه نمایش آن داشته باشیم، کافی است کد را در یک مکان تغییر دهیم: تابعی که آن را نمایش میدهد.
▎متغیرهای محلی
یک متغیر که درون یک تابع اعلام شده باشد فقط درون همان تابع قابل مشاهده است.
به عنوان مثال:
▎متغیرهای خارجی
یک تابع میتواند به یک متغیر خارجی نیز دسترسی داشته باشد، به عنوان مثال:
تابع به طور کامل به متغیر خارجی دسترسی دارد. همچنین میتواند آن را تغییر دهد.
به عنوان مثال:
متغیر خارجی فقط در صورتی استفاده میشود که متغیر محلی وجود نداشته باشد.
اگر یک متغیر با همان نام درون تابع اعلام شود، متغیر خارجی سایهدار خواهد شد. به عنوان مثال، در کد زیر تابع از userName محلی استفاده میکند و متغیر خارجی نادیده گرفته میشود:
▎❕متغیرهای جهانی
متغیرهایی که خارج از هر تابع اعلام شدهاند، مانند userName خارجی در کد بالا، به عنوان متغیرهای جهانی شناخته میشوند.
متغیرهای جهانی از هر تابع قابل مشاهده هستند (مگر اینکه توسط متغیرهای محلی سایهدار شوند).
استفاده حداقلی از متغیرهای جهانی یک عمل خوب است. کدهای مدرن معمولاً تعداد کمی یا هیچ متغیر جهانی ندارند. بیشتر متغیرها درون توابع خود قرار دارند. با این حال، گاهی اوقات ممکن است برای ذخیره دادههای سطح پروژه مفید باشند.
▎پارامترها
ما میتوانیم دادههای دلخواهی را با استفاده از پارامترها به توابع منتقل کنیم.
در مثال زیر، تابع دارای دو پارامتر: from و text است.
زمانی که تابع در خطوط (*) و (**) فراخوانی میشود، مقادیر داده شده به متغیرهای محلی from و text کپی میشوند. سپس تابع از آنها استفاده میکند.
در اینجا یک مثال دیگر: ما یک متغیر from داریم و آن را به تابع منتقل میکنیم. لطفاً توجه داشته باشید: تابع from را تغییر میدهد، اما تغییرات در خارج دیده نمیشود، زیرا یک تابع همیشه یک کپی از مقدار را دریافت میکند:
وقتی که یک مقدار به عنوان پارامتر تابع منتقل میشود، همچنین به آن آرگومان گفته میشود.
به عبارت دیگر، برای شفاف کردن این اصطلاحات:
• پارامتر: متغیری است که درون پرانتزها در اعلام تابع ذکر شده است (این یک اصطلاح مربوط به زمان اعلام است).
• آرگومان: مقداری است که هنگام فراخوانی تابع به آن منتقل میشود (این یک اصطلاح مربوط به زمان فراخوانی است).
ما توابع را با ذکر پارامترهایشان اعلام میکنیم و سپس آنها را با ارسال آرگومانها فراخوانی میکنیم.
در مثال بالا، میتوان گفت: "تابع showMessage با دو پارامتر اعلام شده است، سپس با دو آرگومان: from و "Hello" فراخوانی شده است".
▎مقادیر پیشفرض
اگر یک تابع فراخوانی شود اما آرگومانی ارائه نشود، آنگاه مقدار مربوطه undefined خواهد شد.
به عنوان مثال، تابع فوقالذکر showMessage(from, text) میتواند با یک آرگومان فراخوانی شود:
این یک خطا نیست. چنین فراخوانی "*Ann*: undefined" را نمایش خواهد داد. از آنجایی که مقدار برای text منتقل نشده است، این مقدار undefined میشود.
ما میتوانیم مقدار "پیشفرض" (برای استفاده در صورت حذف) را برای یک پارامتر در اعلام تابع مشخص کنیم، با استفاده از =:
اکنون اگر پارامتر text منتقل نشود، مقدار "no text given" را دریافت خواهد کرد.
مقدار پیشفرض همچنین اگر پارامتر وجود داشته باشد اما برابر با undefined باشد نیز وارد عمل میشود.