اشتباهات متداول در JavaScript

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

به طور تصادفی با استفاده از اپراتور تخصیص

برنامه های جاوا اسکریپت ممکن است نتایج غیر منتظره ای ایجاد کند اگر یک برنامه نویس به طور تصادفی از اپراتور تخصیص (=)، به جای اپراتور مقایسه (==) در عبارت if استفاده کند.

دستور if نتیجه false را بر می گرداند زیرا x برابر با 10  نیست.

اپراتور
var x = 0;
if (x == 10) 
مشاهده مثال

دستور if نتیجه true را بر می گرداند (شاید نه به عنوان انتظار)، زیرا 10 درست است:

نتیجه true
var x = 0;
if (x = 10)
مشاهده مثال

دستور if نتیجه false را بر می گرداند (شاید نه به عنوان انتظار)، زیرا 0 نادرست است:

نتیجه false
var x = 0;
if (x = 0)
مشاهده مثال

مقایسه

در مقایسه منظم، نوع داده مهم نیست. این عبارت اگر true باشد:

مقایسه
var x = 10;
var y = "10";
if (x == y) 
مشاهده مثال

در مقایسه منظم، نوع داده مهم نیست. این عبارت اگر false باشد:

مقایسه
var x = 10;
var y = "10";
if (x === y) 
مشاهده مثال

اشتباه رایج این است که فراموش کنیم که اظهارات سوئیچ از مقایسه دقیق استفاده می کنند:

پیغام
var x = 10;
switch(x) {
    case 10: alert("Hello");
} 
مشاهده مثال

این سوئیچ مورد هشدار را نمایش نمی دهد:

switch
var x = 10;
switch(x) {
    case "10": alert("Hello");
} 
مشاهده مثال

اختلاط اضافی و تلفیق

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

تلفیق
var x = 10 + 5;          // the result in x is 15
var x = 10 + "5";        // the result in x is "105"
مشاهده مثال

هنگام اضافه کردن دو متغیر، پیش بینی نتایج ممکن است دشوار باشد.

اضافه کردن دو متغییر
var x = 10;
var y = 5;
var z = x + y;           // the result in z is 15

var x = 10;
var y = "5";
var z = x + y;           // the result in z is "105" 
مشاهده مثال

متوجه شدن اشتباهی

تمام اعداد در جاوا اسکریپت به عنوان 64 بیت تعداد اعداد شناور (شناورها) ذخیره می شوند.

تمام زبان های برنامه نویسی، از جمله جاوا اسکریپت، با مقادیر دقیق نقطه شناور مشکل دارند:

متوجه شدن اشتباهی
var x = 0.1;
var y = 0.2;
var z = x + y            // the result in z will not be 0.3 
مشاهده مثال

برای حل مشکل فوق، ضرب و تقسیم کمک می کند.

راه حل
 var z = (x * 10 + y * 10) / 10;       // z will be 0.3 
مشاهده مثال

Break یک رشته جاوا اسکریپت

جاوا اسکریپت به شما اجازه می دهد یک بیانیه را به دو خط تقسیم کنید:

شکستن رشته
var x =
"Hello World!"; 
مشاهده مثال

اما شکستن یک بیانیه در وسط یک رشته کار نخواهد کرد:

شکستن رشته در سط بعدی
var x = "Hello
World!"; 
مشاهده مثال

اگر یک رشته را در یک رشته ی دیگر شکست میدهید باید از یک "backslash" استفاده کنید

backslash در رشته
var x = "Hello \
World!"; 
مشاهده مثال

سمیکالن ناپیوسته

از آنجا که از سمیکالن استفاده می شود، این بلوک صرف نظر از مقدار x اجرا می شود:

Semicolon
if (x == 19);
{
    // code block 
}
مشاهده مثال

شکستن دستور بازگشتی

این یک رفتار پیش فرض جاوا اسکریپت است که بطور خودکار در پایان یک خط به صورت خودکار بسته می شود.

از این جهت، این دو مثال نتیجه مشابهی را به دست می آورند:

مثال 1
function myFunction(a) {
    var power = 10 
    return a * power
}
مشاهده مثال

مثال 2
function myFunction(a) {
    var power = 10;
    return a * power;
}
مشاهده مثال

جاوا اسکریپت نیز به شما امکان می دهد یک بیانیه را به دو خط تقسیم کنید.

به همین دلیل، مثال 3 همان نتایج را نیز به دست می آورد:

مثال 3
function myFunction(a) {
    var
    power = 10; 
    return a * power;
}
مشاهده مثال

