JavaScript:اشتباهات رایج در برنامه‌نویسی جاوااسکریپت

از ویکی کد
(تفاوت) → نسخهٔ قدیمی‌تر | نمایش نسخهٔ فعلی (تفاوت) | نسخهٔ جدیدتر ← (تفاوت)
پرش به ناوبری پرش به جستجو

https://www.w3schools.com/js/js_mistakes.asp

JavaScript Common Mistakes

اشتباهات رایج در برنامه نویسی جاوا اسکریپت

This chapter points out some common JavaScript mistakes.

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

Accidentally Using the Assignment Operator

استفاده از عملگر مقداردهی به صورت اتفاقی

JavaScript programs may generate unexpected results if a programmer accidentally uses an assignment operator (=), instead of a comparison operator (==) in an if statement.

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

This if statement returns false (as expected) because x is not equal to 10:

جمله شرطی زیر مقدار false  را (همانطور که انتظار می رفت) برمیگرداند زیرا که مقدار متغیر x با 10 برابر نیست :

var x = 0;

if (x == 10)

This if statement returns true (maybe not as expected), because 10 is true:

جمله شرطی زیر مقدار True را (شاید انتظارش را نداشتید) برمی گرداند ، زیرا عدد 10 برابر با True است:

var x = 0;

if (x = 10)

This if statement returns false (maybe not as expected), because 0 is false:

جمله شرطی زیر مقدار false (شاید انتظارش را نداشتید) را برمی گرداند ، زیرا که عدد صفر برابر با false  است :

var x = 0;

if (x = 0)

An assignment always returns the value of the assignment.

در مقدار دهی همیشه مقدار مقداردهی شده برمیگرد.

Expecting Loose Comparison

مقایسه ی اشتباه

In regular comparison, data type does not matter. This if statement returns true:

در مقایسه های عادی نوع داده ها مهم نیست . جمله شرطی if زیر مقدار True را برمیگرداند :

var x = 10;

var y = "10";

if (x == y)

In strict comparison, data type does matter. This if statement returns false:

در مقایسه های سخت گیرانه یا Strict نوع داده در مقایسه مهم است . جمله شرطی if زیر مقدار false را برمی گرداند :

var x = 10;

var y = "10";

if (x === y)

It is a common mistake to forget that switch statements use strict comparison:

این یک اشتباه رایج است که در دستور Siwtch از مقایسه سخت گیرانه یا strict استفاده نمی کنند :

This case switch will display an alert:

دستور switch case زیر یک پیغام alert را نمایان خواهد کرد :

var x = 10;

switch(x) {

 case 10: alert("Hello");

}

This case switch will not display an alert:

دستور switch case زیر یک پیغام alert را نمایان تخواهد کرد :

var x = 10;

switch(x) {

  case "10": alert("Hello");

}

Confusing Addition & Concatenation

فراموش کردن تفاوت بین جمع بستن و الحاق رشته های متنی

Addition is about adding numbers.

جمع بستن برای جمع کردن اعداد استفاده می شود.

Concatenation is about adding strings.

الحاق درمورد رشته های متنی است .

In JavaScript both operations use the same + operator.

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

Because of this, adding a number as a number will produce a different result from adding a number as a string:

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

var x = 10 + 5;          // the result in x is 15

var x = 10 + "5";       // the result in x is "105"

When adding two variables, it can be difficult to anticipate the result:

زمانی که دو متغیر را با یک دیگر جمع می بندید ، حدس زدن نتیجه کمی مشکل خواهد بود :

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"

Misunderstanding Floats

درک اشتباه اعداد اعشاری یا floats

All numbers in JavaScript are stored as 64-bits Floating point numbers (Floats).

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

All programming languages, including JavaScript, have difficulties with precise floating point values:

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

var x = 0.1;

var y = 0.2;

var z = x + y            // the result in z will not be 0.3

To solve the problem above, it helps to multiply and divide:

برای حل این مشکل بهتر است که از ضرب و تقسیم استفاده کنید :

Example

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

Breaking a JavaScript String

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

JavaScript will allow you to break a statement into two lines:

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

Example 1

var x =

"Hello World!";

But, breaking a statement in the middle of a string will not work:

اما ایجاد فاصله در وسط یک رشته متنی ، کار نخواهد کرد :

Example 2

var x = "Hello

World!";

You must use a "backslash" if you must break a statement in a string:

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

Example 3

var x = "Hello \

World!";

Misplacing Semicolon

جایگذاری اشتباه نقطه ویرگول یا سمیکالن

Because of a misplaced semicolon, this code block will execute regardless of the value of x:

به خاطر جایگذاری اشتباه نقطه ویرگول ، این بلاک از کد بدون توجه به مقدار متغیر x اجرا خواهد شد :

if (x == 19);

{

  // code block

}

Breaking a Return Statement

ایجاد فاصله در هنگام استفاده از دستور Return

It is a default JavaScript behavior to close a statement automatically at the end of a line.

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

