‎‎اشتباهات عمومي جاوااسكريپتJavaScript Common Mistakes -‎

Previous >    <Next  

‎‎دراين فصل در باره اشتباهات عمومي كه در جاوااسكريپت بوجود مي آيد بحث ميشود.

‎Accidentally Using the Assignment Operator‎

‎‎كاربرد تصادفي عملگرانتساب

‎برنامه نويسان جاوااسكريپت ممكن است يك نتيجه نا خواسته اي را در اثر استفاده ازعملگر ‎=‎‎بجاي ‎==‎ در دستور ‎if

‎‎ايجاد نمايند.

‎‎به دومثال زير توجه نمائيد.

‎‎مثال ـ استفاده درست عملگر‎==‎ در دستور if

let x = 0;
if  (x == 10) //resuls false

--(go to editor for change code and run)

‎‎مثال ـ استفاده نادرست واتفاقي‎=‎ در دستور if

let x = 0;
if  (x = 10) // result true

--(go to editor for change code and run)

‎اين نوع شرط تساوي در ديگر زبانهاي برنامه نويسي وجود دارد، بهمين خاطر اگر تجربه برنامه ‎‎نويسي ديگر زبانها را داشته باشي اين اشتباه ناخواسته در جاوااسكريپت اتفاق مي افتد.

‎‎مثال ـ نتيجه در اين مثالfalse است در صورتيكه انتظار اين است كه true باشد .

let x = 0;
if  (x = 0)

--(go to editor for change code and run)

‎يك انتساب هميشه مقداري انتسابي را برگشت ميدهد .بعنوان مثال‎(x=10)‎ مقدار ‎10‎‎را برگشت ميدهد .وبراي دستور if نتيجه true است .اما ‎(x=0)‎ مقدارصفر ‎برگشت ميدهد كه برايif نتيجهfalse است.

‎‎انتطار مقايسه سستExpecting Loose Comparision -‎

‎در مقايسه معمولي‎(==)‎ نوع داده موضوع مهمي نيست وناديده گرفته ميشود .در مثال ‎زير نتيجه مقايسه‎true‎ است

‎‎مثال ـ نتيجه درست است

let x = 10;
let y = "10";
if  (x == y)

--(go to editor for change code and run)

‎اما در مقايسه كاملا مساوي‎(‎===‎)‎ نوع داده توجه ميشود، ويكي از ‎شرايط تساوي يكي بودن نوع داده است.

‎‎مثال ـ مقايسه كامل نتيجه نادرست است‎false

let x = 10;
let y = "10";
if  (x === y)

--(go to editor for change code and run)

‎يك اشتباه عمومي كه جود دارد فراموشي رعايت نوع داده در‎switch‎ و ‎case‎‎آن است . در اين مورد مقايسه كامل انجام ميگيرد.

‎‎مثال ـ در مثال زير‎case switch‎ دستورمربوط بهcase 10 انجام ميشود.

let x = 10;
switch(x) {
  case 10: document.getElementById("demo").innerHTML = "Hello";
}

--(go to editor for change code and run)

‎‎مثال ـ اما در مثال زير دستور مربوط بهcase اجرا نميشود وكلمه hello نمايش نمي شود.

let x = 10;
switch(x) {
  case "10": document.getElementById("demo").innerHTML = "Hello";
}

--(go to editor for change code and run)

‎‎گيجي در جمع والحاقConfusing Addition and Concatenation -‎

‎جمع كردن درمورد اعداد بوده والحاق كردن براي رشته هاست .در جاوااسكريپت اين دو عمل با يك ‎عملگر‎+‎ انجام ميشود . بيشتر زبانهاي برنامه نويسي براي اين دوعمل، دوعملگر ‎مختلف دارند.

‎‎مثال ـ نمونه جمع والحاق

let x = 10;
x = 10 + 5;       // Now x is 15

let y = 10;
y += "5";        // Now y is "105"

--(go to editor for change code and run)

‎‎هنگاميكه دو متغير با هم جمع ميشوند، پيش بيني نتيجه دشوار است.

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"

--(go to editor for change code and run)

‎‎سوء تفاهم دراعداد شناورMisunderstnding Floats -‎ ا

‎همه نوع اعداد در جاوااسكريپت در‎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

--(go to editor for change code and run)

‎‎براي حل مورد فوق ميتوان با افزودن عمل ضرب وتقيسم مورد برطرف ميشود.

let z = (x * 10 + y * 10) / 10;       // z will be 0.3

--(go to editor for change code and run)

‎‎اما اين راهي براي مشكل كلي نيست وبايد اختلاف ناچيز رادراكثر موارد پذيرفت.

‎‎شكشتن رشته در جاوااسكريپتBreaking a JavaScript String -‎

‎‎در جاوااسكريپت ميتوان يك دستور را در در دوخط نوشت.

‎‎مثال 1 ـ نمونه دستور در دو خط

let x =
"Hello World!";

--(go to editor for change code and run)

‎‎اما شكستن دستور دروسط يك رشته قابل قبول نبوده و دستور كارنميكند.

