۷ نکته جالب درباره جاوا اسکریپت که شاید نمیدانستید!
تا به حال به مثلث برمودا فکر کردهاید؟ یا به باغهای معلق در بابل؟ به نیایشگاه آرتمیس چطور؟ در جهان عجایب زیادی وجود دارد که برای برخی از آنها دلایلی منطقی وجود دارد و برای برخی دیگر هیچ دلیل منطقی تا کنون بیان نشده است. در دنیای کامپیوتر و در زبانهای برنامه نویسی نیز عجایبی وجود دارد. شاید هم عجایب نیستند بلکه مسائلی هستند که تا به حال توجه ما را به خود جلب نکردهاند. در این مقاله به ۷ نکته جالب درباره جاوا اسکریپت و عجایب و یا مواردی که تا به حال در این زبان به آنها توجه نکردهایم، میپردازیم. پس با ما همراه باشید.
ما یک فایل به نام oddity.js ساختهایم که در آن مرحله به مرحله مواردی که در ادامه میگوییم را چک کنیم. پیشنهاد میکنیم شما نیز چنین فایلی را ایجاد کنید و قدم به قدم با ما پیش بیایید.
همه ما null را به عنوان یک شی میشناسیم که از کلاس Object برگرفته شده است، و هیچ مقداری را درون خودش ندارد. همچنین هرگاه که بخواهیم یک متغیر از یک مرحله به بعد در برنامه دیگر مقداری نداشته باشد، آن متغیر را برابر با null قرار میدهیم. اما آیا واقعا چنین است؟ بیایید این موضوع را بررسی کنیم.
برای اینکار در Editor قطعه کد زیر را وارد میکنیم:
alert(typeof null);
در نتیجه قطعه کد بالا مقدار true، در خروجی بازگردانده میشود و null یک object شناخته میشود. کیورد typeof برای بررسی نوع دادهی یک متغیر مورد استفاده قرار میگیرد.
typeof یک کلمهی ثبت شده یا به اصطلاح یک keyword است که با استفاده از آن میتوانیم نوع دادهی یک متغیر را متوجه شویم. برای مثال در قطعه کد زیر متغیر bool با نوع دادهی boolean تعریف شده است:
var bool=true;
در نتیجه، خروجی قطعه کد زیر، boolean میباشد :
alert(typeof bool);
اگر مایل هستید دربارهی typeof بیشتر بخوانید، پیشنهاد میکنیم این مطلب را مطالعه کنید.
حال میخواهیم با instanceof مسئله را بررسی کنیم:
alert(null instanceof Object);
خروجی دستور بالا در نهایت تعجب، false است!! و این یعنی null برگرفته شده از کلاس Object نیست!! در اینجا چه اتفاقی افتاده است؟ ما نیز چون شما بی اطلاعیم!!
instsnceof یک keyword است و چک میکند که آیا یک شی از یک کلاس گرفته شده است یا خیر. اگر شی از کلاس برگرفته شده باشد پاسخ true در غیر این صورت پاسخ false است. به مثال زیر دقت کنید:
function Car(name,color,year){
this.name=name;
this.color=color;
this.year=year;
}
var BMW=new Car('BMW','blue','2000');
document.write(BMW instanceof Car);
در قطعه کد فوق، کلاس Car را تعریف کردیم و سپس شی BMW را از این کلاس گرفتیم. در خط بعدی با استفاده از instsnceof چک میکنیم که آیا شیBMW از کلاس Car برگرفته شده است یا خیر. خروجی این بررسی true است.
اگر میخواهید دربارهی instsnceof بیشتر بدانید پیشنهاد میکنیم این مطلب را مطالعه کنید.
NaN کوتاه شدهی کلمهی Not a Number است. قصد داریم با استفاده از typeof بدانیم نوع دادهای NaN چیست:
alert(typeof NaN);
خروجی قطعه کد فوق Number است و این یعنی NaN یک عدد است. همانطور که میدانیم هر عدد با خودش برابر است. حال بیایید بررسی کنیم آیا NaN با خودش برابر است یا خیر :
alert(NaN===NaN);
خروجی قطعه کد بالا false است!! و این یک تناقض دیگر در جاوا اسکریپت است!!
علاوه بر اینها مقادیر NaN+ و NaN- نیز با خود NaN برابر هستند. به قطعه کد زیر دقت کنید:
var pNaN=+NaN; var negNaN=-NaN;
alert(pNaN);
alert(negNaN);
خروجی قطعه کدهای فوق NaN است. حال که هر دو مقدار برابر با NaN است در نتیجه باید +NaN و -NaN نیز با هم برابر باشند. حال این موضوع را بررسی میکنیم. به قطعه کد زیر دقت کنید:
var pNaN=+NaN;
var negNaN=-NaN;
alert(pNaN==negNaN);
خروجی قطعه کد بالا false است و این یعنی با اینکه NaN+و NaN- هر دو در مقدار برابر با NaN هستند ولی با هم برابر نیستند. یعنی مانند این میماند که مقدار دو متغیر a و b را 5 تعریف کرده باشیم ولی این دو با هم برابر نباشند!
در ادامهی مقالهی ۷ نکته جالب درباره جاوا اسکریپت، بررسی میکنیم که در این زبان چند صفر داریم.
در علم ریاضیات میتوان ثابت کرد که صفر، صفر است. همچنین در علم ریاضیات تا به حال دربارهی مثبت یا منفی بودن صفر صحبتی نشده است. حال ما میخواهیم بدانیم این مسئله در جاوا اسکریپت چگونه است؟ آیا در جاوا اسکریپت نیز صفر مثبت و منفی نداریم؟
در جاوا اسکریپت دو صفر میتوانیم تعریف کنیم. یک صفر مثبت و یک صفر منفی. جالب است بدانید هر یک از این صفرها با صفر برابر هستند. به مثال زیر توجه کنید:
var pZero=+0;
var negZero=-0;
alert(pZero);
alert(negZero);
خروجی قطعه کدهای بالا هر دو صفر است. حال بیایید بررسی کنیم آیا این دو با هم برابرند؟ یا نتیجهای که در NaN گرفتهایم تکرار خواهد شد؟ برای این بررسی قطعه کد زیر را در Editor وارد میکنیم:
alert(pZero===negZero);
خروجی قطعه کد فوق true است و این یعنی صفر مثبت و صفر منفی هر دو با هم برابرند. به نظر شما چرا جاوا اسکریپت صفر مثبت و صفر منفی دارد؟ با اینکه هر دو آنها با هم برابرند!
دامنهی اجرای متغیرها یا Scope of Variables محدودهای است که متغیر در آن تعریف شده و قابل دسترسی میباشد. در جاوا اسکریپت متغیرها دارای دو نوع دامنهی تعریف میباشند:
Global : متغیر هایی که دامنهی اجرای آنها به صورت Global است، در هر جایی قابل دسترسی هستند و میشود از آنها در هر جایی از برنامه استفاده کرد.
Local : متغیر هایی که دامنهی اجرای آنها به صورت Local یا محلی هستند، اغلب درون یک تابع تعریف میشوند و محدودهی دسترسی آنها محدود به آن تابع میباشد.
به مثال زیر توجه کنید:
var animal = 'dog';
function getAnimal(adjective) {
alert(adjective+' '+animal);
}
getAnimal('lovely');
در دستور بالا متغیر animal به صورت Global تعریف شده است. بنابراین دامنهی دسترسی آن محدود نیست و میشود در تابع ()getAnimal از آن استفاده کرد. در نتیجه خروجی قطعه کد فوق “lovely dog” است.
تمامی متغیرها و توابعی که تعریف میکنیم در واقع ویژگیها و متدهای کلاس window محسوب میشوند. در نتیجه میتوان با استفاده از کلمهی کلیدی this درون تابع نیز از آنها استفاده کرد. (برای مثال در قطعه کد فوق به جای animal بنویسیم this.animal) حال قصد داریم کاری کنیم که وقتی از this استفاده میکنیم به جای اشاره به کلاس window، به کلاسی که ما تعریف کردهایم اشاره کند و مقدار متغیر animal را از آن دریافت کند. برای اینکار از تابع ()Call به صورت زیر استفاده میکنیم:
var animal = 'dog';
function getAnimal(adjective) { alert(adjective+' '+this.animal); };
var myObj = {animal: 'camel'};
getAnimal.call(myObj , 'lovely');
در قطعه کد بالا تابع، متغیر animal را از کلاس myObj دریافت میکند. در نتیجه، از آنجایی که که مقدار متغیر animal در myObj برابر با camel است خروجی قطعه کد بالا lovely camel میباشد.
همچنین در قطعه کد بالا، به جای تابع ()Call میتوان از تابع ()apply نیز استفاده کرد. در این صورت کد به صورت زیر نوشته میشود:
var animal = 'dog';
function getAnimal(adjective) {
alert(adjective+' '+this.animal);
}
var myObj = {animal: 'camel'};
getAnimal.apply(myObj, ['lovely']);
تا به حال برای استفاده از توابع در جاوا اسکریپت، ابتدا تابع را تعریف و سپس فراخوانی کردهایم مانند مثال زیر:
function sum(x){
return x+x;
}
alert(sum(5));//output 10
حال میخواهیم به یک نحو جدید تابع تعریف کنیم و با یک روش جدید از تابع استفاده کنیم. به قطعه کد زیر دقت کنید:
var sum= new Function('x', 'return x + x');
در قطعه کد بالا در واقع یک شی با نام sum را از کلاس Function تعریف کردیم. همچنین مقادیر x و return x+x را به عنوان آرگومان به Function دادهایم. و در خط دوم برای اینکه محتویات sum را ببینیم با استفاده از تابع ()to.String، آن را تبدیل به رشته کردیم. خروجی قطعه کد فوق به صورت زیر است :
با توجه به خروجی، در دستور فوق با استفاده از new Function، تابعی با نام anonymous میسازیم که آرگومان این تابع، آرگومان اول تابعی است که با new Function ساختهایم و همچنین محتوای تابع تعریفی برابر با آرگومان دوم تابع فوق است.
حال به قطعه کد زیر دقت کنید:
alert(sum(4));
خروجی قطعه کد فوق برابر با 8 است. شیای که از کلاس Function گرفتیم را میتوان این گونه استفاده کرد. به عبارت دیگر نام شی تعریفی در اصل همان نام تابع است که به روش معمول تعریف میکنیم.
در زبان جاوا اسکریپت توابعی وجود دارند که میتوانند خود را صدا بزنند. به طور معمول زمانی که تابعی را تعریف میکنیم مادامی که آن تابع را در بخشی از برنامه فراخوانی نکنیم تابع اجرا نمیشود. در واقع اجرای تابع بستگی به فراخوانی و استفادهی ما از آن تابع دارد. به قطعه کد زیر دقت کنید :
(function(){
document.write("7learn");
})();
قطعه کد فوق یک تابع خود صدازننده یا self-executing functions (ترجمه تحت اللفظی: توابع خود اجرا کننده) است. در جاوا اسکریپت برای موارد متعددی از این توابع استفاده میشود. برای تعریف تابع خود صدا زننده کافی است، تابع را درون یک پرانتز گذاشته و در آخر () را اضافه کنیم. برای آشنایی بیشتر با این توابع پیشنهاد میکنیم این مطلب را مطالعه کنید.
در این بخش از مقالهی ۷ نکته جالب درباره جاوا اسکریپت قصد داریم دو روش برای رمز نگاری کدهای خود در جاوا اسکریپت را به شما معرفی کنیم:
در جاوا اسکریپت کتابخانهای به نام CryptoJS وجود دارد که توسط Jeff.Mott.OR نوشته شده است. با استفاده این کتابخانه میتوانید کدهای خود را با چند الگوریتم از جمله: MD5, SHA-1, SHA-2, SHA-3, HMAC, PBKDF2, AES, TripleDES, Rabbit, RC4 رمز گذاری کنید.
برای آشنایی بیشتر با این کتابخانه توصیه میکنیم این مطلب را مطالعه کنید.
وب سایتjavascriptobfuscator امکانی را در اختیار شما قرار میدهد که شما بتوانید به راحتی کدی را که به زبان جاوا اسکریپت نوشتهاید رمزگذاری کنید.
برای اینکار، وارد سایت میشویم:
یکی از دو گزینهی، یعنی Download App یا Online Obfuscator را انتخاب میکنیم:
اگر Download App را انتخاب کردیم، وارد صفحهی زیر میشویم:
در سایت ثبت نام میکنیم و وارد صفحهی زیر میشویم. سپس بر روی API Keys مانند شکل کلیک میکنیم:
حال یکی از Appها را دانلود میکنیم. سپس این API Key را در نرم افزار میدهیم تا آمادهی کار شود.
اگر Online Obfuscator را انتخاب کنیم، وارد صفحهی زیر میشویم:
درتصویر بالا یک گزینهی Choose File وجود دارد که با استفاده از آن فایل جاوا اسکریپت خود را بارگذاری میکنیم و یا کدها را مانند نمونه وارد سایت میکنیم. حال روی دکمهی Obfuscator کلیک میکنیم و فایل رمز گذاری شده را، مانند تصویر زیر، دریافت میکنیم:
جمع بندی:
کامپیوتر و تمامی زبانهای برنامه نویسی دارای موارد عجیب و کشف نشدهای هستند. یا شاید مواردی که تا به حال به آنها دقت نکردهایم. در این مقاله به ۷ نکته جالب درباره جاوا اسکریپت اشاره کردیم، شما در جاوا اسکریپت به چه مواردی برخورد کردهاید که برایتان جالب بوده است؟ میتوانید آن موارد را با ما و کاربران سون لرن به اشتراک بگذارید.
اگر به یادگیری بیشتر در زمینه جاوا اسکریپت علاقه داری، با شرکت در دوره آموزشی متخصص جاوا اسکریپت در کمتر از یک سال به یک متخصص JS همه فن حریف تبدیل میشوی که آمادهی استخدام، دریافت پروژه و یا فول-استک شدن هستی.
من یه لغت نامه تخصصی دارم که تبدیلش کردم به یک فایل Json، حالا میخاهم یه اپلیکشن دیکشنری طراحی کنم، از محیطهای IDE موجود اطلاعاتی دارم ولی در محیط اندروید استودیو نتونستم Auto completion code رو درست کنم، ازتون راهنمایی میخاستم یکی اینکه چجوری android studioم رو درست کنم؟ دوم اینکه من که سابقه برنامه نویسی رو ندارم میتونم خودم APK طراحی کنم و یا اینکه زحمتش رو بدم شما؟
برای auto complete در اندروید استودیو، میتونید از منوی بالای صفحه از مسیر File -> Settings -> Editor -> General -> Code Completion چک کنید که آیا این قابلیت فعال هست یا نه. با Ctrl+Space کلید میانبری هست که کد رو کامل میکنه.
نوشتن یک برنامه کامل به زبان جاوا ممکنه براتون یه چالش به حساب بیاد و حداقل سه هفته درگیرتون کنه (بستگی به تلاش خودتون داره و باز بهتر میدونید که میتونید یا نه) اما برنامه دیکشنری یه پروژه نسبتا ساده برای شروع کار هست و ویدیوها و سورس آماده اش تو اینترنت هست. برای مثال: آموزش ساخت دیکشنری با اندروید استودیو
و یه درخواستم داشتم که لطفا از این به بعد سوالاتون رو در زیر پست مرتبط بپرسید. ممنون از این که با ما همراه هستید.