با عرض سلام وادب و احترام به شما همراهان عزیز ، در این بخش میخواهیم به نکاتی درباره ی کد نویسی در جاوا اسکریپت بپردازیم که بسیار مهم است.

روش اجتناب از متغیرهای سراسری

سعی کنید تا حد ممکن استفاده ی خود را از متغیرهای سراسری محدود کنید.

این امر درباره ی نوع داده ها، توابع و اشیا (سراسری) نیز حکم می کند.

متغیرها و توابع سراسری می توانند توسط دیگر اسکریپت ها بازنویسی (overwrite) شوند.

توصیه می کنیم بجای متغیرهای سراسری از متغیرهای محلی استفاده کنید.

کلیه ی متغیرهای تعریف شده در یک تابع باید از نوع محلی باشند.

متغیرهای محلی را باید با استفاده از کلیدواژه ی var اعلان کنید، در غیر این صورت متغیر تعریف شده به عنوان یک متغیر سراسری شناخته می شود.

نکته

در حالت strict mode، جاوا اسکریپت امکان استفاده از متغیرهای اعلان نشده را به برنامه نویس نمی دهد.

درج کلیه ی تعریف ها در بالای scope

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

کد خواناتر و تمیزتری را ارائه می دهد.

متغیرهای محلی را در یک مکان واحد قرار می دهد و جستجو برای آن ها را آسان می سازد.

اجتناب از ایجاد متغیرهای ضمنی سراسری (implied global variable) را آسان تر می سازد.

نیاز به اعلان های مجدد را کاهش می دهد.

‎// Declare at the beginning
var firstName, lastName, price, discount, fullPrice;

‎// Use later
firstName = “John”;
lastName = “Doe”;
price = 19.90;
discount = 0.10;
fullPrice = price * 100 / discount;‎

این امر درباره ی متغیرهای درون حلقه نیز صادق است.

‎// Declare at the beginning

var i;

‎// Use later

for (i = 0; i < 5; i++) {‎

نکته

به صورت پیش فرض جاوا اسکریپت declaration (تعریف متغیرها و غیره ..) را به بالای scope انتقال می دهد.

مقداردهی اولیه ی متغیرها

توصیه می شود همیشه متغیرها را به هنگام اعلان آن ها مقداردهی اولیه کنید.

این کار مزایای زیر را به دنبال دارد.

کدهای خواناتری را ارائه می دهد.

یک مکان واحد برای مقداردهی اولیه ی کلیه ی متغیرها فراهم می کند.

از مقادیر تعریف نشده خودداری کنید.

‎// Declare and initiate at the beginning

var firstName = "",

‎ lastName = "",

‎ price = 0,

‎ discount = 0,

‎ fullPrice = 0,

‎ myArray = [],

‎ myObject = {};‎

مقداردهی اولیه ی متغیر کاربرد و همچنین نوع داده ی درنظر گرفته شده برای آن را مشخص می کند.

هیچگاه عدد، رشته یا متغیر بولی را به عنوان شی اعلان نکنید.

همیشه با اعداد، رشته ها یا متغیرهای بولی به عنوان مقادیر اولیه (primitive values) برخورد کنید و نه شی.

اعلان نوع های (type) بیان شده به عنوان شی باعث می شود سرعت اجرا به صورت قابل توجهی کاهش یابد.

مثال

نمونه یک
?
۱
۲
۳

var x = “John”;
var y = new String(“John”);
(x === y) // is false because x is a string and y is an object.

یا حتی بدتر نمونه ی زیر می باشد.

نمونه دو
?
۱
۲
۳

var x = new String(“John”);
var y = new String(“John”);
(x == y) // is false because you cannot compare objects.

بجای new Object () از {} استفاده کنید.

بجای new String() از ” ” استفاده کنید.

بجای تابع new Number() از ۰ استفاده کنید.

بجای متد new Boolean() از false استفاده کنید.

بجای new Array () از [] استفاده کنید.

به منظور تعریف شی regexp جدید، بجای new RegExp() از /()/ استفاده کنید.

بجای new function() از function (){} استفاده کنید.

مثال

نمونه سه
?
۱
۲
۳
۴
۵
۶
۷

var x1 = {}; // new object
var x2 = “”; // new primitive string
var x3 = 0; // new primitive number
var x4 = false; // new primitive boolean
var x5 = []; // new array object
var x6 = /()/; // new regexp object
var x7 = function(){}; // new function object

توجه داشته باشید که اعداد می توانند به طور خودکار (تصادفی) به رشته یا NaN تبدیل شوند.

جاوا اسکریپت وابستگی شدید به نوع ندارد (loosely typed می باشد). بنابراین یک متغیر می تواند نوع داده های مختلف داشته باشد و همچنین در صورت نیاز نوع داده ی خود را تغییر دهد.

نمونه چهار
?
۱
۲

var x = “Hello”; // typeof x is a string
x = 5; // changes typeof x to a number

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

مثال

نمونه پنج
?
۱
۲
۳
۴
۵
۶
۷

var x = 5 + 7; // x.valueOf() is 12, typeof x is a number
var x = 5 + “7”; // x.valueOf() is 57, typeof x is a string
var x = “5” + 7; // x.valueOf() is 57, typeof x is a string
var x = 5 – 7; // x.valueOf() is -2, typeof x is a number
var x = 5 – “7”; // x.valueOf() is -2, typeof x is a number
var x = “5” – 7; // x.valueOf() is -2, typeof x is a number
var x = 5 – “x”; // x.valueOf() is NaN, typeof x is a number

کسر کردن یک رشته از رشته ی دیگر اگرچه منجر به تولید پیغام خطا نمی شود، اما مقدار NaN برمی گرداند.

‏ ‏
نمونه شش
?
۱

“Hello” – “Dolly” // returns NaN

عملگر === متغیر را هم از نظر نوع و هم از نظر مقدار با هم مقایسه می کند.


نمونه هفت
?
۱
۲
۳
۴
۵
۶
۷

۰ == “”; // true
۱ == “۱”; // true
۱ == true; // true

۰ === “”; // false
۱ === “۱”; // false
۱ === true; // false

از پارامترهای پیش فرض استفاده کنید.

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

مثال

نمونه هشت
?
۱
۲
۳
۴
۵

function myFunction(x, y) {
if (y === undefined) {
y = 0;
}
}

دستورات switch خود را همیشه با default خاتمه دهید.

توصیه می کنیم همیشه دستورات Switch خود را با default پایان دهید، حتی اگر فکر می کنید نیازی به انجام این کار نیست.

نمونه نه
?
۱
۲
۳
۴
۵
۶
۷
۸
۹
۱۰
۱۱
۱۲
۱۳
۱۴
۱۵
۱۶
۱۷
۱۸
۱۹
۲۰
۲۱
۲۲
۲۳
۲۴
۲۵

switch (new Date().getDay()) {
case 0:
day = “Sunday”;
break;
case 1:
day = “Monday”;
break;
case 2:
day = “Tuesday”;
break;
case 3:
day = “Wednesday”;
break;
case 4:
day = “Thursday”;
break;
case 5:
day = “Friday”;
break;
case 6:
day = “Saturday”;
break;
default:
day = “Unknown”;
}

از استفاده از تابع eval () خودداری کنید.

این تابع قادر است گزاره‌های تولید شده در یک رشته در زمان اجرا را، اجرا کند. در بیشتر موارد استفاده از این تابع غیرضروری می باشد، زیرا که این تابع اجازه ی اجرای کدهای اختیاری را می دهد و نیز استفاده از آن ممکن است منجر به ایجاد مشکلات امنیتی شود.