لحظات غیرمنتظره جاوا اسکریپت که درک شما از زبان را به چالش می کشد

به عنوان یکی از محبوب ترین زبان های برنامه نویسی در جهان، جاوا اسکریپت به طور گسترده برای ساخت وب سایت های پویا و تعاملی، برنامه های کاربردی وب و حتی برنامه های دسکتاپ و موبایل استفاده می شود. جاوا اسکریپت است دروازه ای برای سایر فناوری های وب، به دلیل استفاده گسترده و سازگاری با پلتفرم های مختلف. این زبان به یک زبان اساسی در توسعه وب مدرن تبدیل شده است. همچنین یک زبان پیچیده با لحظات غیرمنتظره بسیاری است که می تواند حتی باتجربه ترین توسعه دهندگان را نیز در سر خود بیاندازد.
در این مقاله، لحظات مختلف جاوا اسکریپت غیرمنتظره ای را مشاهده خواهیم کرد که می توانند گیج شوند، محدودیت های شما را آزمایش کنند و شما را ناامید کنند. همچنین به شما کمک می کند تا نحوه کدنویسی خود را تغییر دهید.
آماده اید که مغزتان را منفجر کنید🤯؟ اگر اینطور است، بیایید وارد جنگل شویم..
1️⃣
2 == [2] // true
==
اپراتور در JS نوع اجباری را انجام می دهد به این معنی که سعی می کند قبل از انجام مقایسه، مقادیر مقایسه شده را به یک نوع داده رایج تبدیل کند.
در این مثال، عدد 2 به یک رشته و آرایه تبدیل می شود [2]
به رشته ای نیز تبدیل می شود. در نتیجه هر دو ارزش وجود دارد 2
. به همین دلیل، مقایسه به ارزیابی می شود true
.
به طور کلی توصیه می شود از عملگر برابری دقیق استفاده کنید ===
بجای ==
برای جلوگیری از نتایج غیرمنتظره به دلیل اجبار نوع..
کاوش بیشتر:
'123' == 123 // true
'foo' == NaN // false
undefined == null // true
NaN === NaN // false
NaN == NaN // false
0 == null // false
2️⃣
[] == ![] // true
مقایسه یک آرایه خالی []
با یک boolean
ارزش ایجاد شده با نفی (با استفاده از !
عملگر) یک آرایه غیر خالی []
. نتیجه این مقایسه است true
، که ممکن است در نگاه اول غیرمنتظره به نظر برسد..
در JS، هر مقدار می تواند یکی باشد true
یا false
در یک boolean
متن نوشته. یک آرایه خالی یک مقدار حقیقت است، به این معنی که در نظر گرفته شده است true
در یک boolean
متن نوشته. هنگامی که ما را اعمال می کنیم !
اپراتور به آن تبدیل شده است false
.
از طرف دیگر، boolean
مقدار ایجاد شده با نفی یک آرایه غیر خالی است false
. وقتی یک آرایه خالی (درست) را با a مقایسه می کنیم false
مقدار (نادرست) با استفاده از ==
عملگر، JS محدودیت نوع را انجام می دهد به این معنی که سعی می کند قبل از مقایسه مقادیر را به یک نوع معمولی تبدیل کند. بنابراین، آرایه خالی به تبدیل می شود false
که منجر به بودن هر دو طرف می شود false
. در پایان، مقایسه برمی گردد true
.
کاوش بیشتر:
['a', 'b'] !== ['a', 'b'] // true
['a', 'b'] == ['a', 'b'] // false
[1, 2] + [3, 4] // "1,23,4"
3️⃣
null == undefined // true
دو برابر است ==
عملگر برای مقایسه دو مقدار برای برابری استفاده می شود، در حالی که نوع داده آنها را نادیده می گیرد. هنگام مقایسه مقادیر null
و undefined
با استفاده از عملگر دو برابر مساوی در نظر گرفته شده و نتیجه مقایسه خواهد بود true
. این به این دلیل است که هر دو null
و undefined
نشان دهنده فقدان یک ارزش هستند و در این زمینه بسیار با یکدیگر معادل هستند.
با اپراتور برابری دقیق:
null === undefined // false
4️⃣
typeof NaN // number
typeof null // object
در JS، typeof عملگری است که برای تعیین نوع یک مقدار یا متغیر استفاده می شود.
NaN مخفف یک عدد نیست و یک مقدار ویژه در JS است که نشان دهنده an است undefined
یا unrepresentable
مقدار عددی
وقتی استفاده می کنید typeof
با NaN
، باز می گردد number
. این ممکن است عجیب به نظر برسد اما به این دلیل است NaN
از نظر فنی یک نوع داده عددی در JS است حتی اگر چیزی را نشان دهد که در واقع یک عدد نیست.
چه زمانی typeof
اعمال می شود null
، رشته را برمی گرداند object
. این بخاطر این است که null
به عنوان یک مقدار ویژه در نظر گرفته می شود که یک مرجع شی خالی را نشان می دهد. null
خود یک شی نیست بلکه یک مقدار اولیه است. این امر در طراحی زبان JS یک چیز عجیب و غریب یا عجیب در نظر گرفته می شود.
کاوش بیشتر:
typeof function(){} // "function"
null instanceof Object // false
5️⃣
true == "1" // true
false == "0" // true
JS رشته را تبدیل می کند 1
به boolean
ارزش true
و رشته 0
به false
زیرا هر رشته غیر خالی در نظر گرفته می شود صداقت و در طرف دیگر تقلبی. بنابراین، مقایسه می شود true == true
که هست true
و false == false
که هست true
.
کاوش بیشتر:
1 + true // 2
1 - true // 0
'' == false // true
0 == false // true
true + false // 1
6️⃣
"1" + 1 // "11"
2 + "2" // "22"
"5" - 3 // 2
وقتی از عملگر + با a استفاده می کنید string
و الف number
، عدد به یک رشته تبدیل شده و به رشته الحاق می شود.
اگر string
را می توان به صورت a تجزیه کرد number
، آن را کم می کند number
از string
.
بنابراین،"1" + 1
رشته می شود "11"
2 + "2"
رشته می شود "22"
"5" - 3
به عدد تبدیل می شود 2
کاوش بیشتر:
+"1" // 1
-"1" // -1
+true // 1
-true // -1
+false // 0
-false // -0
+null // 0
+undefined // NaN
1 / "2" // 0.5
"2" / 1 // 2
1 / 0 // Infinity
-1 / 0 // -Infinity
3 * "abc" // NaN
true > false // true
undefined + 1 // NaN
undefined - 1 // NaN
undefined - undefined // NaN
undefined + undefined // NaN
null + 1 // 1
null - 1 // -1
null - null // 0
null + null // 0
Infinity + 1 // Infinity
Infinity - 1 // Infinity
Infinity - Infinity // NaN
Infinity + Infinity // Infinity
Infinity / Infinity // NaN
7️⃣
"b" + "a" + + "a" + "a" // "baNaNa"
رشته را به هم متصل می کند b
، رشته a
، رشته حاصل از عبارت +"a"
و رشته a
.
+"a"
به زور رشته a
به عددی که به آن ارزیابی می شود NaN
(عدد نیست) زیرا a
عدد معتبری نیست
وقتی به هم می پیوندیم b
، a
، NaN
(به عنوان یک رشته خالی نمایش داده می شود) و a
، رشته را می گیریم baNaNa
.
8️⃣
!{} // false
{} == !{} // false
{} == {} // false
وقتی، یک شی خالی را مقایسه می کنیم {}
به یک شی خالی نفی شده !{}
. علامت تعجب !
یک عملگر منطقی است که مقدار شی را نفی می کند !{}
برمی گرداند false
از آنجایی که یک شی در JS صدق در نظر گرفته می شود. ما در واقع داریم مقایسه می کنیم {}
به false
که منجر به الف false
ارزش، زیرا از نظر مقدار یا نوع داده برابر نیستند.
در آخرین عبارت، دو شی خالی را با هم مقایسه می کنیم {}
. با وجود این واقعیت که ممکن است به نظر یکسان باشند، آنها دو شی مجزا با ارجاعات مجزا در حافظه هستند، بنابراین از نظر مقدار یا نوع داده برابر نیستند. در پایان مقایسه نیز منجر به a false
ارزش.
وقتی از اپراتور پلاس + بین دو جسم پیچیده شده در پرانتزهای مجعد {}
، سعی می کند اشیاء را به صورت رشته ای به هم متصل کند.
کاوش بیشتر:
{} + [] === "" // false
!!{} // true
!![] // true
[] + [] // ""
[] + {} // "[object Object]"
{} + [] // "[object Object]"
{} + {} // "[object Object][object Object]"
[] == false // true
!!'' // false
!!0 // false
!!null // false
!!undefined // false
9️⃣
7 > 6 > 5 // false
اولین، 7 > 6
ارزیابی می کند true
زیرا 7 بزرگتر از 6 است.
بعد، true > 5
ارزیابی می شود. در JS، true
نیرو وارد عدد است 1
و false
به زور وارد می شود 0
. بنابراین 1 > 5
است false
، از آنجا که 1
بزرگتر از 5
.
بنابراین در پایان، 7 > 6 > 5
برابر است با true > 5
که هست false
.
کاوش بیشتر:
5 < 6 < 7 // true
0 > null // false
1️⃣0️⃣
Math.max() // -Infinity
Math.min() // Infinity
Math.max()
& Math.min()
توابعی هستند که می توان از آنها برای یافتن بزرگترین و کوچکترین مقادیر در مجموعه ای از اعداد استفاده کرد.
وقتی بدون هیچ استدلالی فراخوانی می شود، Math.max()
برمی گرداند -Infinity
که نشان دهنده کوچکترین ممکن است number
در JS، از طرف دیگر، Math.min()
برمی گرداند Infinity
که نشان دهنده بزرگترین ممکن است number
در JS
این رفتار منطقی است زیرا اگر عددی ارائه نشده باشد، بزرگترین عددی برای بازگشت وجود ندارد Math.max()
و به همین ترتیب، کوچکترین عددی برای بازگشت وجود ندارد Math.min()
1️⃣1️⃣
parseInt('08') // 8
parseInt('08', 10) // 8
parseInt('0x10') // 16
parseInt('08')
رشته را تبدیل می کند 08
به عدد صحیح 8
. اگر قرار بود بنویسی parseInt('08', 10)
، عملکرد همچنان باز خواهد گشت 8
.
دلیل این امر این است که پارامتر دوم از parseInt
تابع ریشه ای است که سیستم شماره گذاری مورد استفاده را مشخص می کند. بیایید بگوییم: binary
، octal
، decimal
، hexadecimal
و غیره. اگر ریشه مشخص نشده باشد parseInt
سعی خواهد کرد ریشه را بر اساس قالب رشته تشخیص دهد. در مورد فوق، 08
یک عدد اکتالی در نظر گرفته می شود زیرا با آن شروع می شود 0
بنابراین تبدیل به 8
به عنوان یک عدد اعشاری
parseInt('0x10')
را تبدیل می کند hexadecimal
رشته 0x10
به عدد صحیح 16
. ریشه نیز مشخص نشده است، اما پیشوند 0x
نشان می دهد که عدد باید به عنوان یک در نظر گرفته شود hexadecimal
عدد تا تبدیل به عدد شود 16
به عنوان یک عدد اعشاری
کاوش بیشتر:
parseFloat('3.14.15') // 3.14
parseFloat('0.0') // 0
1️⃣2️⃣
(function(x) { delete x; return x; })(1); // 1
یک تابع ناشناس که یک آرگومان می گیرد x
. در داخل تابع سعی می کند تا را حذف کند x
متغیری که امکان پذیر نیست زیرا x
یک آرگومان تابع است و نمی توان آن را حذف کرد. سپس تابع مقدار را برمی گرداند x
.
وقتی این تابع با آرگومان فراخوانی شود 1
، ارزش x
در داخل تابع تنظیم شده است 1
. در این حالت، عملیات حذف هیچ تاثیری ندارد، تابع به سادگی مقدار را برمی گرداند x
که هست 1
کار عالی برای کاوش و درک این مفاهیم جاوا اسکریپت!!! این دانش قطعا در مصاحبه ها به شما کمک می کند و شما را قادر می سازد تا مهارت های نامزدهای بالقوه را به عنوان مصاحبه گر ارزیابی کنید. به کار خوب خود ادامه دهید و به یادگیری چیزی ادامه دهید Ctrl+N
❤ انگیزه:
🍀حمایت کنید
لطفا با عضویت در کانال ما را دنبال کنید و از ما حمایت کنید. حمایت شما بسیار قابل قدردانی است و به ما کمک می کند تا به تولید محتوا برای لذت بردن شما ادامه دهیم. از شما برای پیشبرد حمایتتان سپاسگزاریم!
یوتیوب
GitHub
توییتر