اما، اگر بندهای بازگشت را در دو خط مانند این بگذارید، چه اتفاقی خواهد افتاد:

مثال 4
function myFunction(a) {
    var
    power = 10; 
    return
    a * power;
} 
مشاهده مثال

نتیجه تعریف نشده در تابع

مثال 5
function myFunction(a) {
    var
    power = 10; 
    return;
    a * power;
}
مشاهده مثال

توضیح

اگر بیانیه ای ناقص است مانند:

var

جاوا اسکریپت با تکمیل این بیانیه با خواندن خط بعدی تلاش خواهد کرد:

 

power = 10;

اما از آنجا که این بیانیه کامل است:

return

جاوا اسکریپت به طور خودکار آن را مانند کد زیر می بندد:

return;

این اتفاق می افتد زیرا بسته شدن (پایان دادن) اظهارات با semicolon در جاوا اسکریپت اختیاری است.

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

دسترسی به آرایه ها با نام های نامگذاری شده

بسیاری از زبان های برنامه نویسی آرایه ها با شاخص هایی نامیده می شوند.
آرایه های با نام های نامیده می شوند که آرایه های انجمنی نامیده می شوند.
جاوا اسکریپت از آرایه ها با شاخص های نامگذاری پشتیبانی نمی کند.
در جاوا اسکریپت، آرایه ها از شاخص های عددی استفاده می کنند:

آرایه
 var person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
var x = person.length;         // person.length will return 3
var y = person[0];             // person[0] will return "John" 
مشاهده مثال

در جاوا اسکریپت، اشیاء به عنوان شاخص استفاده می شود.

اگر شما از یک index نام استفاده می کنید، هنگام دسترسی به یک آرایه، جاوا اسکریپت آرایه را به شیء استاندارد باز تعریف می کند.

پس از تعریف مجدد خودکار، روش های آرایه و خواص نتیجه های نامشخص یا نادرستی را تولید می کنند:

دسترسی آرایه
var person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
var x = person.length;         // person.length will return 0
var y = person[0];             // person[0] will return undefined
مشاهده مثال

پایان تعاریف با یک کاما

کاما زدن در تعریف شیء و آرایه در ECMAScript 5 قانونی است.

مثال شی:

person = {firstName:"John", lastName:"Doe", age:46,}

مثال آرایه:

points = [40, 100, 1, 5, 25, 10,];

هشدار!
در اینترنت اکسپلورر 8 کار خواهد کرد.
JSON اجازه نمی دهد کاما در کنار هم قرار بگیرد.

مثال json:

person = {firstName:"John", lastName:"Doe", age:46}

مثال json:

points = [40, 100, 1, 5, 25, 10];

تعریف نشده(Undefined) ، Not Null  محسوب می شود

اشیاء جاوا اسکریپت، متغیرها، خواص ها و روش ها می تواند نامشخص باشد.
علاوه بر این، اشیاء جاوا اسکریپت خالی می توانند مقدار صفر باشند.
این می تواند آن را کمی ترسیم کند اگر یک شیء خالی باشد.
شما می توانید امتحان کنید اگر یک شیء با آزمایش وجود داشته باشد اگر نوع تعریف نشده باشد:

تعریف نشده
 if (typeof myObj === "undefined")  
مشاهده مثال

اما شما نمیتوانید تست کنید اگر یک شی از صفر باشد، زیرا اگر یک شیء نامشخص باشد خطایی رخ خواهد داد:

غلط:

if (myObj === null)

برای حل این مشکل، شما باید تست کنید اگر یک شی نه صفر و نه تعریف نشده است.
اما هنوز هم می تواند یک خطا را پر کند:

غلط:

if (myObj !== null && typeof myObj !== "undefined")

به این دلیل، قبل از اینکه بتوانید برای خالی بودن تست کنید، باید بدون تعریف تست کنید:

صحیح
 if (typeof myObj !== "undefined" && myObj !== null)  
مشاهده مثال

 

نظر شما

لطفا نام و نام خانوادگی خود را وارد کنید
لطفا ایمیل خود را وارد کنید لطفا ایمیل صحیح وارد کنید.
لطفا متن نظر خود را وارد کنید
>

یادگیری JavaScript

مقالات و دروس

به خبرنامه مدرسه طراحی وب ایران (وب مهراز) بپیوندید.

لطفا شماره همراه صحیح وارد کنید.
لطفا ایمیل صحیح وارد کنید.

مقالات مرتبط