بهترین تمرینات

از ویکی‌کد، دانشنامهٔ برنامه‌نویسی
پرش به ناوبری پرش به جستجو

از استفادهٔ متغیرهای کلی (Global)، استفاده از new، استفاده از == و متد eval() پرهیز کنید. [۱]

از استفادهٔ متغیرهای کلی (Global) جلوگیری کنید

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

این امر شامل تمامی نوع داده‌ها، اشیاء و توابع می‌شود.

متغیرها و توابع‌های کلی می‌توانند توسط سایر اسکریپت‌ها بازنویسی شوند.

از متغیرهای محلی به جای متغیرهای کلی استفاده کنید و یاد بگیرید که چگونه از closureها یا Scopeهای مختلف استفاده کنید.

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

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

متغیرهای محلی را می‌بایست با کلمه کلیدی var یا let تعریف کرد، در غیراینصورت آنها به عنوان متغیرهای کلی در نظر گرفته خواهند شد.

حالت سخت‌گیرانه اجازه استفاده از متغیرهای تعریف نشده را نمی‌دهد.

قرار دادن تعریف‌ها در بالای اسکریپت یا تابع

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

این امر موجب:

  • کدنویسی تمیزتر.
  • فراهم سازی یک محل برای راحت تر پیدا کردن متغیرهای محلی.
  • ساده ترشدن جلوگیری از ایجاد متغیرهای کلی ناخواسته.
  • کاهش امکان از دوباره تعریف شدن‌های ناخواسته.
 1// Declare at the beginning
 2var firstName, lastName, price, discount, fullPrice;
 3
 4// Use later
 5firstName = "John";
 6lastName = "Doe";
 7
 8price = 19.90;
 9discount = 0.10;
10
11fullPrice = price * 100 / discount;

این امر همچنین برای متغیرهای حلقه‌ها نیز صدق می‌کند:

