قواعد جاوااسکریپت مجموعهٔ ساختارهای استاندارد برای اسکریپت‌نویسی صحیح در این زبان هستند.
در مجموعهٔ قوانینی که در اینجا تدوین شده‌اند، از تابع `alert` برای ایجاد خروجی استاندارد استفاده شده‌است. در واقع کتابخانهٔ استاندارد جاوا اسکریپت از نداشتن تابعی استادارد برای ایجاد خروجی رنج می‌برد؛ با در نظر گرفتن اینکه این زبان عموماً جزو زبان‌های سمت کاربر است، و تقریباً همهٔ مرورگرهای مدرن از دارای قابلیت تابع `alert` هستند، لذا استفاده از این تابع موجه‌است.

تاریخچه
-------

برندان آیک تاریخچهٔ زبان جاوااسکریپت نسخهٔ ۱٫۱ را به صورت زیر خلاصه می‌کند:

> جاوااسکریپت مقدار زیادی از قواعد خود را از زبان برنامه نویسی جاوا قرض گرفته‌است. اما مقدار زیادی از ویژگی‌های خود را از AWK و پرل به ارث برده‌است و تاثیرات غیرمستقیمی از زبان سلف در شیوهٔ تعریف پیش الگوی اشیا برده.
> 
>

مقدمات
------

### حساسیت به بزرگی و کوچکی کاراکترها

جاوااسکریپت زبانی حساس به بزرگی و کوچکی کاراکترهاست(به انگلیسی: Case sensitive). حتماً لازم است که نام سازنده (به انگلیسی: Constructor) را با حرف بزرگ و نام یک تابع را با یک حرف کوچک شروع کنیم.

### فضاهای خالی(فاصله) و سمی‌کالِن

تک فاصله(به انگلیسی: Space)، کلید جهش (به انگلیسی: Tab) و خط جدید(به انگلیسی: New line)، در فضای خارج از رشته‌ها (به انگلیسی: Strings) را فضاهای خالی (به انگلیسی: White space)می‌نامیم. بر خلاف زبان‌هایی مانند C زبان جاوااسکریپت حساس به فاصله‌است.
با استفاده از سمی‌کالِن گذاری می‌توان خطای ناشی از فاصله گذاری نامناسب را جبران کرد. نمونه‌هایی از خطاهای فاصله گذاری در ادامه رخ داده‌است:

```
return
a + b;

// Returns undefined. Treated as:
// return;
// a + b;

```

اما:

```
a = b + c
(d + e).foo()

// Treated as:
// a = b + c(d + e).foo();

```

### توضیحات

قواعد توضیح گذاری در جاوااسکریپت عیناً مشابه زبان سی++ است:

```
// a short, one-line comment

/\* this is a long, multi-line comment
 about my script. May it one day
 be great. \*/

/\* Comments /\* may not be nested \*/ Syntax error \*/

```

متغیرها
-------

شناساگرها(به انگلیسی: Identifiers) در زبان جاوااسکریپت دارای نوع خاصی نیستند و هرنوع مقداری می‌تواند داخل هر داده‌ای قرار بگیرد. تعریف دادهٔ جدید با استفاده از دستور `var` انجام می‌شود. می‌توان چندین متغیر را به یکباره تعریف کرد. اسم یک متغیر می‌تواند با یک حرف، با یک underline یا یک علامت دلار یا $ شروع شود. کاراکترهای دیگر می‌تواند اعداد ۰ تا ۹ باشد. با توجه به اینکه جاوااسکریپت حساس به بزرگی-کوچکی حروف است، استفاده از کاراکترهای بزرگ یا کوچک، متغیرهای جدیدی را ایجاد می‌کند. توجه شود که می‌توان از حروف a تا z (حروف کوچک) یا حروف A تا Z (حروف بزرگ) استفاده کرد. با شروه جاوااسکریپت نسخهٔ 1.5، ISO 8859-1 یا کاراکترهای یونی‌کد را می‌توان در ساختار متغیرها استفاده کرد. در پیاده سازی‌هایی از جاوااسکریپت از علامت @ می‌توان به عنوان یک شناساگر استاده کرد. در حالی که در برخی از ویرایش‌های جدید از آن چنین امکانی وجود ندارد. مشابه بسیاری از زبان‌های دیگر، متغیرهای این زبان در محدوده‌ای که تعریف شده‌اند دارای اعتبار هستند(یا به اصطلاح lexically scoped). به عنوان مثال متغیری که در داخل یک تابع تعریف می‌شود، داخل آن دارای اعتبار است و در داخل آن و نواحی داخلی آن می‌تواند مورد استفاده قرار گیرد. در صورتی که محدودهٔ خارج از آن تابع دیگر اعتبار ندارد. در واقع تعریف هر متغیر در داخل یک ناحیه در ابتدای آن ثبت (variable hoist) می‌شود. اگرچه متغیر مورد نظر تا زمانی که در داخل ناحیه تعریف نشده باشد، همچنان ناشناس (به انگلیسی: undefined) است. متغیرهایی که در خارج همهٔ توابع تعریف شده باشند، متغیرهای جهانی (به انگلیسی: Global) نامیده می‌شود.
در اینجا نمونه‌ای از تعریف متغیر نمایش داده شده‌است:

