اشکال رایج JavaScript
- صفحه قبلی بهترین практики JS
- صفحه بعدی عملکرد JS
این فصل اشتباهات رایج JavaScript را بررسی میکند.
استفاده ناخواسته از عملگر تخصیص
اگر برنامهنویس در if
در استفاده ناخواسته از عملگر تخصیص در=
)) در عوض عملگر مقایسه استفاده میشود (====
)، برنامههای JavaScript ممکن است نتایج غیرمنتظرهای تولید کنند.
این 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)
تخصیص همیشه مقدار تخصیص شده را برمیگرداند.
این انتظار مقایسه گسترده است
در مقایسه معمولی، نوع دادهها مهم نیست. این if
این دستورالعملها نتیجه میدهند true
:
var x = 10; var y = "10"; if (x == y)
در مقایسه دقیق، نوع دادهها واقعاً مهم است. این if
این دستورالعملها نتیجه میدهند false
:
var x = 10; var y = "10"; if (x === y)
یک اشتباه رایج فراموش کردن استفاده از switch
در این دستورالعملها از مقایسه دقیق استفاده میشود:
این switch
این دستورالعملها پیغامهای اعلانی را نمایش میدهند:
var x = 10; switch(x) { case 10: alert("Hello"); }
این switch
این دستورالعملها پیغامهای اعلانی را نمایش نمیدهند:
var x = 10; switch(x) { case "10": alert("Hello"); }
جمع و پیوند مبهم
جمعبرای اضافه کردناعدادبازگرداند.
پیوند (Concatenation)برای اضافه کردنرشتهبازگرداند.
در JavaScript، هر دو عملیات از یک عملگر مشترک استفاده میکنند +
عملگر.
به همین دلیل، اضافه کردن اعداد به عنوان اعداد، با اضافه کردن اعداد به عنوان رشتهها، نتایج متفاوتی به بار میآورد:
var x = 10 + 5; // نتیجه x 15 است var x = 10 + "5"; // نتیجه x "105" است
اگر دو متغیر به هم اضافه شوند، نتایج پیشبینیناپذیر است:
var x = 10; var y = 5; var z = x + y; // نتیجه z 15 است var x = 10; var y = "5"; var z = x + y; // نتیجه z "105" است
اعداد اعشاری مبهم
اعداد در JavaScript به صورت 64 بیتی ذخیره میشونداعداد اعشاری (Floats)بازگرداند.
همهی زبانهای برنامهنویسی، از جمله JavaScript، مشکلاتی در مدیریت اعداد اعشاری دارند:
متغیر x = 0.1; متغیر y = 0.2; متغیر z = x + y // نتیجه در z 0.3 نخواهد بود
برای حل این مشکل، از عملیات ضرب و تقسیم استفاده کنید:
مثال
متغیر z = (x * 10 + y * 10) / 10; // نتیجه در z 0.3 خواهد بود
ترتیبدهی رشتهی JavaScript را در خطوط مختلف قرار دهید
JavaScript به شما اجازه میدهد که یک ترتیبدهی را به دو خط تقسیم کنید:
مثال 1
متغیر x = "Hello World!";
اما، قرار دادن خطوط مختلف در وسط رشته اشتباه است:
مثال 2
متغیر x = "Hello World!";
اگر باید در یک رشته خطوط مختلف را قرار دهید، باید از خط تیره استفاده کنید:
مثال 3
متغیر x = "Hello ", World!";
نقطه و کامای اشتباه
به دلیل نقطه و کامای اشتباه، این بلوک کد بدون توجه به مقدار x همیشه اجرا خواهد شد:
اگر (x == 19); { // بلوک کد }
ترتیبدهی return را در خطوط مختلف قرار دهید
بسته شدن خودکار ترتیبدهی در پایان خط یک رفتار پیشفرض JavaScript است.
به همین دلیل، دو مثال زیر بازگشت مشابهی دارند:
مثال 1
دستور متغیر قدرت = 10 بازگشت a * قدرت }
مثال 2
دستور متغیر قدرت = 10; بازگشت a * قدرت; }
JavaScript به شما اجازه میدهد که یک ترتیبدهی را به دو خط تقسیم کنید.
به همین دلیل، مثال 3 نیز بازگشت مشابهی خواهد داشت:
مثال 3
دستور متغیر قدرت = 10; بازگشت a * قدرت; }
اما اگر بازگشت
چه اتفاقی میافتد اگر یک ترتیبدهی را به دو خط تقسیم کنیم:
مثال 4
دستور متغیر قدرت = 10; بازگشت a * قدرت; }
این تابع بازگشت undefined
!
چرا؟ زیرا JavaScript فکر میکند که شما میخواهید:
مثال 5
دستور متغیر قدرت = 10; بازگشت; a * قدرت; }
توضیح
اگر یک ترتیبدهی ناقص باشد:
متغیر
JavaScript از طریق خواندن خط بعدی این ترتیبدهی را کامل خواهد کرد:
قدرت = 10;
اما به دلیل اینکه این ترتیبدهی کامل است:
بازگشت
JavaScript به طور خودکار این ترتیبدهی را بسته خواهد کرد:
بازگشت;
این موضوع به این دلیل است که در JavaScript، استفاده از نقطه و کاما برای بسته شدن (پایان) ترتیبدهیها انتخابی است.
JavaScript در پایان خط بسته خواهد شد بازگشت
ترتیبدهی نکنید، زیرا خود آن یک ترتیبدهی کامل است.
بنابراین، هرگز به بازگشت
ترتیبدهی میشود.
با استفاده از شمارهی دسترسی به آرایهها
بسیاری از زبانهای برنامهنویسی از آرایههایی با شمارههای نامگذاری شده پشتیبانی میکنند.
آرایههایی با شمارههای نامگذاری شده به عنوان آرایههای مرتبط (یا هش) شناخته میشوند.
JavaScript پشتیبانی نمیشودآرایههایی با شمارههای نامگذاری شده.
در JavaScript،آرایهاستفاده میشودشمارههای عددی:
مثال
var person = []; person[0] = "Bill"; person[1] = "Gates"; person[2] = 46; var x = person.length; // person.length به 3 برمیگردد var y = person[0]; // person[0] به "Bill" برمیگردد
در JavaScript،اشیاءاستفاده میشودشمارههای نامگذاری شدهبازگرداند.
اگر از شمارههای نامگذاری شده استفاده کنید، JavaScript آرایه را به یک اشیاء استاندارد تبدیل میکند.
در حالی که در حال بازتعریف خودکار هستند، روشها یا ویژگیهای آرایهها نتایج تعریف نشده یا نادرست تولید میکنند:
مثال
var person = []; person["firstName"] = "Bill"; person["lastName"] = "Gates"; person["age"] = 46; var x = person.length; // person.length به 0 برمیگردد var y = person[0]; // person[0] به undefined برمیگردد
از کاما برای پایان تعریف استفاده کنید
کاما در تعریف اشیاء و آرایهها در ECMAScript 5 قانونی است.
مثال رویهای اشیاء:
person = {firstName:"Bill", lastName:"Gates", age:62,};
مثال رویهای آرایه:
points = [35, 450, 2, 7, 30, 16,];
اخطار!!
Internet Explorer 8 میتواند از کار بیفتد.
JSON اجازه نمیدهد که کاما در انتهای خط وجود داشته باشد.
JSON:
person = {firstName:"Bill", lastName:"Gates", age:62};
JSON:
points = [35, 450, 2, 7, 30, 16];
Undefined نه Null است
اشیاء JavaScript، متغیرها، ویژگیها و روشها میتوانند تعریف نشده باشند.
به علاوه، مقادیر اشیاء JavaScript خالی میتواند null
بازگرداند.
این ممکن است باعث شود که بررسی اینکه آیا اشیاء خالی هستند کمی دشوار شود.
میتوانید نوع بررسی کنید که آیا نوع آن undefined
،آیا اشیاء موجود هستند را آزمایش میکنیم:
مثال
اگر (typeof myObj === "undefined")
اما شما نمیتوانید بررسی کنید که آیا شیء null
است، زیرا اگر شیء تعریف نشده باشد، خطایی رخ خواهد داد:
نا درست است:
اگر (myObj === null)
برای حل این مشکل، باید بررسی کنید که آیا شیء null
، نه undefined.
اما این همچنان باعث خطا خواهد شد:
نا درست است:
اگر (myObj !== null && typeof myObj !== "undefined")
بنابراین، قبل از اینکه غیر از null بررسی کنید، باید ابتدا بررسی کنید که آیا تعریف نشده است:
درست است:
اگر (typeof myObj !== "undefined" && myObj !== null)
به محدوده بلوکی امیدوار باشد
JavaScript نخواهدیک محدوده جدید برای هر بلوک کد ایجاد میکند.
در بسیاری از زبانهای برنامهنویسی اینگونه است، اما JavaScript اما اینطور نیستبازگرداند.
این کد به نظر میرسد که باید undefined
، یک خطای رایج در توسعهدهندگان جدید JavaScript است:
مثال
برای (تنوع i = 0; i < 10; i++) { // بلوک کد } بازگشت i;
- صفحه قبلی بهترین практики JS
- صفحه بعدی عملکرد JS