1// Declare at the beginning
2var i;
3
4// Use later
5for (i = 0; i < 5; i++) {

به صورت پیشفرض، جاوا اسکریپت تمامی تعاریف را به بالای صفحه منتقل می‌کند. (ویژگی Hoisting در جاوا اسکریپت)

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

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

این امر موجب:

  • کدنویسی تمیزتر
  • فراهم سازی یک محل برای مقداردهی اولیه متغیرها
  • جلوگیری از مقادیر undefined
1// Declare and initiate at the beginning
2var firstName = "",
3lastName = "",
4price = 0,
5discount = 0,
6fullPrice = 0,
7myArray = [],
8myObject = {};
مقداردهی اولیه متغیرها موجب استفاده دقیق از نوع و داده مورد نظر می‌شود.

هرگز اعداد، رشته های متنی، مقادیر بولین یا منطقی را به صورت شیء تعریف نکنید

همیشه اعداد، رشته‌های متنی یا مقادیر منطقی را به صورت داده‌های primitive بشناسید نه به صورت یک شی.

تعریف این نوع داده‌ها موجب کاهش سرعت اجرای کد شده و ممکن است آثار ناخواسته ای داشته باشد:

مثال

1var x = "John";             
2var y = new String("John");
3(x === y) // is false because x is a string and y is an object.


مشاهدهٔ نتیجه


و این امر می‌تواند بدترهم باشد:

مثال

1var x = new String("John");             
2var y = new String("John");
3(x == y) // is false because you cannot compare objects.


مشاهدهٔ نتیجه


از new Object() استفاده نکنید

  • از { } به جای new Object() استفاده کنید
  • از " " به جای new String() استفاده کنید
  • از 0 به جای new Number() استفاده کنید
  • از false به جای new Boolean() استفاده کنید
  • از به جای new Array() استفاده کنید
  • از /( )/ به جای new RegExp() استفاده کنید
  • از function (){} به جای new Function() استفاده کنید

مثال

1var x1 = {};           // new object
2var x2 = "";           // new primitive string
3var x3 = 0;            // new primitive number
4var x4 = false;        // new primitive boolean
5var x5 = [];           // new array object
6var x6 = /()/;         // new regexp object
7var x7 = function(){}; // new function object


مشاهدهٔ نتیجه


از تبدیل داده های خودکار، اطلاع داشته باشید

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

جاوا اسکریپت آزادانه طراحی شده‌است. یک متغیر می‌تواند نوع داده‌های مختلفی را شامل شود و یک متغیر می‌تواند نوع داده آن را عوض کند:

مثال

1var x = "Hello";     // typeof x is a string
2x = 5;               // changes typeof x to a number


مشاهدهٔ نتیجه


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

مثال

1var x = 5 + 7;       // x.valueOf() is 12,  typeof x is a number
2var x = 5 + "7";     // x.valueOf() is 57,  typeof x is a string
3var x = "5" + 7;     // x.valueOf() is 57,  typeof x is a string
4var x = 5 - 7;       // x.valueOf() is -2,  typeof x is a number
5var x = 5 - "7";     // x.valueOf() is -2,  typeof x is a number
6var x = "5" - 7;     // x.valueOf() is -2,  typeof x is a number
7var x = 5 - "x";     // x.valueOf() is NaN, typeof x is a number


مشاهدهٔ نتیجه


تفریق یک رشته از یک رشته دیگر موجب بروز خطا نمی‌شود اما مقدار NaN یا (یک عدد نیست) را برمی‌گرداند:

مثال

"Hello" - "Dolly"    // returns NaN


مشاهدهٔ نتیجه


استفاده از عملگر مقایسه ای ===

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

عملگر === بررسی برابری مقدار و نوع را با یک دیگر و به صورت همزمان انجام می‌دهد:

مثال

10 == "";        // true
21 == "1";       // true
31 == true;      // true
4
50 === "";       // false
61 === "1";      // false
71 === true;     // false


مشاهدهٔ نتیجه


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

اگر یک تابع با آرگومان یا پارامتر فراموش شده فراخوانی شود، مقدار پارامتر فراموش شده برابر با undefined می‌شود.

مقادیر undefined می‌توانند کدهای شما را خراب کنند. عادت خوبی است که برای آرگومان‌ها مقدار پیش‌فرض در نظر بگیرید.

مثال

1function myFunction(x, y) {
2  if (y === undefined) {
3    y = 0;
4  }
5}


مشاهدهٔ نتیجه


نسخه ECMAScript 2015 جاوا اسکریپت اجازه استفاده از مقدار پیشفرض برای آرگومان تابع را در هنگام فراخوانی آن می‌دهد:

function (a=1, b=1) { /*function code*/ }

می‌توانید مطالب بیشتری را در مورد پارامترها و آرگومان‌های تابع در فصل پارامترهای تابع بخوانید.

دستورات Switch خود را با بلاک Default پایان دهید

همیشه دستورات switch خود را با بلاک default به پایان ببرید. حتی اگر فکر می‌کنید که نیازی به آن نیست.

مثال

 1switch (new Date().getDay()) {
 2  case 0:
 3    day = "Sunday";
 4    break;
 5  case 1:
 6    day = "Monday";
 7    break;
 8  case 2:
 9    day = "Tuesday";
10    break;
11  case 3:
12    day = "Wednesday";
13    break;
14  case 4:
15    day = "Thursday";
16    break;
17  case 5:
18    day = "Friday";
19    break;
20  case 6:
21    day = "Saturday";
22    break;
23  default:
24    day = "Unknown";
25}


مشاهدهٔ نتیجه


از استفادهٔ تابع Avoid() جلوگیری کنید

متد eval() معمولاً برای اجرای متن‌ها به صورت کد استفاده می‌شود. معمولاً در تمامی موارد، ضرورتی برای استفاده از آن وجود ندارد.

چرا که این متد اجازه می‌دهد کد به صورت خودسرانه اجرا شود و همچنین این تابع مشکل امنیتی نیز دارد.


منابع آموزشی