Because of this, these two examples will return the same result:

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

Example 1

function myFunction(a) {

  var power = 10

  return a * power

}

Example 2

function myFunction(a) {

  var power = 10;

  return a * power;

}

JavaScript will also allow you to break a statement into two lines.

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

Because of this, example 3 will also return the same result:

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

Example 3

function myFunction(a) {

  var

 power = 10; 

 return a * power;

}

But, what will happen if you break the return statement in two lines like this:

اما اگر در دستور Return شما از فاصله استفاده کنید ، چه اتفاقی خواهد افتاد ؟

Example 4

function myFunction(a) {

  var

  power = 10;

  return

  a * power;

}

The function will return undefined!

تابع مقدار undefined را برمی گرداند !

Why? Because JavaScript thought you meant:

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

Example 5

function myFunction(a) {

  var

  power = 10;

 return;

  a * power;

}

Explanation

توضیحات

If a statement is incomplete like:

اگر یک عبارت همانند عبارت زیر ناقص باشد :

Var

JavaScript will try to complete the statement by reading the next line:

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

power = 10;

But since this statement is complete:

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

Return

JavaScript will automatically close it like this:

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

return;

This happens because closing (ending) statements with semicolon is optional in JavaScript

این اتفاق می افتد چرا که بستن (به پایان بردن) عبارات با نقطه ویرگول یا سمیکالن در جاوا اسکریپت اختیاری است .

JavaScript will close the return statement at the end of the line, because it is a complete statement.

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

Never break a return statement.

هرگز در دستور Return فاصله ایجاد نکنید.

Accessing Arrays with Named Indexes

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

Many programming languages support arrays with named indexes.

بسیاری از زبانهای برنامه نویسی از اندیس های نام گذاری شده برای آرایه ها پشتیبانی می کنند .

Arrays with named indexes are called associative arrays (or hashes).

آرایه ها با اندیس های نامگذاری شده  ارایه های associative (و یا هش hash) نامیده می شوند.

JavaScript does not support arrays with named indexes.

جاوا اسکریپت از آرایه هایی با اندیس های نامگذاری شده پشتیبانی نمی کنند .

In JavaScript, arrays use numbered indexes:  

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

Example

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"

In JavaScript, objects use named indexes.

در جاوا اسکریپت ، شی ها یا object ها از اندیس های نامگذاری شده استفاده می کنند .

If you use a named index, when accessing an array, JavaScript will redefine the array to a standard object.

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

After the automatic redefinition, array methods and properties will produce undefined or incorrect results:

بعد از این تبدیل خودکار ، متد های آرایه ها و ویژگی های آنها ممکن است مقدار undefined و یا نتایج اشتباه تولید کنند :

Example:

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

Ending Definitions with a Comma

به پایان بردن تعریفات با ویرگول یا comma

Trailing commas in object and array definition are legal in ECMAScript 5.

استفاده از ویرگول یا Comma در هنگام تعریف شی و یا آرایه در ECMAScript 5 مجاز است .

Object Example:

مثال شی یا object :

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

Array Example:

مثال آرایه :

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

WARNING !!

هشدار !!!

Internet Explorer 8 will crash.

مرورگر اینترنت اکسپلور ورژن هشت از هم فرو می پاشد یا اصطلاحا Crash می کند .

JSON does not allow trailing commas.

Json اجازه استفاده از comma یا ویرگول را نمی دهد :

JSON:

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

JSON:

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

Undefined is Not Null

مقدار undefined برابر با مقدار null نیست .

JavaScript objects, variables, properties, and methods can be undefined.

شی ها ، متغیرها و ویژگی ها و متدها در جاوا اسکریپت می توانند مقدار undefined داشته باشد .

In addition, empty JavaScript objects can have the value null.

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

This can make it a little bit difficult to test if an object is empty.

این امر تست کردن اینکه یک شی خالی است یا نه را سخت می کند .

You can test if an object exists by testing if the type is undefined:

شما می توانید وجود یک شی را با تست کردن نوع آن که برابر با مقدار undefined است متوجه شوید :

Example:

if (typeof myObj === "undefined")

But you cannot test if an object is null, because this will throw an error if the object is undefined:

اما شما نمی توانید که null بودن یک شی را بررسی کنید ، چرا که این امر موجب بروز خطا می شود در صورتی شی یا object  برابر با undefined باشد .

Incorrect:

if (myObj === null) 

To solve this problem, you must test if an object is not null, and not undefined.

برای حل این مشکل می بایست شما هم null نبودن و هم undefined نبودن یک شی یا object  را بررسی کنید .

But this can still throw an error:

اما این کار نیز همچنان موجب بروز خطا می شود :

Incorrect:

شیوه نادرست :

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

Because of this, you must test for not undefined before you can test for not null:

به خاطر این موضوع ، شما می بایست undefined بودن یک شی را قبل از بررسی null بودن آن شی ، بررسی کنید :

Correct:

شیوه درست :

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