دراين فصل در باره اشتباهات عمومي كه در جاوااسكريپت بوجود مي آيد بحث ميشود.
برنامه نويسان جاوااسكريپت ممكن است يك نتيجه نا خواسته اي را در اثر استفاده ازعملگر =بجاي == در دستور if
ايجاد نمايند.
به دومثال زير توجه نمائيد.
مثال ـ استفاده درست عملگر== در دستور if
let x = 0;
if (x == 10) //resuls false
مثال ـ استفاده نادرست واتفاقي= در دستور if
let x = 0;
if (x = 10) // result true
اين نوع شرط تساوي در ديگر زبانهاي برنامه نويسي وجود دارد، بهمين خاطر اگر تجربه برنامه نويسي ديگر زبانها را داشته باشي اين اشتباه ناخواسته در جاوااسكريپت اتفاق مي افتد.
مثال ـ نتيجه در اين مثالfalse است در صورتيكه انتظار اين است كه true باشد .
let x = 0;
if (x = 0)
يك انتساب هميشه مقداري انتسابي را برگشت ميدهد .بعنوان مثال(x=10) مقدار 10را برگشت ميدهد .وبراي دستور if نتيجه true است .اما (x=0) مقدارصفر برگشت ميدهد كه برايif نتيجهfalse است.
در مقايسه معمولي(==) نوع داده موضوع مهمي نيست وناديده گرفته ميشود .در مثال زير نتيجه مقايسهtrue است
مثال ـ نتيجه درست است
let x = 10;
let y = "10";
if (x == y)
اما در مقايسه كاملا مساوي(===) نوع داده توجه ميشود، ويكي از شرايط تساوي يكي بودن نوع داده است.
مثال ـ مقايسه كامل نتيجه نادرست استfalse
let x = 10;
let y = "10";
if (x === y)
يك اشتباه عمومي كه جود دارد فراموشي رعايت نوع داده درswitch و caseآن است . در اين مورد مقايسه كامل انجام ميگيرد.
مثال ـ در مثال زيرcase switch دستورمربوط بهcase 10 انجام ميشود.
let x = 10; switch(x) { case 10: document.getElementById("demo").innerHTML = "Hello"; }
مثال ـ اما در مثال زير دستور مربوط بهcase اجرا نميشود وكلمه hello نمايش نمي شود.
let x = 10; switch(x) { case "10": document.getElementById("demo").innerHTML = "Hello"; }
جمع كردن درمورد اعداد بوده والحاق كردن براي رشته هاست .در جاوااسكريپت اين دو عمل با يك عملگر+ انجام ميشود . بيشتر زبانهاي برنامه نويسي براي اين دوعمل، دوعملگر مختلف دارند.
مثال ـ نمونه جمع والحاق
let x = 10; x = 10 + 5; // Now x is 15 let y = 10; y += "5"; // Now y is "105"
هنگاميكه دو متغير با هم جمع ميشوند، پيش بيني نتيجه دشوار است.
let x = 10; let y = 5; let z = x + y; // Now z is 15 let x = 10; let y = "5"; let z = x + y; // Now z is "105"
همه نوع اعداد در جاوااسكريپت در64بيت ذحيره ميشوند .به آنFloating Point Number ياfloats ميگويند .
همه زبانهاي برنامه نويسي ازجمله جاوااسكريپت با مقاديراعداداعشاري مشكل دارند.
مثال ـ نمونه مشكلات
let x = 0.1; let y = 0.2; let z = x + y // the result in z will not be 0.3
براي حل مورد فوق ميتوان با افزودن عمل ضرب وتقيسم مورد برطرف ميشود.
let z = (x * 10 + y * 10) / 10; // z will be 0.3
اما اين راهي براي مشكل كلي نيست وبايد اختلاف ناچيز رادراكثر موارد پذيرفت.
در جاوااسكريپت ميتوان يك دستور را در در دوخط نوشت.
مثال 1 ـ نمونه دستور در دو خط
let x = "Hello World!";
اما شكستن دستور دروسط يك رشته قابل قبول نبوده و دستور كارنميكند.
مثال 2 ـ شكستن دستور در ميانه رشته
let x = "Hello World!";
براي شكستن دستور در ميانه رشته بايد از بك اسلش(\) استفاده كرد .
مثال 3 ـ شكستن دستور در رشته با بك اسلش
let x = "Hello \ World!";
بدليل قرار دادن سميكالن نابجا بلوك مثال زير بدون شرط يا بدون توجه به مقدارx اجرا ميگردد .
if (x == 19);
{
// code block
}
بدليل رفتار پيش فرض جاوااسكربپت براي بستن دستور در انتهاي خط دو مثال زير نتايج مشابهي دارند .اليته با توجه به شكستنreturn
مثال1
function myFunction(a) { let power = 10 return a * power }
مثال2
function myFunction(a) { let power = 10; return a * power; }
جاوااسكريپت اجازه ميدهد كه دستور در دوخط طبق شرايطي شكسته شود .بهمين دليل مثال شماره3 با دو مثال قبلي مشابهند.
مثال3
function myFunction(a) { let power = 10; return a * power; }
اما ، چه اتفاقي مي افتد هنگاميكه دستور برگشت مطابق مثال4 در دو خط نوشته مي شود.
مثال 4 ـ دستور برگشت در دو خط
function myFunction(a) { let power = 10; return a * power; }
در اين حالت برگشتي تابعundefined است، و جاوااسكريپت خط دوم را ادامهreturn در نظر نمي گيرد . مطابق مثال 5 عمل ميكند.
مثال5
function myFunction(a) { let power = 10; return; a * power; }
اگر دستوري مشابه دستور زير كامل نباشد:
let
جاوااسكريپت با خواندن خط بعدي تلاش ميكند كه آنرا كامل نمايد .خط بعدي در زير:
power = 10;
اما از آنجائيكه اين دستور كامل است:
return
جاوااسكريپت آنرا بصورت اتوماتيك مطابق زير مي بندد:
return;
به اين دليل اين اتفاق مي افتد، كه بستن دستورات با سميكالن در جاوااسكريپت اختياريست.
جاوااسكريپت چون دستورreturn در يك خط كامل است آنرا با سميكالن بصورت خودكار مي بندد .
هرگز دستورreturn را نشكنيد .
بسياري از زبانهاي برنامه نويسي آرايه هاي انديس نامي را پشتيباني ميكنند .اين آرايه ها بنام آرايه انجمني ياhashes شناخته ميشوند . اما آنها در جاوااسكريپت پشتيباني نميشوند.
در جاوااسكريپت آرايه ها داراي انديس شماره اي يا عددي استفاده ميشود.
مثال ـ آرايه جاوااسكريپت
const person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
person.length; // person.length will return 3
person[0];
در جاوااسكريپت اشياء از انديس نامي استفاده مي نمايند .اگر براي آرايه بخواهيد از انديس هاي نامي استفاده نمائيد، بايد آرايه به شئ استاندارد دو باره تعريف گردد.
اما بعدااز تعريف مجدد خودكار، متدها و ويژگي هاي آرايه نتايج نامشخص ونادرستي ايجاد ميكنند:
مثال ـ آرايه با تعريف مجدد.
const person = []; person["firstName"] = "John"; person["lastName"] = "Doe"; person["age"] = 46; person.length; // person.length will return 0 person[0]; // person[0] will return undefined
كاماهاي انتهائي در تعريف شئ وآرايه درECMAScript 5 قانوني هستند .
مثال ـ شئ
person = {firstName:"John", lastName:"Doe", age:46,}
مثال ـ آرايه
points = [40, 100, 1, 5, 25, 10,];
هشدار ـ اينترنت اكسپلورر 8 سقوط خواهد كرد.
جيسون اجازه كاماهاي انتهائي را نميدهد.
داده هاي جيسون:
person = {"firstName":"John", "lastName":"Doe", "age":46}
points = [40, 100, 1, 5, 25, 10];
اشيا جاوااسكريپت ، متغيرها، ويژگي ها و متدها ميتوانندundefined باشند.
بعلاوه اشياء تهي جاوااسكريپت ميتوانندnull باشند.
ميتوان اگر شئي وجود داشته باشد نوع آن را باundefined مقايسه كرد . مطابق زير
if (typeof myObj === "undefined")
اما نميتوان اگر شئيnull باشد، مقايسه كرد .دراين حالت خطائي حاصل ميشود كه شئ undefinded است.
مثال ـ نادرست
if (myObj === null)
براي حل مساله بايد مقايسهnot null و not undefinded برايش انجام شود .
مثال ـ روش نادرست
f (myObj !== null && typeof myObj !== "undefined")
چون بايد اول مقايسهnot undefined وبعد مقايسهnot null باشد.
مثال ـ روش درست
if (typeof myObj !== "undefined" && myObj !== null)