```
var x = 0; // A global variable, because it is not in any function

function f() {
 var z = 'foxes', r = 'birds'; // 2 local variables
 m = 'fish'; // global because it wasn't declared anywhere before
 function child() {
 var r = 'monkeys'; // This variable is local and does not affect the "birds" r of the parent function.
 z = 'penguins'; // The child function is able to access the variables of the parent function, this is called closure.
}
 twenty = 20; // This variable is declared on the next line, but usable anywhere in the function, even before, as here
 var twenty;
 child();
 return x; // We can use x here because it is global
}
f();
alert(z); // This line will raise a ReferenceError exception because the value of z is no longer available

```

زمانی که جاوااسکریپت به دنبال شناسایی مقدار یک شناساگر است، به دنبال تعریف آن و مقدار دهی آن در ناحیهٔ مورد نظر می‌گردد. در صورتی که در آن ناحیه تعریف یا مقداردهی پیدا نکند، به ناحیهٔ بالاتر مراجعه می‌کند، تا اینکه به ناحیه می‌رسد که در آن متغیرهای جهانی تعریف می‌شوند. اگر تعریف متغیر پیدا نشود، جاوااسکریپت یک استثنای (به انگلیسی: Exception) ReferenceError بر می گرداند.
زمانی که یک شناساگر مقداردهی می‌شود، دوباره همین مراحل تکرار می‌شود تا نزدیک نرین متغیر پیدا شود و مقداردهی به آن انجام گیرد. در صورتی که متغیری پیدا نشود، متغیری متناسب با نوع مقدار در ناحیهٔ جهانی تعریف می‌شود.
حواستان باشد که جاوااسکریپت در حالت strict در صورتی که متغیری تعریف نشده باشد، در صورت فراخوانی، متغیر جدید تعریف نمی‌کند.

نوع داده‌های پایه
-----------------

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

### نوع تعریف نشده

نوع دادهٔ تعریف نشده (به انگلیسی: undefined) مربوط به متغیرهایی است که ایجاد شده اما مقداردهی نشده‌اند. این نوع همچنین در فراخوانی اشیایی که هنوز ایجاد نشده‌اند برگردانده می‌شود. در مورد نوع‌های بولی (به انگلیسی: Boolean)، مقدار متغیرهایی که تعریف نشده باشند، "نادرست"(به انگلیسی: false) برگردانده می‌شود. یکی از رفتارهای غیرمترقبه استفاده از نوع تعریف نشده، و عملکرده "نادرست"(به انگلیسی: false) آن در جایگاه‌های منطقی (به انگلیسی: logical) است.

```
var test; // variable declared but not defined,...
 //... set to value of undefined
var testObj = {};
alert(test); // test variable exists but value not...
 //... defined, displays undefined
alert(testObj.myProp); // testObj exists, property does not,...
 //... displays undefined
alert(undefined == null); // unenforced type during check, displays true
alert(undefined === null); // enforce type during check, displays false

```