‎‎مثال 2 ـ شكستن دستور در ميانه رشته

let x = "Hello
World!";

--(go to editor for change code and run)

‎‎براي شكستن دستور در ميانه رشته بايد از بك اسلش‎(\)‎ استفاده كرد .

‎‎مثال 3 ـ شكستن دستور در رشته با بك اسلش

let x = "Hello \
World!";

--(go to editor for change code and run)

‎‎اشتباه در قرار دادن سميكالنMisplacing Semicolon -‎

‎‎بدليل قرار دادن سميكالن نابجا بلوك مثال زير بدون شرط يا بدون توجه به مقدارx اجرا ميگردد .

if  (x == 19);
{
  // code block 
}

--(go to editor for change code and run)

‎‎شكستن يك دستور برگشتBreaking Return Statement -‎

‎بدليل رفتار پيش فرض جاوااسكربپت براي بستن دستور در انتهاي خط دو مثال زير نتايج مشابهي ‎دارند .اليته با توجه به شكستنreturn

‎‎مثال1

function myFunction(a) {
  let power = 10 
  return a * power
}

--(go to editor for change code and run)

‎‎مثال2

function myFunction(a) {
  let power = 10;
  return a * power;
}

--(go to editor for change code and run)

‎جاوااسكريپت اجازه ميدهد كه دستور در دوخط طبق شرايطي شكسته شود .بهمين دليل مثال شماره3 ‎با دو مثال قبلي مشابهند.

‎‎مثال3


function myFunction(a) {
  let
  power = 10; 
  return a * power;
}  

--(go to editor for change code and run)

‎اما ، چه اتفاقي مي افتد هنگاميكه دستور برگشت مطابق مثال‎4‎ در دو خط نوشته ‎مي شود.

‎‎مثال 4 ـ دستور برگشت در دو خط

function myFunction(a) {
  let
  power = 10; 
  return
  a * power;
}

--(go to editor for change code and run)

‎در اين حالت برگشتي تابع‎undefined‎ است، و جاوااسكريپت خط دوم را ‎ادامهreturn در نظر نمي گيرد . مطابق مثال 5 عمل ميكند.

‎‎مثال5

function myFunction(a) {
  let
  power = 10; 
  return;
  a * power;
}

--(go to editor for change code and run)

‎‎توضيحExplanation -‎

‎‎اگر دستوري مشابه دستور زير كامل نباشد:

let

‎‎جاوااسكريپت با خواندن خط بعدي تلاش ميكند كه آنرا كامل نمايد .خط بعدي در زير:

power = 10;

‎‎اما از آنجائيكه اين دستور كامل است:

return

‎‎جاوااسكريپت آنرا بصورت اتوماتيك مطابق زير مي بندد:

return;

‎‎به اين دليل اين اتفاق مي افتد، كه بستن دستورات با سميكالن در جاوااسكريپت اختياريست.

‎‎جاوااسكريپت چون دستورreturn در يك خط كامل است آنرا با سميكالن بصورت خودكار مي بندد .

‎‎هرگز دستورreturn را نشكنيد .

‎Accessing Arrays with Named Indexes‎

‎‎دسترسي به آرايه ها با نام انديس

‎بسياري از زبانهاي برنامه نويسي آرايه هاي انديس نامي را پشتيباني ميكنند .اين آرايه ها بنام ‎آرايه انجمني ياhashes شناخته ميشوند . اما آنها در جاوااسكريپت پشتيباني نميشوند.

‎‎در جاوااسكريپت آرايه ها داراي انديس شماره اي يا عددي استفاده ميشود.

‎‎مثال ـ آرايه جاوااسكريپت

const person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
person.length;       // person.length will return 3
person[0];  

--(go to editor for change code and run)

‎در جاوااسكريپت اشياء از انديس نامي استفاده مي نمايند .اگر براي آرايه بخواهيد از انديس هاي ‎نامي استفاده نمائيد، بايد آرايه به شئ استاندارد دو باره تعريف گردد.

‎‎اما بعدااز تعريف مجدد خودكار، متدها و ويژگي هاي آرايه نتايج نامشخص ونادرستي ايجاد ميكنند:

‎‎مثال ـ آرايه با تعريف مجدد.

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

--(go to editor for change code and run)

‎‎پايان دادن تعاريف با كاماEnding Definitions with a Comma -‎

‎‎كاماهاي انتهائي در تعريف شئ وآرايه در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 is not Null -‎

‎‎اشيا جاوااسكريپت ، متغيرها، ويژگي ها و متدها ميتوانند‎undefined‎ باشند.

‎‎بعلاوه اشياء تهي جاوااسكريپت ميتوانند‎null‎ باشند.

‎‎ميتوان اگر شئي وجود داشته باشد نوع آن را با‎undefined‎ مقايسه كرد . مطابق زير

if  (typeof myObj === "undefined") 

--(go to editor for change code and run)

‎اما نميتوان اگر شئي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) 

--(go to editor for change code and run)


Previous >    <Next