باید توجه کرد نوع "تعریف نشده" به صورت یک نوع صریح کامل تعریف نشده‌است. لذا استفاده از (x == undefined) راه کاملاً درستی برای "تعریف نشده" بودن یک متغیر وجود نیست؛ چرا که در نسخه‌های قبل از ECMAScript 5 این مجاز است که شما متغیری به صورت var undefined = "I'm defined now"; تعریف کنید. شیوه‌ای بهتر این است که از (typeof x == undefined') استفاده کنید.

```
alert(null == undefined); // unenforced type during check, displays true
alert(null === undefined); // enforce type during check, displays false
alert(typeof null == object'); // true

```

### اعداد

اعداد در جاوااسکریپت به صورت باینری در استاندارد اعداد حقیقی IEEE-754 با دقت ۱۶ رقم نمایش داده می‌شوند. چون این نوع نمایش، دارای نمایش اعداد اعشار با تعداد رقم محدود است، بدیهی است، ظرفیت نمایش اعداد حقیقی در این قالب محدود به تعداد ارقام بعد از اعشار است.
این مسئله می‌تواند در شرایط مختلف به شیوه‌های مختلف بروز کند. لذا باید در مورد این مسئله دقت کرد:

```
alert(0.2 + 0.1 == 0.3); // displays false
alert(0.94 - 0.01); // displays 0.9299999999999999

```

می توان از تابع toFixed() استفاده کرد تا تعداد ارقام خروجی را محدود (به انگلیسی: round) کرد.

می توان اعداد را به صورت‌های زیر تعریف کرد:

```
345; // an "integer", although there is only one numeric type in JavaScript
34.5; // a floating-point number
3.45e2; // another floating-point, equivalent to 345
0377; // an octal integer equal to 255
0xFF; // a hexadecimal integer equal to 255, digits represented by the...
 //... letters A-F may be upper or lowercase

```

کران‌های **+∞**, **−∞** و **NaN** (Not a Number) به صورت‌های زیر طبق استاندارد IEEE-754 مشخص می‌شوند:

```
Infinity; // Positive Infinity (negative obtained with -Infinity for instance)
NaN; // The Not-A-Number value, also returned as a failure in...
 //... string-to-number conversions

```

نسبت دهی اعداد به متغیرها و تغییر علامت آن‌ها به صورت زیر است:

```
var myString = "۱۲۳٫۴۵۶";
var myNumber1 = Number(myString);
var myNumber2 = +myString;

```

### رشته‌ها

رشته‌ها دنباله‌ای از کاراکترها هستند که بین دو علامت `'` یا `"` قرار داده می‌شوند.

```
var greeting = "Hello, world!";
var anotherGreeting = 'Greetings, people of Earth. ';

```

می توان به کاراکترهای رشته‌ها با استفاده از تابع `charAt` (ارائه شده توسط provided by `String.prototype`) دسترسی پیدا کرد:

```
var h = greeting.charAt(0);

```

در مرورگرهای جدید می‌توان به صورت معادل نوشت:

```
var h = greeting[0];

```

توجه کنید که کاراکترهای یک رشته را نمی توان به این صورت عوض کرد:

```
greeting[0] = "H"; // Not working.

```

با اعمال رابطهٔ ("==") می‌توان تشخیص داد که آیا دو رشته از نظر طول و نوع کاراکترها یکسان هستند یا خیر.

```
var x = "world";
var compare1 = ("Hello, "+x ==Hello, world"); // Now compare1 contains true.
var compare2 = ("Hello, "+x ==hello, world"); // Now compare2 contains...
 //... false since the...
 //... first characters...
 //... of both operands...
 //... are not of the same case.

```

نکتهٔ دیگر این است که نمی توان از علامت‌های  *یا "" در داخل نوع یکان استفاده کرد.*

```
var x = '"Hello, world!" he said. ' // Just fine.
var x = ""Hello, world!" he said." // Not good.
var x = "\"Hello, world!\" he said." // That works by replacing "with \"

```

می توان رشته‌ها توسط سازنده(به انگلیسی: Constructor) ی `String` ساخت:

```
var greeting = new String("Hello, world!");

```

با استفاده از تابع `valueOf` نوع شیئ را به صورت رشته‌ای بر می گرداند.

```
var s = new String("Hello!");
typeof s; // Is 'object'.
typeof s.valueOf(); // Is 'string'.

```

توجه کنید بررسی برابری بین اشیاء از نوع رشته مانند مقایسهٔ برابری بین رشته‌ها نیست:

```
var s1 = new String("Hello!");
var s2 = new String("Hello!");
s1 == s2; // Is false, because they are two distinct objects.
s1.valueOf() == s2.valueOf(); // Is true.

```

جستارهای وابسته
---------------

جاوااسکریپت

پانویس
------

1. ↑  JavaScript 1.1 specification
2. ↑  Flanagan, David (2006). *JavaScript: The definitive Guide*. p. ۱۶. ISBN 978-0-596-10199-2. Omitting semicolons is not a good programming practice; you should get into the habit of inserting them.
3. ↑  "Values, Variables, and Literals - MDC". Mozilla Developer Network. 16 سپتامبر 2010. Archived from the original on 29 June 2011. Retrieved 26 October 2019.

منابع
-----

* David Flanagan, Paula Ferguson: *JavaScript: The Definitive Guide*, O'Reilly & Associates, ISBN 0-596-10199-6
* Danny Goodman: *JavaScript Bible*, Wiley, John & Sons, ISBN 0-7645-3342-8
* Thomas A. Powell, Fritz Schneider: *JavaScript: The Complete Reference*, McGraw-Hill Companies, ISBN 0-07-219127-9
* Emily Vander Veer: *JavaScript For Dummies, 4th Edition*, Wiley, ISBN 0-7645-7659-3

پیوند به بیرون
--------------

|  |  |
| --- | --- |
|  | ویکی‌کتاب دارای کتابی پیرامون موضوع ***JavaScript*** است |

* A re-introduction to JavaScript - Mozilla Developer Center
* ECMAScript standard references: ECMA-262
* Interactive JavaScript Lessons - example-based
* JavaScript on About.com: lessons and explanation
* Mozilla Developer Center Core References for JavaScript versions 1.5, 1.4[*پیوند مرده*], 1.3[*پیوند مرده*] and 1.2[*پیوند مرده*]
* Mozilla JavaScript Language Documentation
* Comparison Operators in JavaScript


| * ن
* ب
* و
جاوااسکریپت |
| --- |
| تحلیل کد | 
* ای‌اس‌لینت
* JSHint
* جی‌اس‌لینت

 |
| مترجم | 
* کافی‌اسکریپت
* بسته ابزارهای گوگل
* ابزار وب گوگل
* Morfik
* تایپ‌اسکریپت

 |
| مفاهیم | 
* ای‌جکس
* جاوااسکریپت
* اچ‌تی‌ام‌ال پویا
* کتابخانه جاوا اسکریپت
* قواعد جاوااسکریپت
* جاوااسکریپت محجوب

 |
| اشکال‌یاب‌ها | 
* فایرباگ
* Microsoft Script Debugger
* Microsoft Script Editor
* مایکروسافت ویژوال استودیو
* Opera Dragonfly
* Microsoft Visual Web Developer Express
* Venkman
* سافاری (مرورگر)

 |
| مولد مستندسازی | 
* جی‌اس‌داک

 |
| ویرایشگرها | 
* جاوااسکریپت
* Comparison of JavaScript-based source code editors

 |
| موتورها | 
* Comparison of layout engines
* List of ECMAScript engines
* List of JavaScript engines

 |
| چارچوب نرم‌افزار | 
* Comparison of JavaScript frameworks
* List of JavaScript libraries

 |
| زبان‌های مرتبط | 
* اکشن‌اسکریپت
* asm.js
* کافی‌اسکریپت
* دارت
* اکما اسکریپت
* JavaScript OSA
* جی‌اسکریپت
* تایپ‌اسکریپت
* وی‌بی‌اسکریپت

 |
| فناوری مرتبط | 
* شیوه‌نامه آبشاری
* مدل شی‌گرای سند
* اچ‌تی‌ام‌ال
* جی‌سن

 |
| منابع | 
* ان‌پی‌ام
* نوگت

 |
| جاوااسکریپت | 
* صفحه‌های سرور فعال
* CommonJS
* JSGI
* نود.جی‌اس
* Wakanda

 |
| آزمایش واحد | 
* جزمین
* QUnit
* List of JavaScript unit testing frameworks

 |
| افراد | 
* داگلاس کراکفرد
* برندان ایچ
* جان رزایگ

 |