<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A; JavaScript</title><link>https://academy.hsoub.com/programming/javascript/page/14/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A; JavaScript</description><language>ar</language><item><title>&#x62F;&#x644;&#x64A;&#x644; Airbnb &#x644;&#x646;&#x645;&#x637; &#x62C;&#x627;&#x641;&#x627; &#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%AF%D9%84%D9%8A%D9%84-airbnb-%D9%84%D9%86%D9%85%D8%B7-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r632/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_03/06.png.231c8943e3f5ef221e3b9f7b06b72eb3.png" /></p>

<p>
	<strong>ملاحظة</strong>: يفترض هذا الدليل أنك تستخدم <a href="https://babeljs.io/" rel="external nofollow">مصرّف Babel</a>، كما يتطلّب استخدام <a href="https://npmjs.com/babel-preset-airbnb" rel="external nofollow">إعدادات babel-preset-airbnb المسبقة</a> أو ما يماثلها. ويفترض أيضًا أنّك ثبّت ترقيعات متعدّدة (Polyfills/Shims)، عبر <a href="https://npmjs.com/airbnb-browser-shims" rel="external nofollow">airbnb-browser-shims</a> أو ما يماثلها.
</p>

<h2>
	أنواع البيانات
</h2>

<h3>
	الأنواع البدائية (Primitives)
</h3>

<p>
	عندما تتعامل مع نوع بدائي فأنت تعمل مباشرةً على قيمته.
</p>

<ul>
<li>
		سلاسل المحارف <code>string</code>،
	</li>
	<li>
		الأعداد <code>number</code>،
	</li>
	<li>
		القيم المنطقية <code>boolean</code>،
	</li>
	<li>
		القيمة المعدومة <code>null</code>،
	</li>
	<li>
		القيمة غير المعرَّفة <code>undefined</code>،
	</li>
	<li>
		الرموز <code>symbol</code>،
	</li>
	<li>
		الأعداد الصحيحة الكبيرة <code>bigint</code>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_6" style="">
<span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
let bar </span><span class="pun">=</span><span class="pln"> foo</span><span class="pun">;</span><span class="pln">

bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">,</span><span class="pln"> bar</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; 1, 9</span></pre>

<p>
	لا يمكن ترقيع النوعين <code>symbol</code> و<code>bigint</code> بدقّة، لذا ينبغي ألّا تُستخدَم عند استهداف المتصفحات/البيئات التي لا تدعمها تلقائيّا.
</p>

<h3>
	الأنواع المركبة (Complex)
</h3>

<p>
	عند التعامل مع نوع مركّب فأنت تعمل على مرجعٍ لقيمته.
</p>

<ul>
<li>
		الكائنات <code>object</code>،
	</li>
	<li>
		المصفوفات <code>array</code>،
	</li>
	<li>
		الدوال <code>function</code>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_8" style="">
<span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> foo</span><span class="pun">;</span><span class="pln">

bar</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">[</span><span class="lit">0</span><span class="pun">],</span><span class="pln"> bar</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span><span class="pln"> </span><span class="com">// =&gt; 9, 9</span></pre>

<h2>
	المراجع References
</h2>

<ul>
<li>
		<p>
			استخدم <code>const</code> لجميع مراجعك. وتجنب استخدام <code>var</code>. استخدم قاعدتي <code>prefer-const</code> و<code>no-const-assign</code> في ESlint.
		</p>

		<p>
			<strong>لماذا؟</strong> لأنّ هذا سيضمن لك ألّا تعيد تعيين مراجعك، وهو ما يمكن أن يؤدي إلى أخطاء، ويُصعّب فهم الشفرة البرمجية.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_10" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			إن كنت مضطرًّا لإعادة تعيين المراجع، استخدم <code>let</code> بدلاً من <code>var</code>. استخدم قاعدة <code>no-var</code> في ESlint.
		</p>

		<p>
			<strong>لماذا؟</strong> لأن نطاق تعريف <code>let</code> محدود بالكتلة البرمجية (Block-scoped) وليس محدودًا داخل الدالة (Function-scoped) كما هو الحال مع <code>var</code>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_12" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  count </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيد، استخدم let.</span><span class="pln">
let count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  count </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تذكر أن نطاق كل من <code>let</code> و <code>const</code>محدود بالكتلة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_14" style="">
<span class="com">// لا توجد المتغيّرات المصرَّح عنها ب let وconst إلّا بداخل الكتل المُصرَّح فيها</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  let a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// خطأ في المرجع ReferenceError</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">b</span><span class="pun">);</span><span class="pln"> </span><span class="com">// خطأ في المرجع ReferenceError</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الكائنات Objects
</h2>

<ul>
<li>
		<p>
			استخدم صياغة تصنيف النوع (Literal syntax) لإنشاء الكائنات. استخدم قاعدة <code>no-new-object</code> في ESLint.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_16" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> item </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم أسماء محسوبة للخاصيّات عند إنشاء كائنات بأسماء خاصيّات ديناميكية.
		</p>

		<p>
			<strong>لماذا؟</strong> لأن ذلك سيسمح لك بتعريف جميع خاصيّات الكائن في مكان واحد.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_18" style="">
<span class="kwd">function</span><span class="pln"> getKey</span><span class="pun">(</span><span class="pln">k</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="pln">a key named $</span><span class="pun">{</span><span class="pln">k</span><span class="pun">}`;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  id</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'San Francisco'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
obj</span><span class="pun">[</span><span class="pln">getKey</span><span class="pun">(</span><span class="str">'enabled'</span><span class="pun">)]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  id</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'San Francisco'</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">[</span><span class="pln">getKey</span><span class="pun">(</span><span class="str">'enabled'</span><span class="pun">)]:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم أسلوب التعريف المختصر لتوابع الكائن. (قاعدة <code>object-shorthand</code> في ESLint).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_20" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> atom </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  value</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">

  addValue</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> atom</span><span class="pun">.</span><span class="pln">value </span><span class="pun">+</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> atom </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  value</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">

  addValue</span><span class="pun">(</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> atom</span><span class="pun">.</span><span class="pln">value </span><span class="pun">+</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم التعريف المختصر لقيمة الخاصية (قاعدة <code>object-shorthand</code> في ESLint).
		</p>

		<p>
			<strong>لماذا؟</strong> لأنه أقصر وأوضح.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_22" style="">
<span class="kwd">const</span><span class="pln"> lukeSkywalker </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Luke Skywalker'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  lukeSkywalker</span><span class="pun">:</span><span class="pln"> lukeSkywalker</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  lukeSkywalker</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			اجمع الخاصيّات المُختصرة في بداية التصريح بالكائن (Object declaration).
		</p>

		<p>
			<strong>لماذا؟</strong> لأنّ هذه الطريقة تسهّل معرفة أي الخاصيّات تستخدم الاختصار.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_24" style="">
<span class="kwd">const</span><span class="pln"> anakinSkywalker </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Anakin Skywalker'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> lukeSkywalker </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Luke Skywalker'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  episodeOne</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
  twoJediWalkIntoACantina</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
  lukeSkywalker</span><span class="pun">,</span><span class="pln">
  episodeThree</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln">
  mayTheFourth</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln">
  anakinSkywalker</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  lukeSkywalker</span><span class="pun">,</span><span class="pln">
  anakinSkywalker</span><span class="pun">,</span><span class="pln">
  episodeOne</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
  twoJediWalkIntoACantina</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
  episodeThree</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln">
  mayTheFourth</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تضع بين علامات التنصيص إلّا الخاصيّات التي لها أسماء غير صالحة.
		</p>

		<p>
			<strong>لماذا؟</strong> بشكل عام، لأنّه أسهل للقراءة ويُحسّن وضوح الكود، كما أنّه يسهُل استخدامه من قبل محركات الجافا سكريبت.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_26" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">سيئ</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="str">'foo'</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'bar'</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'data-blah'</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">جيّد</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  foo</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln">
  bar</span><span class="pun">:</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'data-blah'</span><span class="pun">:</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستدع توابع <code>Object.prototype</code> ، مثل <code>hasOwnProperty</code>، <code>propertyIsEnumerable</code>، و <code>isPrototypeOf</code>، لا تستدعها مباشرة. استخدم قاعدة <code>no-prototype-builtins</code> في ESLint.
		</p>

		<p>
			<strong>لماذا؟</strong> لأنّ خاصيّات الكائن قد تغطّي تلك التوابع - انظر مثلًا إلى <code>{hasOwnProperty: false}</code> – علاوة على أن الكائن قد يكون معدومًا (<code>Object.create(null)</code>).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_28" style="">
<span class="com">// سيئ</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">object</span><span class="pun">.</span><span class="pln">hasOwnProperty</span><span class="pun">(</span><span class="pln">key</span><span class="pun">));</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="typ">Object</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">hasOwnProperty</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">object</span><span class="pun">,</span><span class="pln"> key</span><span class="pun">));</span><span class="pln">

</span><span class="com">// أفضل</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> has </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">hasOwnProperty</span><span class="pun">;</span><span class="pln"> </span><span class="com">// cache the lookup once, in module scope.</span><span class="pln">
</span><span class="com">/* أو */</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> has from </span><span class="str">'has'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// https://www.npmjs.com/package/has</span><span class="pln">
</span><span class="com">// ...</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">has</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">object</span><span class="pun">,</span><span class="pln"> key</span><span class="pun">));</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يفضل تطبيق عامل التمديد (Spread operator) على الكائن بدلًا من استخدام التابع <code>Object.assign</code> إن كنت تريد النسخ السطحي (Shallow-copy) للكائنات. أو يمكنك استخدام عامل الاستناد (Rest operator) للحصول على كائن جديد مع حذف خصائص معينة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_30" style="">
<span class="com">// سيئ جدًّا</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> original </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> a</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> copy </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">assign</span><span class="pun">(</span><span class="pln">original</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> c</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">});</span><span class="pln"> </span><span class="com">// يتسبّب في التعديل على الكائن `original`</span><span class="pln">
</span><span class="kwd">delete</span><span class="pln"> copy</span><span class="pun">.</span><span class="pln">a</span><span class="pun">;</span><span class="pln"> </span><span class="com">// الأمر نفسه هنا</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> original </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> a</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> copy </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">assign</span><span class="pun">({},</span><span class="pln"> original</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> c</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">});</span><span class="pln"> </span><span class="com">// copy =&gt; { a: 1, b: 2, c: 3 }</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> original </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> a</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> copy </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">...</span><span class="pln">original</span><span class="pun">,</span><span class="pln"> c</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">};</span><span class="pln"> </span><span class="com">// copy =&gt; { a: 1, b: 2, c: 3 }</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> a</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">noA </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> copy</span><span class="pun">;</span><span class="pln"> </span><span class="com">// noA =&gt; { b: 2, c: 3 }</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	المصفوفات Arrays
</h2>

<ul>
<li>
		<p>
			استخدم صياغة تصنيف النوع (Literal syntax) لإنشاء المصفوفة (قاعدة <code>no-array-constructor</code> في ESLint).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_34" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> items </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> items </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم <code>Array#push</code> بدلًا من الإسناد المباشر لإضافة عناصر إلى المصفوفة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_32" style="">
<span class="kwd">const</span><span class="pln"> someStack </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
someStack</span><span class="pun">[</span><span class="pln">someStack</span><span class="pun">.</span><span class="pln">length</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">'abracadabra'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
someStack</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="str">'abracadabra'</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<p>
	استخدم تمديد المصفوفات <code>...</code> (Array spreads) لنسخ المصفوفات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_36" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> len </span><span class="pun">=</span><span class="pln"> items</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> itemsCopy </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
let i</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> len</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  itemsCopy</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> items</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> itemsCopy </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[...</span><span class="pln">items</span><span class="pun">];</span></pre>

<ul>
<li>
		<p>
			استخدم عامل التمديد <code>...</code> بدلًا من التابع <code>Array.from</code> لتحويل كائن مُكرَّر (Iterable) إلى مصفوفة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_38" style="">
<span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'.foo'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> nodes </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">.</span><span class="pln">from</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln">

</span><span class="com">// أفضل</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> nodes </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[...</span><span class="pln">foo</span><span class="pun">];</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم التابع <code>Array.from</code> بدلًا من عامل التمديد <code>...</code> لتحويل كائن شبيه بالمصفوفات إلى مصفوفة.
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_40" style="">
<span class="kwd">const</span><span class="pln"> arrLike </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln"> </span><span class="str">'bar'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln"> </span><span class="str">'baz'</span><span class="pun">,</span><span class="pln"> length</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">arrLike</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">.</span><span class="pln">from</span><span class="pun">(</span><span class="pln">arrLike</span><span class="pun">);</span></pre>

<ul>
<li>
		<p>
			استخدم التابع <code>Array.from</code> بدلًا من عامل التمديد <code>...</code> لتطبيق الدالة <code>map</code> على الكائنات المُكرّرة، بهدف تجنّب خلق مصفوفة مؤقتة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_42" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> baz </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[...</span><span class="pln">foo</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">bar</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> baz </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">.</span><span class="pln">from</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">,</span><span class="pln"> bar</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم التعليمة <code>return</code> في رد نداء توابع المصفوفات (Method callbacks). لا ضير في حذف التعليمة <code>return</code> إن كان متن الدالة يتكون من تعليمة واحدة من دون آثار جانبية. استخدم قاعدة <code>array-callback-return</code> في ESLint.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_44" style="">
<span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">((</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">

</span><span class="com">// سيئ -عدم وجود قيمة مُرجَعة يعني أن "acc" يصبح غير معرّف بعد عملية التكرار الأولى</span><span class="pln">
</span><span class="pun">[[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]].</span><span class="pln">reduce</span><span class="pun">((</span><span class="pln">memo</span><span class="pun">,</span><span class="pln"> item</span><span class="pun">,</span><span class="pln"> index</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> flatten </span><span class="pun">=</span><span class="pln"> memo</span><span class="pun">.</span><span class="pln">concat</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
  memo</span><span class="pun">[</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> flatten</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]].</span><span class="pln">reduce</span><span class="pun">((</span><span class="pln">memo</span><span class="pun">,</span><span class="pln"> item</span><span class="pun">,</span><span class="pln"> index</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> flatten </span><span class="pun">=</span><span class="pln"> memo</span><span class="pun">.</span><span class="pln">concat</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
  memo</span><span class="pun">[</span><span class="pln">index</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> flatten</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> flatten</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
inbox</span><span class="pun">.</span><span class="pln">filter</span><span class="pun">((</span><span class="pln">msg</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> subject</span><span class="pun">,</span><span class="pln"> author </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> msg</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">subject </span><span class="pun">===</span><span class="pln"> </span><span class="str">'Mockingbird'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> author </span><span class="pun">===</span><span class="pln"> </span><span class="str">'Harper Lee'</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
inbox</span><span class="pun">.</span><span class="pln">filter</span><span class="pun">((</span><span class="pln">msg</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> subject</span><span class="pun">,</span><span class="pln"> author </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> msg</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">subject </span><span class="pun">===</span><span class="pln"> </span><span class="str">'Mockingbird'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> author </span><span class="pun">===</span><span class="pln"> </span><span class="str">'Harper Lee'</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم سطرًا جديدًا بعد معقوفة الفتح وقبل معقوفة إغلاق المصفوفة إذا كان المصفوفة متعددة الأسطر.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_46" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">],</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> objectInArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[{</span><span class="pln">
  id</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  id</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
</span><span class="pun">}];</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> numberInArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[[</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">],</span><span class="pln"> </span><span class="pun">[</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]];</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> objectInArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    id</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="pun">{</span><span class="pln">
    id</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> numberInArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
  </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	التفكيك Destructuring
</h2>

<ul>
<li>
		<p>
			استخدم تفكيك الكائن عند التعامل مع عدة خاصيّات للكائن.
		</p>

		<p>
			<strong>لماذا؟</strong> التفكيك يُعفيك من الحاجة إلى إنشاء مراجع مؤقتة لتلك الخصائص.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_48" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getFullName</span><span class="pun">(</span><span class="pln">user</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> firstName </span><span class="pun">=</span><span class="pln"> user</span><span class="pun">.</span><span class="pln">firstName</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> lastName </span><span class="pun">=</span><span class="pln"> user</span><span class="pun">.</span><span class="pln">lastName</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">firstName</span><span class="pun">}</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">lastName</span><span class="pun">}`;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getFullName</span><span class="pun">(</span><span class="pln">user</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> firstName</span><span class="pun">,</span><span class="pln"> lastName </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> user</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">firstName</span><span class="pun">}</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">lastName</span><span class="pun">}`;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// أفضل</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getFullName</span><span class="pun">({</span><span class="pln"> firstName</span><span class="pun">,</span><span class="pln"> lastName </span><span class="pun">})</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="pln">$</span><span class="pun">{</span><span class="pln">firstName</span><span class="pun">}</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">lastName</span><span class="pun">}`;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم تفكيك المصفوفات.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_50" style="">
<span class="kwd">const</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">];</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> first </span><span class="pun">=</span><span class="pln"> arr</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> second </span><span class="pun">=</span><span class="pln"> arr</span><span class="pun">[</span><span class="lit">1</span><span class="pun">];</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">[</span><span class="pln">first</span><span class="pun">,</span><span class="pln"> second</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> arr</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم تفكيك الكائن لأجل إرجاع أكثر من قيمة، وليس تفكيك المصفوفات. <strong>لماذا؟</strong> يمكنك إضافة خاصيات جديدة مع الوقت وتغيير الترتيب دون مشاكل.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_52" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> processInput</span><span class="pun">(</span><span class="pln">input</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// then a miracle occurs</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">[</span><span class="pln">left</span><span class="pun">,</span><span class="pln"> right</span><span class="pun">,</span><span class="pln"> top</span><span class="pun">,</span><span class="pln"> bottom</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// تحتاج إلى أخذ ترتيب البيانات المُرجَعة في الحسبان</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">[</span><span class="pln">left</span><span class="pun">,</span><span class="pln"> __</span><span class="pun">,</span><span class="pln"> top</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> processInput</span><span class="pun">(</span><span class="pln">input</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> processInput</span><span class="pun">(</span><span class="pln">input</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// then a miracle occurs</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> left</span><span class="pun">,</span><span class="pln"> right</span><span class="pun">,</span><span class="pln"> top</span><span class="pun">,</span><span class="pln"> bottom </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// تختار البيانات التي تحتاجها فقط</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> left</span><span class="pun">,</span><span class="pln"> top </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> processInput</span><span class="pun">(</span><span class="pln">input</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	السلاسل النصية Strings
</h2>

<ul>
<li>
		<p>
			استخدم علامات التنصيص المفردة <code>''</code> لتحديد السلاسل النصيّة (القاعدة <code>quotes</code> في ESLint).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_54" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Capt. Janeway"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ - يجب أن تحتوي القوالب مصنَّفة النوع على حشو (Interpolation) أو أسطر جديدة.</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="typ">Capt</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Janeway</span><span class="pun">`;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Capt. Janeway'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ينبغي ألّا تُكتَب النصوص التي يتجاوز طولها 100 حرف على أسطر متعددة باستخدام ضمّ النصوص (Concatenation). <strong>لماذا؟</strong> النصوص التي فيها أخطاء تكون مزعجةً وتجعل الكود أقل قابلية للبحث.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_56" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> errorMessage </span><span class="pun">=</span><span class="pln"> </span><span class="str">'</span><span class="typ">This</span><span class="pln"> is a super </span><span class="kwd">long</span><span class="pln"> error that was thrown because \
of </span><span class="typ">Batman</span><span class="pun">.</span><span class="pln"> </span><span class="typ">When</span><span class="pln"> you stop to think about how </span><span class="typ">Batman</span><span class="pln"> had anything to </span><span class="kwd">do</span><span class="pln"> \
</span><span class="kwd">with</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> you would </span><span class="kwd">get</span><span class="pln"> nowhere \
fast</span><span class="pun">.</span><span class="str">';</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> errorMessage </span><span class="pun">=</span><span class="pln"> </span><span class="str">'This is a super long error that was thrown because '</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
  </span><span class="str">'of Batman. When you stop to think about how Batman had anything to do '</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
  </span><span class="str">'with this, you would get nowhere fast.'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> errorMessage </span><span class="pun">=</span><span class="pln"> </span><span class="str">'This is a super long error that was thrown because of Batman. When you stop to think about how Batman had anything to do with this, you would get nowhere fast.'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			عند بناء النصوص برمجيًّا، استخدم القوالب النصيّة بدلًا من ضمّ النصوص (قاعدة <code>prefer-template template-curly-spacing</code> في ESLint).
		</p>

		<p>
			<strong>لماذا؟</strong> تجعل القوالب النصيّة الشفرة أكثر مقروئية وإيجازًا، مع أسطر جديدة مناسبة وميزات حشو النصوص.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_58" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> sayHi</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'How are you, '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name </span><span class="pun">+</span><span class="pln"> </span><span class="str">'?'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> sayHi</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">[</span><span class="str">'How are you, '</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">,</span><span class="pln"> </span><span class="str">'?'</span><span class="pun">].</span><span class="pln">join</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> sayHi</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="typ">How</span><span class="pln"> are you</span><span class="pun">,</span><span class="pln"> $</span><span class="pun">{</span><span class="pln"> name </span><span class="pun">}?`;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> sayHi</span><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="typ">How</span><span class="pln"> are you</span><span class="pun">,</span><span class="pln"> $</span><span class="pun">{</span><span class="pln">name</span><span class="pun">}?`;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تطبّق أبدًا <code>()eval</code> على النصوص، لأنها تتسبّب في الكثير من الثغرات. استخدم قاعدة <code>no-eval</code> في ESLint. تجنب تخليص الأحرف (Escape characters) في النصوص قدر الإمكان. <strong>لماذا؟</strong> الخط المائل العكسي يضر بالمقروئية، وبالتالي يجب ألًا يُستخدم إلا عند الضرورة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_60" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'\'this\' \i\s \"quoted\"'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'\'this\' is "quoted"'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">`</span><span class="pln">my name is </span><span class="str">'${name}'</span><span class="pun">`;</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الدوال
</h2>

<ul>
<li>
		<p>
			استخدم الدوال العبارات (Function expressions) المُسماة بدلًا من التصريح بالدوال (قاعدة <a href="https://eslint.org/docs/rules/func-style" rel="external nofollow">func-style</a> في ESLint). <strong>لماذا؟</strong> يضع محرَك جافاسكريبت الدوال المُصرَّح بها في بداية النطاق (تُعرَف هذه العملية بالرفع Hoist)، وبالتالي يمكن استخدام الدالة قبل تعريفها في الملف. يعني ذلك أنه سيكون من السهل الإحالة إلى الدالة قبل أن تُعرَّف في الملف، وهو ما يضر المقروئية وقابلية الصيانة. إذا وجدت أن تعريف دالة ما كبير أو معقد حدّ الإرباك، فربما حان الوقت لوضعه في وحدة خاصة به! لا تنس أن تُسمّي العبارة صراحة، بغض النظر عما إذا كان الاسم مستنتجًا من المتغير الحاوي (كما هو الحال غالبًا في المتصفحات الحديثة أو عند استخدام مصرّفات مثل Babel) أم لا. تلغي هذه الطريقة أي افتراضات حول مكدس النداء إلى الخطأ Error’s call stack
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_62" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="com">// اسم العبارة الدالة مغاير لاسم الاستدعاء الذي يحيل إلى المتغيّر</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="kwd">short</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> longUniqueMoreDescriptiveLexicalFoo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع الدوال العبارات فورية الاستدعاء (Immediately-invoked Function Expression، أو IIFE اختصارًا)، ضعها بين قوسين. استخدم قاعدة <a href="https://eslint.org/docs/rules/wrap-iife.html" rel="external nofollow">wrap-iife</a> في ESLint. <strong>لماذا؟</strong> الدوال العباراة فورية الاستدعاء هي وحدة منفردة، لذلك وضعها، هي وعبارة استدعائها، بين قوسين يجعل الشفرة واضحة. وإن كان من المستبعد جدّا أن تحتاج الدوال فورية الاستدعاء (IIFE) في مشاريع تكثر من استخدام الوحدات الوظيفية (Modules).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_64" style="">
<span class="com">// immediately-invoked function expression (IIFE)</span><span class="pln">
</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Welcome to the Internet. Please follow me.'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}());</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تصرّح أبدًا بالدوال في كتلة غير خاصة بالدوال (مثل <code>if</code>، و<code>while</code>، …إلخ). أسند الدالة إلى متغير بدلًا من ذلك. تسمح المتصفحات بالتصريح بالدالة في تلك الكتل، إلّا أنها ستفسرها بطرق مختلفة، وهو أمر لا يحبه المبرمجون. استخدم قاعدة no-<a href="https://eslint.org/docs/rules/no-loop-func.html" rel="external nofollow">loop-func</a> في ESLint.
		</p>
	</li>
	<li>
		<p>
			<strong>ملحوظة</strong>: يعرّف معيار ECMA-262 الكتلة (Block) بأنها قائمة من التعليمات البرمجية (Statements). والتصريح بدالة (Function decleration) ليس تعليمة
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_66" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">currentUser</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Nope.'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
let test</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">currentUser</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  test </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Yup.'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تسمّي معاملًا بالاسم <code>arguments</code>. لأنه سيأخذ الأسبقية على الكائن <code>arguments</code> الذي يُحدد تلقائيّا في نطاق كل دالة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_68" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> options</span><span class="pun">,</span><span class="pln"> arguments</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> options</span><span class="pun">,</span><span class="pln"> args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستخدم أبدًا المعامل <code>arguments</code>، واستخدم بدلًا منه عامل التمديد (<code>...</code>). <strong>لماذا؟</strong> عامل التمديد واضح في تحديد الوسائط التي تريد سحبها. بالإضافة إلى ذلك، وسائط عامل التمديد هي مصفوفة حقيقة، وليست شبيهة بالمصفوفة مثل الكائن <code>arguments</code>. استخدم قاعدة <a href="https://eslint.org/docs/rules/prefer-rest-params" rel="external nofollow">prefer-rest-params</a> في ESLint.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_70" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> concatenateAll</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> args </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">arguments</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> args</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">''</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> concatenateAll</span><span class="pun">(...</span><span class="pln">args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> args</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">''</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم الصيغة الافتراضية للمعاملات بدلًا من التعديل على وسائط الدالة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_72" style="">
<span class="com">// سيئ جدّا</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> handleThings</span><span class="pun">(</span><span class="pln">opts</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// لا! يجب ألّا نعدّل على وسائط الدالة.</span><span class="pln">
  </span><span class="com">// أمر سيئ آخر: إذا كانت قيمة الوسيط opts تساوي القيمة المنطقية false فسيُسنَد كائن إلى الوسيط opts، وهو ما قد تريده إلّا أنه يتسبب في ثغرات تصعب ملاحظتها</span><span class="pln">
  opts </span><span class="pun">=</span><span class="pln"> opts </span><span class="pun">||</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ أيضا</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> handleThings</span><span class="pun">(</span><span class="pln">opts</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">opts </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    opts </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> handleThings</span><span class="pun">(</span><span class="pln">opts </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنب الآثار الجانبية في المعاملات الافتراضية. <strong>لماذا؟</strong> لأنّها مربكة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_74" style="">
<span class="kwd">var</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> count</span><span class="pun">(</span><span class="pln">a </span><span class="pun">=</span><span class="pln"> b</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">a</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
count</span><span class="pun">();</span><span class="pln">  </span><span class="com">// 1</span><span class="pln">
count</span><span class="pun">();</span><span class="pln">  </span><span class="com">// 2</span><span class="pln">
count</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 3</span><span class="pln">
count</span><span class="pun">();</span><span class="pln">  </span><span class="com">// 3</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع دائمًا المعاملات الافتراضية في الأخير.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_76" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> handleThings</span><span class="pun">(</span><span class="pln">opts </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{},</span><span class="pln"> name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> handleThings</span><span class="pun">(</span><span class="pln">name</span><span class="pun">,</span><span class="pln"> opts </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستخدم أبدًا منشئ الدوال (Function constructor) لإنشاء دالة جديدة. استخدم قاعدة <a href="https://eslint.org/docs/rules/no-new-func" rel="external nofollow">no-new-func</a> في ESLint. <strong>لماذا؟</strong> إنشاء دالة بهذه الطريقة يتضمّن تقييم نص كما تفعل <code>()eval</code>، وهو ما يفتح نقاط ضعف.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_78" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> add </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Function</span><span class="pun">(</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'return a + b'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// سيئ كذلك</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> subtract </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Function</span><span class="pun">(</span><span class="str">'a'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'b'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'return a - b'</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع مسافات في توقيع الدالة. استخدم قاعدتي <code>space-before-function-paren</code> و<code>space-before-blocks</code> في ESLint. <strong>لماذا؟</strong> الاتساق أمر جيد، كما لن تكون مضطرًا لإضافة أو إزالة مسافة عند إضافة أو إزالة اسم.
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_80" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> f </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(){};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> g </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(){};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> h </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> a</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{};</span></pre>

<ul>
<li>
		<p>
			لا تعدّل أبدًا على المعاملات. استخدم قاعدة <a href="https://eslint.org/docs/rules/no-param-reassign.html" rel="external nofollow">no-param-reassign</a> في ESLint. <strong>لماذا؟</strong> يمكن للتعديل على الكائنات التي مُرُرت كمعاملات أن يتسبب في آثار جانبية غير مرغوب فيها في المستدعي الأصلي.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_82" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> f1</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  obj</span><span class="pun">.</span><span class="pln">key </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> f2</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> key </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">hasOwnProperty</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">,</span><span class="pln"> </span><span class="str">'key'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> obj</span><span class="pun">.</span><span class="pln">key </span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تُعد إسناد المعاملات. استخدم قاعدة <a href="https://eslint.org/docs/rules/no-param-reassign.html" rel="external nofollow">no-param-reassign</a> في ESLint. <strong>لماذا؟</strong> إعادة إسناد المعاملات يمكن أن يؤدي إلى سلوك غير متوقع، خصوصًا عند التعامل مع الكائن arguments. كما يمكن أن يسبب مشاكل في الأداء، خصوصا في V8.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_84" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> f1</span><span class="pun">(</span><span class="pln">a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> f2</span><span class="pun">(</span><span class="pln">a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> f3</span><span class="pun">(</span><span class="pln">a</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">||</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> f4</span><span class="pun">(</span><span class="pln">a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			من الأفضل استخدام استخدام عامل التمديد (<code>...</code>) لاستدعاء الدوال متغيرة عدد الوسائط (Variadic functions). استخدم قاعدة <a href="https://eslint.org/docs/rules/prefer-spread" rel="external nofollow">prefer-spread</a> في ESLint. <strong>لماذا؟</strong> لأنها أوضح، فلست مضطرًّا لتجهيز السياق، كما لا يمكنك أن تجمع بسهولة <code>new</code> مع <code>apply</code>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_86" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">];</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="pln">console</span><span class="pun">,</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">];</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(...</span><span class="pln">x</span><span class="pun">);</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">new</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Function</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">bind</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="typ">Date</span><span class="pun">,</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">null</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2016</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]));</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">(...[</span><span class="lit">2016</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">]);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			الدوال التي لها توقيعات أو استدعاءات متعددة الأسطر، ينبغي أن تكون مسافاتها البادئة تمامًا مثل كل القوائم متعددة الأسطر الأخرى في هذا الدليل، بمعنى أن كل عنصر في سطر، مع فاصلة زائدة بعد العنصر الأخير.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_88" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">bar</span><span class="pun">,</span><span class="pln">
             baz</span><span class="pun">,</span><span class="pln">
             quux</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">
  bar</span><span class="pun">,</span><span class="pln">
  baz</span><span class="pun">,</span><span class="pln">
  quux</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">,</span><span class="pln">
  bar</span><span class="pun">,</span><span class="pln">
  baz</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">
  foo</span><span class="pun">,</span><span class="pln">
  bar</span><span class="pun">,</span><span class="pln">
  baz</span><span class="pun">,</span><span class="pln">
</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الدوال السهمية Arrow Functions
</h2>

<ul>
<li>
		<p>
			استخدم صيغة الدالة السهمية عندما تكون مضطرًّا لاستخدام دالة مجهولة (Anonymous function)، مثلًا عند تمرير ردّ نداء (Callback) على السطر. استخدم قاعدتي <a href="https://eslint.org/docs/rules/prefer-arrow-callback.html" rel="external nofollow">prefer-arrow-callback</a> و<a href="https://eslint.org/docs/rules/arrow-spacing.html" rel="external nofollow">arrow-spacing</a> في ESlint.
		</p>

		<p>
			<strong>لماذا؟</strong> لأنها تخلق نسخة من الدالة تُنفَّذ في السياق <code>this</code>، وهو عادةً ما ترغب فيه، كما أنها أكثر إيجازا.
		</p>

		<p>
			<strong>متى تتخلّى عنها؟</strong> إذا كانت لديك دالة معقدة، فيمكنك نقل وظيفتها إلى دالة عبارة مُسمّاة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_90" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">((</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			إن كان متن الدالة يتكون من تعليمة واحدة تُرجِع تعبيرًا دون آثار جانبية، فاحذف القوسين المعقوصيْن (<code>{}</code>) واستخدم الإرجاع الضمني (بدون التعليمة <code>return</code>). خلافًا لذلك، أبق على الأقواس المعقوصة واستخدم التعليمة <code>return</code>. استعن بقاعدتي <a href="https://eslint.org/docs/rules/arrow-parens.html" rel="external nofollow">arrow-parens</a> و <a href="https://eslint.org/docs/rules/arrow-body-style.html" rel="external nofollow">arrow-body-style</a> في ESLint.
		</p>

		<p>
			<strong>لماذا؟</strong> تسهيل قراءة الشفرة عند استخدام دوال بالتسلسل.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_92" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">number </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> nextNumber </span><span class="pun">=</span><span class="pln"> number </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">`</span><span class="pln">A string containing the $</span><span class="pun">{</span><span class="pln">nextNumber</span><span class="pun">}.`;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">number </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">`</span><span class="pln">A string containing the $</span><span class="pun">{</span><span class="pln">number</span><span class="pun">}.`);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">((</span><span class="pln">number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> nextNumber </span><span class="pun">=</span><span class="pln"> number </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="pln">A string containing the $</span><span class="pun">{</span><span class="pln">nextNumber</span><span class="pun">}.`;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">((</span><span class="pln">number</span><span class="pun">,</span><span class="pln"> index</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">({</span><span class="pln">
  </span><span class="pun">[</span><span class="pln">index</span><span class="pun">]:</span><span class="pln"> number</span><span class="pun">,</span><span class="pln">
</span><span class="pun">}));</span><span class="pln">

</span><span class="com">// لا يوجد إرجاع ضمني لكن توجد آثار جانبية</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">(</span><span class="pln">callback</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> callback</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">val </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">//  افعل شيئًا هنا إذا كان رد النداء إيجابيا</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

let bool </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
foo</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> bool </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
foo</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bool </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			في حال امتد التعبير عبر عدة أسطر، ضعه بين قوسين لمقروئية أكبر. <strong>لماذا؟</strong> لتوضيح أين تبدأ وأين تنتهي الدالة.
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_94" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="pun">[</span><span class="str">'get'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'post'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'put'</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">httpMethod </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">hasOwnProperty</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">
    httpMagicObjectWithAVeryLongName</span><span class="pun">,</span><span class="pln">
    httpMethod</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">)</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="str">'get'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'post'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'put'</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">httpMethod </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
  </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">hasOwnProperty</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">
    httpMagicObjectWithAVeryLongName</span><span class="pun">,</span><span class="pln">
    httpMethod</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">)</span><span class="pln">
</span><span class="pun">));</span></pre>

<ul>
<li>
		<p>
			أضف دائمًا أقواسًا حول الوسائط من أجل الوضوح والتناسق. استعن بقاعدة <a href="https://eslint.org/docs/rules/arrow-parens.html" rel="external nofollow">arrow-parens</a> في ESlint.
		</p>

		<p>
			<strong>لماذا؟</strong> تقليل الأخطاء عند إضافة وسائط أو حذفها.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_96" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">((</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> x</span><span class="pun">);</span><span class="pln">

</span><span class="com">// سيّئ</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">number </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
  </span><span class="pun">`</span><span class="pln">A </span><span class="kwd">long</span><span class="pln"> string </span><span class="kwd">with</span><span class="pln"> the $</span><span class="pun">{</span><span class="pln">number</span><span class="pun">}.</span><span class="pln"> </span><span class="typ">It</span><span class="pun">’</span><span class="pln">s so </span><span class="kwd">long</span><span class="pln"> that we don</span><span class="pun">’</span><span class="pln">t want it to take up space on the </span><span class="pun">.</span><span class="pln">map line</span><span class="pun">!`</span><span class="pln">
</span><span class="pun">));</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">((</span><span class="pln">number</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
  </span><span class="pun">`</span><span class="pln">A </span><span class="kwd">long</span><span class="pln"> string </span><span class="kwd">with</span><span class="pln"> the $</span><span class="pun">{</span><span class="pln">number</span><span class="pun">}.</span><span class="pln"> </span><span class="typ">It</span><span class="pun">’</span><span class="pln">s so </span><span class="kwd">long</span><span class="pln"> that we don</span><span class="pun">’</span><span class="pln">t want it to take up space on the </span><span class="pun">.</span><span class="pln">map line</span><span class="pun">!`</span><span class="pln">
</span><span class="pun">));</span><span class="pln">

</span><span class="com">// سيّئ</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">].</span><span class="pln">map</span><span class="pun">((</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">*</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنب الخلط بين صياغة الدوال السهمية (<code>=&gt;</code>) وبين عوامل المقارنة (<code>&lt;=</code> , <code>&gt;=</code>). استعن بقاعدة <a href="https://eslint.org/docs/rules/no-confusing-arrow" rel="external nofollow">no-confusing-arrow</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_98" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> itemHeight </span><span class="pun">=</span><span class="pln"> item </span><span class="pun">=&gt;</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">height </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">256</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">largeSize </span><span class="pun">:</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">smallSize</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> itemHeight </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">item</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">height </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">256</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">largeSize </span><span class="pun">:</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">smallSize</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> itemHeight </span><span class="pun">=</span><span class="pln"> item </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">item</span><span class="pun">.</span><span class="pln">height </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">256</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">largeSize </span><span class="pun">:</span><span class="pln"> item</span><span class="pun">.</span><span class="pln">smallSize</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> itemHeight </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">item</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> height</span><span class="pun">,</span><span class="pln"> largeSize</span><span class="pun">,</span><span class="pln"> smallSize </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> item</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> height </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">256</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> largeSize </span><span class="pun">:</span><span class="pln"> smallSize</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			افرض موقع متن الدوال السهميّة عن طريق الإرجاع الضمني (Implicit return). استعن بقاعدة <a href="https://eslint.org/docs/rules/implicit-arrow-linebreak" rel="external nofollow">implicit-arrow-linebreak</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_100" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln">
  bar</span><span class="pun">;</span><span class="pln">

</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln">
  </span><span class="pun">(</span><span class="pln">bar</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> bar</span><span class="pun">;</span><span class="pln">
</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bar</span><span class="pun">);</span><span class="pln">
</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
   bar
</span><span class="pun">)</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الأصناف والمُنشِئات Classes &amp; Constructors
</h2>

<ul>
<li>
		<p>
			استخدم دائمًا الكلمة المفتاحية <code>class</code>. وتجنب التعامل مع الخاصيّة <code>prototype</code> مباشرة. <strong>لماذا؟</strong> العبارة <code>class</code> أكثر إيجازا ووضوحا.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_102" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> </span><span class="typ">Queue</span><span class="pun">(</span><span class="pln">contents </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[...</span><span class="pln">contents</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="typ">Queue</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">pop </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> value </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue</span><span class="pun">.</span><span class="pln">splice</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Queue</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">(</span><span class="pln">contents </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[...</span><span class="pln">contents</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  pop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> value </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue</span><span class="pun">.</span><span class="pln">splice</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم الكلمة المفتاحية <code>extends</code> للتوارث بين الأصناف.
		</p>

		<p>
			<strong>لماذا؟</strong> لأنها وسيلة مدمجة لوارثة الوظائف من النموذج الأولي دون التسبب بمشاكل عند استخدام العامل <code>instanceof</code>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_104" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> inherits </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'inherits'</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> </span><span class="typ">PeekableQueue</span><span class="pun">(</span><span class="pln">contents</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Queue</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> contents</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
inherits</span><span class="pun">(</span><span class="typ">PeekableQueue</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Queue</span><span class="pun">);</span><span class="pln">
</span><span class="typ">PeekableQueue</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">peek </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">PeekableQueue</span><span class="pln"> extends </span><span class="typ">Queue</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  peek</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">queue</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يمكن للتوابع أن تُرجع الكائن <code>this</code> للمساعدة استخدام التوابع بالتسلسل.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_106" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="typ">Jedi</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">jump </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">jumping </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="typ">Jedi</span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">setHeight </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">(</span><span class="pln">height</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">height </span><span class="pun">=</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> luke </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Jedi</span><span class="pun">();</span><span class="pln">
luke</span><span class="pun">.</span><span class="pln">jump</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; true</span><span class="pln">
luke</span><span class="pun">.</span><span class="pln">setHeight</span><span class="pun">(</span><span class="lit">20</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; undefined</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Jedi</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  jump</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">jumping </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  setHeight</span><span class="pun">(</span><span class="pln">height</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">height </span><span class="pun">=</span><span class="pln"> height</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> luke </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Jedi</span><span class="pun">();</span><span class="pln">

luke</span><span class="pun">.</span><span class="pln">jump</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">setHeight</span><span class="pun">(</span><span class="lit">20</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا بأس في تخصيص التابع <code>()toString</code>، لكن تأكد من أنه يعمل بسلاسة ولا تتسبب في أي آثار جانبية.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_108" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Jedi</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">(</span><span class="pln">options </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> options</span><span class="pun">.</span><span class="pln">name </span><span class="pun">||</span><span class="pln"> </span><span class="str">'no name'</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  getName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  toString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">`</span><span class="typ">Jedi</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> $</span><span class="pun">{</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getName</span><span class="pun">()}`;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			توجد منشئات افتراضية للأصناف يُلجَا إليها إنْ لم يُحدّد منشئ سلفا. لذا، فلا حاجة لمنشئات فارغة أو منشئات تقتصر على الإنابة عن الصنف الأب. استعن بقاعدة <a href="https://eslint.org/docs/rules/no-useless-constructor" rel="external nofollow">no-useless-constructor</a> في ESLint.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_110" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Jedi</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

  getName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Rey</span><span class="pln"> extends </span><span class="typ">Jedi</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">(...</span><span class="pln">args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">(...</span><span class="pln">args</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Rey</span><span class="pln"> extends </span><span class="typ">Jedi</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">(...</span><span class="pln">args</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">(...</span><span class="pln">args</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Rey'</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنب تكرار عناصر الصنف. استعن بقاعدة <a href="https://eslint.org/docs/rules/no-dupe-class-members" rel="external nofollow">no-dupe-class-members</a> في ESLint.
		</p>

		<p>
			<strong>لماذا؟</strong> في حال التصريح المكرر لعنصر من عناصر الصنف، فالقيمة الأخيرة فقط هي التي ستُعتمَد. وجود التكرار يعني بالضرورة وجود علّة في الشفرة البرمجية.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_112" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يجب أن تستخدم توابع الصنف الكائن <code>this</code> أو تُدرَج في تابع ثابت (Static) إلّا إذا استدعت مكتبة خارجية أو إطار عمل استخدام توابع غير ثابتة. كون التابع مرتبطًا بنظير كائن (Instance) يجب أن يشير إلى أنه يتصرف بسلوك مختلف حسب خاصيّات الكائن المستقبل. استعن بالقاعدة <a href="https://eslint.org/docs/rules/class-methods-use-this" rel="external nofollow">class-methods-use-this</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_114" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'bar'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد، استخدام this</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">bar</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد، المنشئ مستثنى من القاعدة</span><span class="pln">
  constructor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد، يفترض ألا تستخدم التوابع الثابتة الكائن this</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">static</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'bar'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الوحدات Modules
</h2>

<ul>
<li>
		<p>
			استخدم دائمًا الكلمتيْن المفتاحيتيْن (<code>import</code>/<code>export</code>) لاستيراد أو تصدير الوحدات، بدلًا من الطرق الأخرى غير القياسية. يمكنك دائمًا تصريف الوحدات المفضلة لديك إلى شفرة جافاسكريبت (Transpile).
		</p>

		<p>
			<strong>لماذا؟</strong> الوحدات هي المستقبل، دعونا نُدشن المستقبل منذ الآن.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_116" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">AirbnbStyleGuide</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">);</span><span class="pln">
module</span><span class="pun">.</span><span class="pln">exports </span><span class="pun">=</span><span class="pln"> </span><span class="typ">AirbnbStyleGuide</span><span class="pun">.</span><span class="pln">es6</span><span class="pun">;</span><span class="pln">

</span><span class="com">// مقبول</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AirbnbStyleGuide</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> </span><span class="typ">AirbnbStyleGuide</span><span class="pun">.</span><span class="pln">es6</span><span class="pun">;</span><span class="pln">

</span><span class="com">// أفضل</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> es6 </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> es6</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تعتمد على محارف البدل (Wild card) في استيراد الوحدات (الاستيراد بالجملة).
		</p>

		<p>
			<strong>لماذا؟</strong> لتتأكد من أنّ لديك تصديرًا افتراضيّا واحدا.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_118" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> as </span><span class="typ">AirbnbStyleGuide</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">AirbnbStyleGuide</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تُصدّر مباشرةً من الاستيراد.
		</p>

		<p>
			<strong>لماذا؟</strong> على الرغم من أن الكتابة في سطر واحد تكون أوجز، إلّا أن وجود طريقة واضحة واحدة للاستيراد وأخرى للتصدير يجعل الأمور متسقة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_120" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="com">// filename es6.js</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> es6 as </span><span class="kwd">default</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="com">// filename es6.js</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> es6 </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> es6</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استورد من مسار معيّن في مكان واحد فقط. استعن بقاعدة <a href="https://eslint.org/docs/rules/no-duplicate-imports" rel="external nofollow">no-duplicate-imports</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> وجود عدة أسطر تستورد من المسار نفسه يمكن أن يجعل الشفرة أقل قابلية للصيانة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_122" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> foo from </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">
</span><span class="com">// … some other imports … //</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> named1</span><span class="pun">,</span><span class="pln"> named2 </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> foo</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> named1</span><span class="pun">,</span><span class="pln"> named2 </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> foo</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  named1</span><span class="pun">,</span><span class="pln">
  named2</span><span class="pun">,</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> from </span><span class="str">'foo'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تُصدر الارتباطات المتحوّلة (Mutable bindings). استعن بقاعدة <a href="https://eslint.org/docs/rules/no-duplicate-imports" rel="external nofollow">no-duplicate-imports</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> يُفضّل عمومًا تجنب العناصر المتحولة، ولكن على وجه الخصوص عند تصدير الارتباطات المتحولة. على الرغم من أن هذا الأسلوب قد يكون ضروريّا في حالات خاصة، إلّا أنّ القاعدة الأساسية هي ألّا تُصدرَ إلا المراجع الثابتة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_124" style="">
<span class="com">// سيئ</span><span class="pln">
let foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> foo </span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> foo </span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			في الوحدات التي فيها تصدير واحد فقط، يفضل استخدام التصدير الافتراضي بدلًا من التصدير المسمى named export. استعن بقاعدة <a href="https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/prefer-default-export.md" rel="external nofollow">import/prefer-default-export.</a>
		</p>

		<p>
			<strong>لماذا؟</strong> لتشجيع استخدام الملفات التي لا تصدر إلًا شيئًا واحدًا فقط، لأن ذلك أفضل وأسهل للقراءة والصيانة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_126" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع كل عبارات <code>import</code> فوق عبارات الاستيراد الأخرى. استعن بقاعدة <a href="https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/first.md" rel="external nofollow">import/first</a> في ESLint.
		</p>

		<p>
			<strong>لماذا؟</strong> بما أن محرّك جافاسكريبت يرفع تعليمات <code>import</code> إلى أعلى النطاق (Hoisted)، فوضعها كلها في الجزء العلوي يمنع أي سلوك غير متوقع.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_128" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> foo from </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">
foo</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span><span class="pln">

</span><span class="kwd">import</span><span class="pln"> bar from </span><span class="str">'bar'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> foo from </span><span class="str">'foo'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> bar from </span><span class="str">'bar'</span><span class="pun">;</span><span class="pln">

foo</span><span class="pun">.</span><span class="pln">init</span><span class="pun">();</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يجب أن توضع مسافة بادئة قبل عناصر الاستيراد ذي الأسطر المتعدّدة، مثله مثل المصفوفات متعددة الأسطر والكائنات مصنّفة النوع (Object literals). استعن بالقاعدة <a href="https://eslint.org/docs/rules/object-curly-newline" rel="external nofollow">object-curly-newline</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> تتبع الأقواس المعقوصة قواهد المسافات البادئة ذاتها التي تتبعها كتل الأقواس المعقوصة الأخرى في هذا الدليل. الأمر نفسه ينطبق على الفواصل الزائدة (Trailing commas).
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_130" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln">longNameA</span><span class="pun">,</span><span class="pln"> longNameB</span><span class="pun">,</span><span class="pln"> longNameC</span><span class="pun">,</span><span class="pln"> longNameD</span><span class="pun">,</span><span class="pln"> longNameE</span><span class="pun">}</span><span class="pln"> from </span><span class="str">'path'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  longNameA</span><span class="pun">,</span><span class="pln">
  longNameB</span><span class="pun">,</span><span class="pln">
  longNameC</span><span class="pun">,</span><span class="pln">
  longNameD</span><span class="pun">,</span><span class="pln">
  longNameE</span><span class="pun">,</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> from </span><span class="str">'path'</span><span class="pun">;</span></pre>

<ul>
<li>
		<p>
			لا تسمح بصيغة Webpack للتحميل في تعليمات استيراد الوحدات. استعن بالقاعدة <a href="https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/no-webpack-loader-syntax.md" rel="external nofollow">import/no-webpack-loader-syntax</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> لأن استخدام صيغة Webpack في الاستيراد تجعل الشفرة معتمدة على محزّم (Bundler). من الأفضل استخدام صيغة Webpack في الملف <code>webpack.config.js</code>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_132" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> fooSass from </span><span class="str">'css!sass!foo.scss'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> barCss from </span><span class="str">'style!css!bar.css'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> fooSass from </span><span class="str">'foo.scss'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> barCss from </span><span class="str">'bar.css'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تُضمّن امتداد ملفات جافاسكريبت في الاستيراد. استعن بالقاعدة <a href="https://github.com/benmosher/eslint-plugin-import/blob/master/docs/rules/extensions.md" rel="external nofollow">import/extensions</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> لأن تضمين الامتدادات يصعّب إعادة كتابة الشفرة، ويضع لدى جميع العملاء تفاصيل غير مناسبة عن الوحدة التي تستوردها.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_134" style="">
<span class="com">// سيّئ </span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> foo from </span><span class="str">'./foo.js'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> bar from </span><span class="str">'./bar.jsx'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> baz from </span><span class="str">'./baz/index.jsx'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> foo from </span><span class="str">'./foo'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> bar from </span><span class="str">'./bar'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> baz from </span><span class="str">'./baz'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	المُكرّرات والمولّدات
</h2>

<ul>
<li>
		<p>
			لا تستخدم المكررات (Iterators). من الأفضل استخدام دوال الدرجات العليا لجافاسكريبت بدلًا من الحلقات مثل<code>for-in</code> أو <code>for-of</code>.
		</p>

		<p>
			<strong>لماذا؟</strong> هذا يتماشى مع قاعدة انعدام التحول (Immutable rule) التي ننتهجها. التعامل مع الدوال التي تُرجع قيمًا أسهل للفهم مقارنة بالدوال ذات الآثار الجانبية. استعن بقاعدتي <a href="https://eslint.org/docs/rules/no-iterator.html" rel="external nofollow">no-iterator</a> و<a href="https://eslint.org/docs/rules/no-restricted-syntax" rel="external nofollow">no-restricted-syntax</a>.
		</p>

		<p>
			استخدم الدوال <code>()map</code> / <code>every()</code> / <code>filter()</code>، <code>find()</code> / <code>findIndex()</code> / <code>reduce()</code> / <code>some</code> / للمرور على المصفوفات، والتوابع <code>()Object.keys</code> / <code>Object.values()</code> / <code>Object.entries</code> لإنتاج مصفوفات حتى تتمكن من المرور على عناصر الكائن.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_136" style="">
<span class="kwd">const</span><span class="pln"> numbers </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">];</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
let sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">let num of numbers</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  sum </span><span class="pun">+=</span><span class="pln"> num</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
sum </span><span class="pun">===</span><span class="pln"> </span><span class="lit">15</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
let sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
numbers</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  sum </span><span class="pun">+=</span><span class="pln"> num</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">
sum </span><span class="pun">===</span><span class="pln"> </span><span class="lit">15</span><span class="pun">;</span><span class="pln">

</span><span class="com">// أفضل (استخدام فعالية الدوال، برمجة وظيفية)</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="pln">reduce</span><span class="pun">((</span><span class="pln">total</span><span class="pun">,</span><span class="pln"> num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> total </span><span class="pun">+</span><span class="pln"> num</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
sum </span><span class="pun">===</span><span class="pln"> </span><span class="lit">15</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> increasedByOne </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">let i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> numbers</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  increasedByOne</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> increasedByOne </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[];</span><span class="pln">
numbers</span><span class="pun">.</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  increasedByOne</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="pln">num </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// أفضل (الاعتماد على التصور الوظيفي)</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> increasedByOne </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="pln">map</span><span class="pun">(</span><span class="pln">num </span><span class="pun">=&gt;</span><span class="pln"> num </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستخدم المولدات (Generators) في الوقت الراهن.
		</p>

		<p>
			<strong>لماذا؟</strong> لأنها لا تُصرَّف على نحو جيّد إلى ES5.
		</p>
	</li>
	<li>
		<p>
			إذا كان عليك استخدام المُولدات، أو إذا أردت تجاهل نصيحتنا، تأكد من أن تواقيع دوالها متباعدة بشكل صحيح. استعن بالقاعدة <a href="https://eslint.org/docs/rules/generator-star-spacing" rel="external nofollow">generator-star-spacing</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> <code>function</code> و <code>*</code> هما كلمتان مفتاحيتان من نفس المفهوم، فالكلمة المفتاحية <code>*</code> ليست تعديلًا للكلمة المفتاحية <code>function</code>، و <code>function*</code> مختلفة عن <code>function</code>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_138" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> baz </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">*()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> quux </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">*()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pun">*</span><span class="pln">foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> </span><span class="pun">*</span><span class="pln">foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ جدّا</span><span class="pln">
</span><span class="kwd">function</span><span class="pln">
</span><span class="pun">*</span><span class="pln">
foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ جدّا</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> wat </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln">
</span><span class="pun">*</span><span class="pln">
</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pun">*</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">*</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الخصائص
</h2>

<ul>
<li>
		<p>
			استخدم أسلوب الترميز بالنقطة (Dot notation) عند الدخول إلى الخصائص.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_140" style="">
<span class="kwd">const</span><span class="pln"> luke </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  jedi</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
  age</span><span class="pun">:</span><span class="pln"> </span><span class="lit">28</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> isJedi </span><span class="pun">=</span><span class="pln"> luke</span><span class="pun">[</span><span class="str">'jedi'</span><span class="pun">];</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> isJedi </span><span class="pun">=</span><span class="pln"> luke</span><span class="pun">.</span><span class="pln">jedi</span><span class="pun">;</span></pre>

		<p>
			استخدام المعقوفتين <code>[]</code> عند الدخول إلى الخاصيّات بواسطة متغير.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_142" style="">
<span class="kwd">const</span><span class="pln"> luke </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  jedi</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
  age</span><span class="pun">:</span><span class="pln"> </span><span class="lit">28</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> getProp</span><span class="pun">(</span><span class="pln">prop</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> luke</span><span class="pun">[</span><span class="pln">prop</span><span class="pun">];</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> isJedi </span><span class="pun">=</span><span class="pln"> getProp</span><span class="pun">(</span><span class="str">'jedi'</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدام العامل الأسي <code>**</code> عند حساب الأسّ.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_144" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> binary </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">pow</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> binary </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">**</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	المتغيرات
</h2>

<ul>
<li>
		<p>
			استخدم دومًا <code>const</code> أو <code>let</code> للتصريح بالمتغيرات. عدم القيام بذلك سيؤدي إلى إنشاء متغيرات عامة، في حين نريد تجنب تلويث فضاء الأسماء العام (Global namespace). استعن بقاعدتيْ <a href="https://eslint.org/docs/rules/no-undef" rel="external nofollow">no-undef</a> و<a href="https://eslint.org/docs/rules/prefer-const" rel="external nofollow">prefer-const</a>.
		</p>

		<pre class="ipsCode">
// سيئ
superPower = new SuperPower();

// جيّد
const superPower = new SuperPower();
</pre>
	</li>
	<li>
		<p>
			صرّح باستخدام <code>const</code> أو <code>let</code> لكل متغيّر على حدة. استعن بقاعدة <a href="https://eslint.org/docs/rules/one-var.html" rel="external nofollow">one-var</a> في ESlint.
		</p>

		<p>
			<strong>لماذا؟</strong> من الأسهل إضافة متغيرات جديدة بهذه الطريقة، ولن تكون مضطرا لإبدال الفاصلة المنقوطة <code>;</code> بفاصلة <code>,</code> كل ما أردت إضافة متغيّر جديد، وستتخلّص من التعديلات المقتصرة على علامات التنقيط. ستتمكّن كذلك من المرور خلال التنقيح (Debugging) على كل متغيّر على حدة، بدلًا من القفز عليها كلها في وقت واحد.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_146" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> items </span><span class="pun">=</span><span class="pln"> getItems</span><span class="pun">(),</span><span class="pln">
    goSportsTeam </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln">
    dragonball </span><span class="pun">=</span><span class="pln"> </span><span class="str">'z'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ (قارن بالتصريح فوقه لتعثر على الخطأ)</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> items </span><span class="pun">=</span><span class="pln"> getItems</span><span class="pun">(),</span><span class="pln">
    goSportsTeam </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
    dragonball </span><span class="pun">=</span><span class="pln"> </span><span class="str">'z'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> items </span><span class="pun">=</span><span class="pln"> getItems</span><span class="pun">();</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> goSportsTeam </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> dragonball </span><span class="pun">=</span><span class="pln"> </span><span class="str">'z'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			جمّع كل التصريحات بالكلمة المفتاحية <code>const</code> ثم بعدها التصريحات بالكلمة المفتاحية <code>let</code>.
		</p>

		<p>
			<strong>لماذا؟</strong> سيكون هذا مفيدًا لاحقًا عندما تحتاج إلى إسناد متغير اعتمادًا على متغير مُسنَد مسبقا.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_148" style="">
<span class="com">// سيئ</span><span class="pln">
let i</span><span class="pun">,</span><span class="pln"> len</span><span class="pun">,</span><span class="pln"> dragonball</span><span class="pun">,</span><span class="pln">
    items </span><span class="pun">=</span><span class="pln"> getItems</span><span class="pun">(),</span><span class="pln">
    goSportsTeam </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
let i</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> items </span><span class="pun">=</span><span class="pln"> getItems</span><span class="pun">();</span><span class="pln">
let dragonball</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> goSportsTeam </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
let len</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> goSportsTeam </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> items </span><span class="pun">=</span><span class="pln"> getItems</span><span class="pun">();</span><span class="pln">
let dragonball</span><span class="pun">;</span><span class="pln">
let i</span><span class="pun">;</span><span class="pln">
let length</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			أسند المتغيرات حيث تحتاج لذلك، لكن ضعها في مكان مناسب.
		</p>

		<p>
			<strong>لماذا؟</strong> المتغيّرات المصرّح عنها بـ <code>let</code> أو <code>const</code> ذات نطاق كتلي (Block scoped) وليست ذات نطاق دالّي (Function scoped).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_150" style="">
<span class="com">// سيئ، لا حاجة لنداء الدالة</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> checkName</span><span class="pun">(</span><span class="pln">hasName</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> getName</span><span class="pun">();</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">hasName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'test'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">name </span><span class="pun">===</span><span class="pln"> </span><span class="str">'test'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">setName</span><span class="pun">(</span><span class="str">''</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> checkName</span><span class="pun">(</span><span class="pln">hasName</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">hasName </span><span class="pun">===</span><span class="pln"> </span><span class="str">'test'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">const</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> getName</span><span class="pun">();</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">name </span><span class="pun">===</span><span class="pln"> </span><span class="str">'test'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">setName</span><span class="pun">(</span><span class="str">''</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنب الإسناد المتسلسل للمتغيّرات. استعن <a href="https://eslint.org/docs/rules/no-multi-assign" rel="external nofollow">no-multi-assign</a> بقاعدة في ESLint.
		</p>

		<p>
			<strong>لماذا؟</strong> لأن الإسناد المتسلسل ينتج متغيرات عامة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_152" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// يفسّر جافاسكريبت التعليمة أدناه على النحو التالي</span><span class="pln">
  </span><span class="com">// let a = ( b = ( c = 1 ) );</span><span class="pln">
  </span><span class="com">// لا يُطبّق التصريح بـ let إلا على المتغيّر a،</span><span class="pln">
  </span><span class="com">// المتغيّران b وc يصبحان عامين.</span><span class="pln">
  let a </span><span class="pun">=</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> c </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}());</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// يتسبّب في خطأ في المرجع ReferenceError</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">b</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">c</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="pun">(</span><span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  let a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
  let b </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
  let c </span><span class="pun">=</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}());</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">a</span><span class="pun">);</span><span class="pln"> </span><span class="com">// يتسبّب في خطأ في المرجع ReferenceError</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">b</span><span class="pun">);</span><span class="pln"> </span><span class="com">// يتسبّب في خطأ في المرجع ReferenceError</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">c</span><span class="pun">);</span><span class="pln"> </span><span class="com">// يتسبّب في خطأ في المرجع ReferenceError</span><span class="pln">

</span><span class="com">// الأمر نفسه ينطبق على `const`</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنب استخدام عمليات الزيادة والإنقاص الأحادية (<code>++</code>, <code>--</code>). استعن بقاعدة <a href="https://eslint.org/docs/rules/no-plusplus" rel="external nofollow">no-plusplus</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> تخضع عمليات الزيادة والإنقاص الأحادية، حسب وثائق ESLint، لقاعدة الإدراج التلقائي للفواصل المنقوطة، ويمكن أن تتسبب في حدوث أخطاء صامتة مع زيادة أو إنقاص قيمة ضمن التطبيق. كما أنه من الأكثر وضوحًا استخدام <code>num += 1</code> بدلًا من <code>num++</code> أو <code>num ++</code> لتغيير قيم المتغيّرات. تجنُّب استخدام عامل الزيادة والإنقاص الأحادي سيجنبك الزيادة (أو الإنقاص) قبل إجراء عملية، وهو ما يمكن أيضًا أن يسبب سلوكًا غير متوقع في برامجك.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_154" style="">
<span class="com">// سيئ</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">];</span><span class="pln">
let num </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
num</span><span class="pun">++;</span><span class="pln">
</span><span class="pun">--</span><span class="pln">num</span><span class="pun">;</span><span class="pln">

let sum </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
let truthyCount </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">let i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> array</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  let value </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
  sum </span><span class="pun">+=</span><span class="pln"> value</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    truthyCount</span><span class="pun">++;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">];</span><span class="pln">
let num </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
num </span><span class="pun">+=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
num </span><span class="pun">-=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">.</span><span class="pln">reduce</span><span class="pun">((</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> truthyCount </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="typ">Boolean</span><span class="pun">).</span><span class="pln">length</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنّب إدراج الأسطر قبل علامة الإسناد <code>=</code> أو بعدها. أحط القيمة بقوسيْن إنْ كان الإسناد يخرق قاعدة <a href="https://eslint.org/docs/rules/max-len.html" rel="external nofollow">max-len</a> (طول السطر). استعن بقاعدة <a href="https://eslint.org/docs/rules/operator-linebreak.html" rel="external nofollow">operator-linebreak</a>.
		</p>

		<p>
			<strong>لماذا</strong> لأن الأسطر حول <code>=</code> يمكن أن تعتّم على قيمة الإسناد.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_156" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln">
  superLongLongLongLongLongLongLongLongFunctionName</span><span class="pun">();</span><span class="pln">

</span><span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo
  </span><span class="pun">=</span><span class="pln"> </span><span class="str">'superLongLongLongLongLongLongLongLongString'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
  superLongLongLongLongLongLongLongLongFunctionName</span><span class="pun">()</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="str">'superLongLongLongLongLongLongLongLongString'</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تسمح بمتغيّرات غير مستخدمة. استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-unused-vars" rel="external nofollow">no-unused-vars</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> المتغيّرات المُصرّح بها غير المستخدمة في أي جزء من الشفرة هي في الغالب خطأ ناتج عن إعادة هيكلة غير مكتملة. تأخذ هذه المتغيّرات مساحة من الشفرة ويمكن أن تتسبّب في خلط لدى من يقرأه.
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_158" style="">
<span class="com">// سيّئ</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> some_unused_var </span><span class="pun">=</span><span class="pln"> </span><span class="lit">42</span><span class="pun">;</span><span class="pln">

</span><span class="com">// متغيّرات يقتصر استخدامها على تغيير قيمتها لا تعد مستخدمة.</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">

</span><span class="com">// قراءة المتغيّر فقط من أجل التعديل عليه لا يعدّ استخداما</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> z </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
z </span><span class="pun">=</span><span class="pln"> z </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

</span><span class="com">// وسائط غير مستخدمة في الدالة</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getX</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> getXPlusY</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

alert</span><span class="pun">(</span><span class="pln">getXPlusY</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> y</span><span class="pun">));</span><span class="pln">

</span><span class="com">// لا تنطبق القاعدة هنا على المتغيّر type الذي على الرغم من أنه غير مستخدم إلا أن له علاقة بالمتغيّر المُفكَّك</span><span class="pln">
</span><span class="com">// هذه طريقة لاستخراج كائن بإسقاط المفاتيح المحدّدة.</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> type</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">coords </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">;</span><span class="pln">
</span><span class="com">// يطابق الكائنُ coords الكائنَ data، غير أنه لا توجد فيه الخاصيّة type التي استخرجناها منه.</span></pre>

<h2>
	الرفع إلى أعلى النطاق Hoisting
</h2>

<ul>
<li>
		<p>
			تُرفَع المتغيّرات المُصرَّح عنها بالكلمة المفتاحية <code>var</code> إلى أعلى نطاق الدالة المحتوية الأقرب، إلّا أن هذا الأمر لا ينطبق على عمليّات الإسناد. للمتغيّرات المُعرَّفة بالكلمتيْن المفتاحيتيْن <code>const</code> و <code>let</code> ميزة جديدة تُسمى المناطق الميتة الظرفية (Temporal dead zones)؛ لذا من المهم أن تعرف لماذا لم يعد استخدام الدالة <code>typeof</code> آمنا.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_160" style="">
<span class="com">// نعرف أن التعليمات التالية لن تعمل (على فرض</span><span class="pln">
</span><span class="com">// أنه لا يوجد متغيّر باسم notDefined)</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">notDefined</span><span class="pun">);</span><span class="pln"> </span><span class="com">// يتسبب في خطأ ReferenceError</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// تستطيع التصريح بمتغيّر بعد الإحالة إليه</span><span class="pln">
</span><span class="com">// لأن التصريح سيُرفَع إلى أعلى النطاق</span><span class="pln">
</span><span class="com">// ملحوظة: إسناد القيمة true إلى المتغيّر لا يُرفَع</span><span class="pln">
</span><span class="com">// إلى أعلى النطاق.</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">declaredButNotAssigned</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; undefined</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> declaredButNotAssigned </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// يرفع مفسّر جافاسكريبت التصريح بالمتغيّر </span><span class="pln">
</span><span class="com">// إلى أعلى النطاق، وهو ما يعني أنه بإمكاننا</span><span class="pln">
</span><span class="com">// إعادة كتابة المثال السابق على النحو التالي</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  let declaredButNotAssigned</span><span class="pun">;</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">declaredButNotAssigned</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; undefined</span><span class="pln">
  declaredButNotAssigned </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// استخدام const وlet</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">declaredButNotAssigned</span><span class="pun">);</span><span class="pln"> </span><span class="com">// تتسبّب في خطأ ReferenceError</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="kwd">typeof</span><span class="pln"> declaredButNotAssigned</span><span class="pun">);</span><span class="pln">  </span><span class="com">// تتسبّب في خطأ ReferenceError</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> declaredButNotAssigned </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يُرفَع اسم متغيّر الدوال العبارات غير المُسمّاة إلى أعلى النطاق، بخلاف إسناد الدالة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_162" style="">
<span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">anonymous</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; undefined</span><span class="pln">

  anonymous</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; TypeError anonymous is not a function</span><span class="pln">

  </span><span class="kwd">var</span><span class="pln"> anonymous </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'anonymous function expression'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			في الدوال العبارات المُسماة يُرفع اسم المتغير، بخلاف اسم الدالة أو متنها.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_164" style="">
<span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">named</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; undefined</span><span class="pln">

  named</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; TypeError named is not a function</span><span class="pln">

  superPower</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; ReferenceError superPower is not defined</span><span class="pln">

  </span><span class="kwd">var</span><span class="pln"> named </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> superPower</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Flying'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// الأمر نفسه يحدث عندما يكون اسم الدالة</span><span class="pln">
</span><span class="com">// هو نفسه اسم المتغيّر.</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">named</span><span class="pun">);</span><span class="pln"> </span><span class="com">// =&gt; undefined</span><span class="pln">

  named</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; TypeError named is not a function</span><span class="pln">

  </span><span class="kwd">var</span><span class="pln"> named </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> named</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'named'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يرفع التصريح بالدوال اسم الدالة ومتنها إلى أعلى النطاق.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_166" style="">
<span class="kwd">function</span><span class="pln"> example</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  superPower</span><span class="pun">();</span><span class="pln"> </span><span class="com">// =&gt; Flying</span><span class="pln">

  </span><span class="kwd">function</span><span class="pln"> superPower</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Flying'</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	عوامل المقارنة والمساواة
</h2>

<ul>
<li>
		<p>
			استخدم <code>===</code> و <code>!==</code> بدلًا من <code>==</code> و <code>!=</code>.
		</p>
	</li>
	<li>
		<p>
			تقيّم التعليمات الشرطية مثل العبارة <code>if</code> العبارات عبر آلية الإجبار (Coercion) عن طريق الدالة المجرَّدة <code>ToBoolean</code> والتي تتبع دائمًا القواعد البسيطة التالية:
		</p>
	</li>
	<li>
		<p>
			تُمنَح للكائنات القيمة <code>true</code>
		</p>
	</li>
	<li>
		<p>
			تُعيَّن للنوع <code>Undefined</code> القيمة <code>false</code>
		</p>
	</li>
	<li>
		<p>
			تُحدَّد للعبارة <code>Null</code> القيمة <code>false</code>
		</p>
	</li>
	<li>
		<p>
			البيانات من النوع المنطقي (Booleans) تُعطى لها القيمة المنطقية الموافقة
		</p>
	</li>
	<li>
		<p>
			إذا كانت قيمة العدد تساوي <code>0+</code> أو <code>0-</code> أو <code>NaN</code> تحدّد قيمته المنطقية بـ <code>false</code>، وإلّا يأخذ القيمة <code>true</code>
		</p>
	</li>
	<li>
		<p>
			إذا كانت سلسلة المحارف (String) خاوية (<code>""</code>) تُعيَّن قيمتها إلى <code>false</code>، وإلاّ تأخذ القيمة <code>true</code>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_168" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">([</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">[])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// true</span><span class="pln">
  </span><span class="com">// المصفوفة (حتى وإنْ كانت فارغة) هي كائن، والكائنات تُقيّم بالقيمة true</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم الاختصارات عند التعامل مع قيم منطقية، بالمقابل استخدم المقارنات الصريحة للنصوص والأرقام.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_170" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isValid </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isValid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">name </span><span class="pun">!==</span><span class="pln"> </span><span class="str">''</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">collection</span><span class="pun">.</span><span class="pln">length</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">collection</span><span class="pun">.</span><span class="pln">length </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم الأقواس المعقوصة (<code>{}</code>) لإنشاء الكتل في البنود <code>case</code> و <code>default</code> التي تحتوي التصريح بمتغيّرات (على سبيل المثال <code>let</code>، <code>const</code> ، <code>function</code> ، و<code>class</code>). استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-case-declarations.html" rel="external nofollow">no-case-declarations.</a>
		</p>

		<p>
			<strong>لماذا؟</strong> التصريحات مرئية في كامل كتلة <code>switch</code>، ولكن لا يُعاد تعيينها إلّا عندما تُسنَد لها قيمة، وهو ما لا يحدث إلا عند بلوغ بند <code>case</code>، وهو ما يسبب مشاكل عندما يحاول أكثر من بند <code>case</code> تعريف الشيء نفسه.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_172" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
    let x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">3</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> f</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// ...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
    </span><span class="kwd">class</span><span class="pln"> C </span><span class="pun">{}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    let x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">3</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> f</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="com">// ...</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">4</span><span class="pun">:</span><span class="pln">
    bar</span><span class="pun">();</span><span class="pln">
    </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">default</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">class</span><span class="pln"> C </span><span class="pun">{}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا ينبغي أن تتداخل عوامل المقارنة الثلاثية Ternaries، وفي الغالب ينبغي أن تكون على سطر واحد. استعن بقاعدة <a href="https://eslint.org/docs/rules/no-nested-ternary.html" rel="external nofollow">no-nested-ternary</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_174" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> maybe1 </span><span class="pun">&gt;</span><span class="pln"> maybe2
  </span><span class="pun">?</span><span class="pln"> </span><span class="str">"bar"</span><span class="pln">
  </span><span class="pun">:</span><span class="pln"> value1 </span><span class="pun">&gt;</span><span class="pln"> value2 </span><span class="pun">?</span><span class="pln"> </span><span class="str">"baz"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">

</span><span class="com">// التقسيم إلى عبارتين تستخدمان مقارنات ثلاثية</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> maybeNull </span><span class="pun">=</span><span class="pln"> value1 </span><span class="pun">&gt;</span><span class="pln"> value2 </span><span class="pun">?</span><span class="pln"> </span><span class="str">'baz'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln">

</span><span class="com">// أفضل</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> maybe1 </span><span class="pun">&gt;</span><span class="pln"> maybe2
  </span><span class="pun">?</span><span class="pln"> </span><span class="str">'bar'</span><span class="pln">
  </span><span class="pun">:</span><span class="pln"> maybeNull</span><span class="pun">;</span><span class="pln">

</span><span class="com">// الأفضل</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> maybe1 </span><span class="pun">&gt;</span><span class="pln"> maybe2 </span><span class="pun">?</span><span class="pln"> </span><span class="str">'bar'</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> maybeNull</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنب استخدام المقارنات الثلاثية التي لا لزوم لها. استعن بقاعدة <a href="https://eslint.org/docs/rules/no-unneeded-ternary.html" rel="external nofollow">no-unneeded-ternar</a>y.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_176" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">?</span><span class="pln"> a </span><span class="pun">:</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> c </span><span class="pun">?</span><span class="pln"> </span><span class="kwd">true</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> baz </span><span class="pun">=</span><span class="pln"> c </span><span class="pun">?</span><span class="pln"> </span><span class="kwd">false</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">||</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">c</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> baz </span><span class="pun">=</span><span class="pln"> </span><span class="pun">!</span><span class="pln">c</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم الأقواس عند مزج العمليات، والاستثناء الوحيد هي العمليات الحسابية القياسية (+، -، *، /) بما أنّ الأسبقية فيها مفهومة جيّدا. ننصح بوضع <code>/</code> و<code>*</code> بين قوسين، لأنّ الأسبقية بينهما قد تكون غير واضحة عند المزج بينهما. استعن بقاعدة <a href="https://eslint.org/docs/rules/no-mixed-operators.html" rel="external nofollow">no-mixed-operators</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> هذا يحسّن المقروئية ويوضّح قصد المطوّر.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_178" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">&amp;&amp;</span><span class="pln"> b </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> c </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> d </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">**</span><span class="pln"> b </span><span class="pun">-</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> d</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="com">// one may be confused into thinking (a || b) &amp;&amp; c</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">||</span><span class="pln"> b </span><span class="pun">&amp;&amp;</span><span class="pln"> c</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> d</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">&amp;&amp;</span><span class="pln"> b </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> c </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">d </span><span class="pun">+</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">**</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="pun">(</span><span class="lit">5</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> d</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">a </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">b </span><span class="pun">&amp;&amp;</span><span class="pln"> c</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> d</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b </span><span class="pun">/</span><span class="pln"> c </span><span class="pun">*</span><span class="pln"> d</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الكتل Blocks
</h2>

<ul>
<li>
		<p>
			استخدم الأقواس المعقوصة للكتل متعددة الأسطر.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_180" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">test</span><span class="pun">)</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">test</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">test</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			إذا كنت تستخدم الكتل متعددة الأسطر مع <code>if</code> و <code>else</code> ، ضع <code>else</code> على السطر نفسه الذي يوجد عليه القوس المعقوص الذي يغلق كتلة <code>if</code>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_182" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">test</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
  thing2</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing3</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">test</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
  thing2</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing3</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			إذا كانت كتلة <code>if</code> تُرجع قيمة دائمًا (أي تنتهي بالتعليمة <code>return</code>)، فكتلة <code>else</code> المتعلّقة بها غير ضرورية. تعليمة <code>return</code> في كتلة <code>else if</code> موالية لكتلة <code>if</code> تحتوي على <code>return</code> يمكن تقسيمها إلى عدة كتل <code>if</code>. استعن بقاعدة <a href="https://eslint.org/docs/rules/no-else-return" rel="external nofollow">no-else-return</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_184" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> cats</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> dogs</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">return</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> cats</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">y</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">//جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> dogs</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">x</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">z</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">return</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> z</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	تعليمات التحكم Control Statements
</h2>

<ul>
<li>
		<p>
			إذا تجاوزت عبارات التحكم (<code>if</code>, <code>while</code> …) الحد الأقصى لطول السطر، فيمكن وضع كل شرط (أو مجموعة من الشروط) في سطر جديد. كما يجب أن يكون العامل المنطقي في بداية السطر.
		</p>

		<p>
			<strong>لماذا؟</strong> وضع العوامل في بداية السطر يحافظ على محاذاة العوامل ويتبع نمطًا مماثلا لتسلسل التوابع. كما يحسّن القراءة من خلال توضيح العمليات المنطقية المعقدة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_186" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">foo </span><span class="pun">===</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> bar </span><span class="pun">===</span><span class="pln"> </span><span class="str">'abc'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> doesItLookGoodWhenItBecomesThatLong</span><span class="pun">()</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> isThisReallyHappening</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo </span><span class="pun">===</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
  bar </span><span class="pun">===</span><span class="pln"> </span><span class="str">'abc'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo </span><span class="pun">===</span><span class="pln"> </span><span class="lit">123</span><span class="pln">
  </span><span class="pun">&amp;&amp;</span><span class="pln"> bar </span><span class="pun">===</span><span class="pln"> </span><span class="str">'abc'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
  foo </span><span class="pun">===</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln">
  bar </span><span class="pun">===</span><span class="pln"> </span><span class="str">'abc'</span><span class="pln">
</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
  foo </span><span class="pun">===</span><span class="pln"> </span><span class="lit">123</span><span class="pln">
  </span><span class="pun">&amp;&amp;</span><span class="pln"> bar </span><span class="pun">===</span><span class="pln"> </span><span class="str">'abc'</span><span class="pln">
</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">
  </span><span class="pun">(</span><span class="pln">foo </span><span class="pun">===</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> bar </span><span class="pun">===</span><span class="pln"> </span><span class="str">"abc"</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">&amp;&amp;</span><span class="pln"> doesItLook</span><span class="pun">جيّد</span><span class="typ">WhenItBecomesThatLong</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">&amp;&amp;</span><span class="pln"> isThisReallyHappening</span><span class="pun">()</span><span class="pln">
</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo </span><span class="pun">===</span><span class="pln"> </span><span class="lit">123</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> bar </span><span class="pun">===</span><span class="pln"> </span><span class="str">'abc'</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  thing1</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستخدم عوامل الاختيار بدلًا من تعليمات التحكم
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_188" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="pun">!</span><span class="pln">isRunning </span><span class="pun">&amp;&amp;</span><span class="pln"> startRunning</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">isRunning</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  startRunning</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	التعليقات
</h2>

<ul>
<li>
		<p>
			استخدم <code>/** ... */</code> للتعليقات متعددة الأسطر.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_190" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="com">// make() returns a new element</span><span class="pln">
</span><span class="com">// based on the passed in tag name</span><span class="pln">
</span><span class="com">//</span><span class="pln">
</span><span class="com">// @param {String} tag</span><span class="pln">
</span><span class="com">// @return {Element} element</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> make</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="com">// ...</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> element</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="com">/**
 * make() returns a new element
 * based on the passed-in tag name
 */</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> make</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="com">// ...</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> element</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم <code>//</code> لأجل التعليقات ذات السطر الواحد. ضع التعليقات ذات السطر الواحد على سطر جديد فوق التعليمة البرمجية موضوع التعليق. وضع سطرًا فارغًا قبل التعليق إلا إذا كان على السطر الأول من كتلة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_192" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> active </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">  </span><span class="com">// is current tab</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="com">// is current tab</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> active </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getType</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'fetching type...'</span><span class="pun">);</span><span class="pln">
  </span><span class="com">// set the default type to 'no type'</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> type </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">type </span><span class="pun">||</span><span class="pln"> </span><span class="str">'no type'</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> type</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getType</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'fetching type...'</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// set the default type to 'no type'</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> type </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">type </span><span class="pun">||</span><span class="pln"> </span><span class="str">'no type'</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> type</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد أيضا</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> getType</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// set the default type to 'no type'</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> type </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">type </span><span class="pun">||</span><span class="pln"> </span><span class="str">'no type'</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> type</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ابدأ كل التعليقات بمسافة لجعلها أسهل للقراءة. استعت بقاعدة <a href="https://eslint.org/docs/rules/spaced-comment" rel="external nofollow">spaced-comment</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_194" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="com">//is current tab</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> active </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="com">// is current tab</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> active </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="com">/**
 *make() returns a new element
 *based on the passed-in tag name
 */</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> make</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="com">// ...</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> element</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="com">/**
 * make() returns a new element
 * based on the passed-in tag name
 */</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> make</span><span class="pun">(</span><span class="pln">tag</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  </span><span class="com">// ...</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> element</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ابدأ التعليقات التي تهدف إلى لفت انتباه المطورين الآخرين إلى أنّ هناك مشكلةً تحتاج إلى المراجعة بالكلمات <code>FIXME</code> أو <code>TODO</code>، أو إذا كنت تقترح حلّا لتنفيذه. تختلف هذه عن التعليقات العادية لأنها قابلة للتنفيذ. الإجراءات قد تكون: <code>FIXME: -- need to figure this out</code> أو <code>TODO: -- need to implement</code> مثلا.
		</p>
	</li>
	<li>
		<p>
			استخدم <code>// FIXME:</code> للإشارة إلى مشكلة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_204" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Calculator</span><span class="pln"> extends </span><span class="typ">Abacus</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">();</span><span class="pln">
    </span><span class="com">// FIXME: shouldn’t use a global here total = 0; </span><span class="pln">
	</span><span class="pun">}</span><span class="pln"> 
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم <code>// TODO:</code> لاقتراح حل لمشكلة.
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_202" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Calculator</span><span class="pln"> extends </span><span class="typ">Abacus</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    super</span><span class="pun">();</span><span class="pln">

    </span><span class="com">// TODO: total should be configurable by an options param</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">total </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	المسافات Whitespace
</h2>

<ul>
<li>
		<p>
			أضف فراغيْن بسيطيْن (زر المسافة مرتيْن) للمسافات البادئة. استعن بقاعدة <a href="https://eslint.org/docs/rules/indent.html" rel="external nofollow">indent</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_206" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">∙∙∙∙</span><span class="pln">let name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">∙</span><span class="pln">let name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> baz</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">∙∙</span><span class="pln">let name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع مسافة واحدة قبل القوس المعقوص الأول. استعن بالقاعدة <a href="https://eslint.org/docs/rules/space-before-blocks.html" rel="external nofollow">space-before-blocks</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_208" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">(){</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'test'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> test</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'test'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
dog</span><span class="pun">.</span><span class="kwd">set</span><span class="pun">(</span><span class="str">'attr'</span><span class="pun">,{</span><span class="pln">
  age</span><span class="pun">:</span><span class="pln"> </span><span class="str">'1 year'</span><span class="pun">,</span><span class="pln">
  breed</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Bernese Mountain Dog'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
dog</span><span class="pun">.</span><span class="kwd">set</span><span class="pun">(</span><span class="str">'attr'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  age</span><span class="pun">:</span><span class="pln"> </span><span class="str">'1 year'</span><span class="pun">,</span><span class="pln">
  breed</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Bernese Mountain Dog'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع مسافةً قبل القوس الفاتح في تعليمات التحكم (<code>if</code>, <code>while</code> …). لا تضع أي مسافات بين لائحة الوسائط Arguments واسم الدالة عند استدعاء دالة أو التصريح بها. استعن بقاعدة <a href="https://eslint.org/docs/rules/keyword-spacing.html" rel="external nofollow">keyword-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_210" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">isJedi</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  fight </span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">isJedi</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  fight</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> fight </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log </span><span class="pun">(</span><span class="str">'Swooosh!'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> fight</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Swooosh!'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع مسافات بين العوامل. استعن بقاعدة <a href="https://eslint.org/docs/rules/space-infix-ops.html" rel="external nofollow">space-infix-ops</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_212" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> x</span><span class="pun">=</span><span class="pln">y</span><span class="pun">+</span><span class="lit">5</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> y </span><span class="pun">+</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			أنهِ الملفات بمحرف الرجوع إلى السطر. استعن بقاعدة <a href="https://github.com/eslint/eslint/blob/master/docs/rules/eol-last.md" rel="external nofollow">eol-last</a>
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_214" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> es6 </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> es6</span><span class="pun">;</span></pre>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_216" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> es6 </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> es6</span><span class="pun">;↵</span><span class="pln">
</span><span class="pun">↵</span></pre>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_218" style="">
<span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> es6 </span><span class="pun">}</span><span class="pln"> from </span><span class="str">'./AirbnbStyleGuide'</span><span class="pun">;</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> es6</span><span class="pun">;↵</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم المسافة البادئة عند استخدام سلسة طويلة من التوابع (أكثر من اثنتين). استخدم نقطة في البداية، لكي تبين أنّ السطر هو استدعاء لتابع، وليس تعليمةً جديدة. استعن بالقاعدتيْن <a href="https://eslint.org/docs/rules/newline-per-chained-call" rel="external nofollow">newline-per-chained-call</a> و<a href="https://eslint.org/docs/rules/no-whitespace-before-property" rel="external nofollow">no-whitespace-before-property</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_220" style="">
<span class="com">// سيئ</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'#items'</span><span class="pun">).</span><span class="pln">find</span><span class="pun">(</span><span class="str">'.selected'</span><span class="pun">).</span><span class="pln">highlight</span><span class="pun">().</span><span class="pln">end</span><span class="pun">().</span><span class="pln">find</span><span class="pun">(</span><span class="str">'.open'</span><span class="pun">).</span><span class="pln">updateCount</span><span class="pun">();</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'#items'</span><span class="pun">).</span><span class="pln">
  find</span><span class="pun">(</span><span class="str">'.selected'</span><span class="pun">).</span><span class="pln">
    highlight</span><span class="pun">().</span><span class="pln">
    end</span><span class="pun">().</span><span class="pln">
  find</span><span class="pun">(</span><span class="str">'.open'</span><span class="pun">).</span><span class="pln">
    updateCount</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'#items'</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">find</span><span class="pun">(</span><span class="str">'.selected'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">highlight</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">end</span><span class="pun">()</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">find</span><span class="pun">(</span><span class="str">'.open'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">updateCount</span><span class="pun">();</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> leds </span><span class="pun">=</span><span class="pln"> stage</span><span class="pun">.</span><span class="pln">selectAll</span><span class="pun">(</span><span class="str">'.led'</span><span class="pun">).</span><span class="pln">data</span><span class="pun">(</span><span class="pln">data</span><span class="pun">).</span><span class="pln">enter</span><span class="pun">().</span><span class="pln">append</span><span class="pun">(</span><span class="str">'svg:svg'</span><span class="pun">).</span><span class="pln">classed</span><span class="pun">(</span><span class="str">'led'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">attr</span><span class="pun">(</span><span class="str">'width'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">radius </span><span class="pun">+</span><span class="pln"> margin</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">).</span><span class="pln">append</span><span class="pun">(</span><span class="str">'svg:g'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">attr</span><span class="pun">(</span><span class="str">'transform'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">`</span><span class="pln">translate</span><span class="pun">(</span><span class="pln">$</span><span class="pun">{</span><span class="pln">radius </span><span class="pun">+</span><span class="pln"> margin</span><span class="pun">},</span><span class="pln">$</span><span class="pun">{</span><span class="pln">radius </span><span class="pun">+</span><span class="pln"> margin</span><span class="pun">})`)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">tron</span><span class="pun">.</span><span class="pln">led</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> leds </span><span class="pun">=</span><span class="pln"> stage</span><span class="pun">.</span><span class="pln">selectAll</span><span class="pun">(</span><span class="str">'.led'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">data</span><span class="pun">(</span><span class="pln">data</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">enter</span><span class="pun">().</span><span class="pln">append</span><span class="pun">(</span><span class="str">'svg:svg'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">classed</span><span class="pun">(</span><span class="str">'led'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">attr</span><span class="pun">(</span><span class="str">'width'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">radius </span><span class="pun">+</span><span class="pln"> margin</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="str">'svg:g'</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">attr</span><span class="pun">(</span><span class="str">'transform'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">`</span><span class="pln">translate</span><span class="pun">(</span><span class="pln">$</span><span class="pun">{</span><span class="pln">radius </span><span class="pun">+</span><span class="pln"> margin</span><span class="pun">},</span><span class="pln">$</span><span class="pun">{</span><span class="pln">radius </span><span class="pun">+</span><span class="pln"> margin</span><span class="pun">})`)</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">tron</span><span class="pun">.</span><span class="pln">led</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> leds </span><span class="pun">=</span><span class="pln"> stage</span><span class="pun">.</span><span class="pln">selectAll</span><span class="pun">(</span><span class="str">'.led'</span><span class="pun">).</span><span class="pln">data</span><span class="pun">(</span><span class="pln">data</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع سطرًا فارغًا بعد الكتل وقبل التعليمة الموالية.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_222" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> bar</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> baz</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> bar</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> baz</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> obj</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">

  bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> obj</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">];</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> arr</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">

  </span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="kwd">return</span><span class="pln"> arr</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تحش الكتل بأسطر فارغة. استعن بالقاعدة <a href="https://eslint.org/docs/rules/padded-blocks.html" rel="external nofollow">padded-blocks</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_224" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">baz</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">qux</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  constructor</span><span class="pun">(</span><span class="pln">bar</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">bar </span><span class="pun">=</span><span class="pln"> bar</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">baz</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">qux</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستخدم عدة أسطر فارغة لحشو شفرتك البرمجية. استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-multiple-empty-lines" rel="external nofollow">no-multiple-empty-lines</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_230" style="">
<span class="pln">	</span><span class="com">// سيّئ</span><span class="pln">
	</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	  constructor</span><span class="pun">(</span><span class="pln">fullName</span><span class="pun">,</span><span class="pln"> email</span><span class="pun">,</span><span class="pln"> birthday</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">fullName </span><span class="pun">=</span><span class="pln"> fullName</span><span class="pun">;</span><span class="pln">
	
	
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">email </span><span class="pun">=</span><span class="pln"> email</span><span class="pun">;</span><span class="pln">
	
	
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">setAge</span><span class="pun">(</span><span class="pln">birthday</span><span class="pun">);</span><span class="pln">
	  </span><span class="pun">}</span><span class="pln">
	
	
	  setAge</span><span class="pun">(</span><span class="pln">birthday</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	    </span><span class="kwd">const</span><span class="pln"> today </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">();</span><span class="pln">
	
	
	    </span><span class="kwd">const</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">getAge</span><span class="pun">(</span><span class="pln">today</span><span class="pun">,</span><span class="pln"> birthday</span><span class="pun">);</span><span class="pln">
	
	
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">age </span><span class="pun">=</span><span class="pln"> age</span><span class="pun">;</span><span class="pln">
	  </span><span class="pun">}</span><span class="pln">
	
	
	  getAge</span><span class="pun">(</span><span class="pln">today</span><span class="pun">,</span><span class="pln"> birthday</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	    </span><span class="com">// ..</span><span class="pln">
	  </span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span><span class="pln">
	
	</span><span class="com">// جيّد</span><span class="pln">
	</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	  constructor</span><span class="pun">(</span><span class="pln">fullName</span><span class="pun">,</span><span class="pln"> email</span><span class="pun">,</span><span class="pln"> birthday</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">fullName </span><span class="pun">=</span><span class="pln"> fullName</span><span class="pun">;</span><span class="pln">
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">email </span><span class="pun">=</span><span class="pln"> email</span><span class="pun">;</span><span class="pln">
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">setAge</span><span class="pun">(</span><span class="pln">birthday</span><span class="pun">);</span><span class="pln">
	  </span><span class="pun">}</span><span class="pln">
	
	  setAge</span><span class="pun">(</span><span class="pln">birthday</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	    </span><span class="kwd">const</span><span class="pln"> today </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Date</span><span class="pun">();</span><span class="pln">
	    </span><span class="kwd">const</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> getAge</span><span class="pun">(</span><span class="pln">today</span><span class="pun">,</span><span class="pln"> birthday</span><span class="pun">);</span><span class="pln">
	    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">age </span><span class="pun">=</span><span class="pln"> age</span><span class="pun">;</span><span class="pln">
	  </span><span class="pun">}</span><span class="pln">
	
	  getAge</span><span class="pun">(</span><span class="pln">today</span><span class="pun">,</span><span class="pln"> birthday</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
	    </span><span class="com">// ..</span><span class="pln">
	  </span><span class="pun">}</span><span class="pln">
	</span><span class="pun">}</span></pre>
	</li>
	<li>
		لا تضف مسافات داخل الأقواس. استعن بالقاعدة <a href="https://eslint.org/docs/rules/space-in-parens.html" rel="external nofollow">space-in-parens</a>.
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_232" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">(</span><span class="pln"> foo </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> foo</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> bar</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> foo</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> foo </span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<ul>
<li>
		<p>
			لا تضف مسافات داخل الأقواس المعكوفة (<code>[]</code>). استعن بالقاعدة <a href="https://eslint.org/docs/rules/array-bracket-spacing.html" rel="external nofollow">array-bracket-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_234" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">];</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">[</span><span class="pln"> </span><span class="lit">0</span><span class="pln"> </span><span class="pun">]);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">];</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			أضف مساحات داخل الأقواس المعقوصة. استعن بالقاعدة <a href="https://eslint.org/docs/rules/object-curly-spacing.html" rel="external nofollow">object-curly-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_236" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">clark</span><span class="pun">:</span><span class="pln"> </span><span class="str">'kent'</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> clark</span><span class="pun">:</span><span class="pln"> </span><span class="str">'kent'</span><span class="pln"> </span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنب التعليمات البرمجية التي يتجاوز طولها 100 محرف (باحتساب المسافات). النصوص الطويلة - حسب قاعدة مذكورة أعلاه - مستثناة من هذه القاعدة، وينبغي ألّا تُفكك. استعن بالقاعدة <a href="https://eslint.org/docs/rules/max-len.html" rel="external nofollow">max-len</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> لضمان سهولة القراءة والصيانة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_238" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> jsonData </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar</span><span class="pun">.</span><span class="pln">baz </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar</span><span class="pun">.</span><span class="pln">baz</span><span class="pun">.</span><span class="pln">quux </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar</span><span class="pun">.</span><span class="pln">baz</span><span class="pun">.</span><span class="pln">quux</span><span class="pun">.</span><span class="pln">xyzzy</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
$</span><span class="pun">.</span><span class="pln">ajax</span><span class="pun">({</span><span class="pln"> method</span><span class="pun">:</span><span class="pln"> </span><span class="str">'POST'</span><span class="pun">,</span><span class="pln"> url</span><span class="pun">:</span><span class="pln"> </span><span class="str">'https://airbnb.com/'</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'John'</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">}).</span><span class="pln">done</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Congratulations!'</span><span class="pun">)).</span><span class="pln">fail</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'You have failed this city.'</span><span class="pun">));</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> jsonData
  </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo
  </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar
  </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar</span><span class="pun">.</span><span class="pln">baz
  </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar</span><span class="pun">.</span><span class="pln">baz</span><span class="pun">.</span><span class="pln">quux
  </span><span class="pun">&amp;&amp;</span><span class="pln"> jsonData</span><span class="pun">.</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">bar</span><span class="pun">.</span><span class="pln">baz</span><span class="pun">.</span><span class="pln">quux</span><span class="pun">.</span><span class="pln">xyzzy</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
$</span><span class="pun">.</span><span class="pln">ajax</span><span class="pun">({</span><span class="pln">
  method</span><span class="pun">:</span><span class="pln"> </span><span class="str">'POST'</span><span class="pun">,</span><span class="pln">
  url</span><span class="pun">:</span><span class="pln"> </span><span class="str">'https://airbnb.com/'</span><span class="pun">,</span><span class="pln">
  data</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'John'</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="pun">})</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">done</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'Congratulations!'</span><span class="pun">))</span><span class="pln">
  </span><span class="pun">.</span><span class="pln">fail</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'You have failed this city.'</span><span class="pun">));</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			افرض مسافات متناسقة بعد القوس المعقوص البادئ لكتلة وبعد القوس المعقوص البادئ لكتلة موالية لها على السطر نفسه. الأمر نفسه ينطبق على الأقواس المعقوصة المكمّلة للكتلتيْن. استعن بقاعدة <a href="https://eslint.org/docs/rules/block-spacing" rel="external nofollow">block-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_240" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">foo</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنّب المسافات قبل الفواصل وافرض مسافة بعد الفاصلة. استعن بالقاعدة <a href="https://eslint.org/docs/rules/comma-spacing" rel="external nofollow">comma-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_242" style="">
<span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">];</span><span class="pln">

</span><span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> foo </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> bar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> arr </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">];</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			افرض عدم استخدام المسافات داخل الأقواس المعكوفة لخاصيّة محسوبة. استعن بالقاعدة <a href="https://eslint.org/docs/rules/computed-property-spacing" rel="external nofollow">computed-property-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_244" style="">
<span class="com">// سيّئ</span><span class="pln">
obj</span><span class="pun">[</span><span class="pln">foo </span><span class="pun">]</span><span class="pln">
obj</span><span class="pun">[</span><span class="pln"> </span><span class="str">'foo'</span><span class="pun">]</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{[</span><span class="pln"> b </span><span class="pun">]:</span><span class="pln"> a</span><span class="pun">}</span><span class="pln">
obj</span><span class="pun">[</span><span class="pln">foo</span><span class="pun">[</span><span class="pln"> bar </span><span class="pun">]]</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
obj</span><span class="pun">[</span><span class="pln">foo</span><span class="pun">]</span><span class="pln">
obj</span><span class="pun">[</span><span class="str">'foo'</span><span class="pun">]</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">[</span><span class="pln">b</span><span class="pun">]:</span><span class="pln"> a </span><span class="pun">}</span><span class="pln">
obj</span><span class="pun">[</span><span class="pln">foo</span><span class="pun">[</span><span class="pln">bar</span><span class="pun">]]</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنّب المسافات بين دالة واستدعائها. استعن بالقاعدة <a href="https://eslint.org/docs/rules/func-call-spacing" rel="external nofollow">func-call-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_246" style="">
<span class="com">// سيئ</span><span class="pln">
func </span><span class="pun">();</span><span class="pln">

func
</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
func</span><span class="pun">();</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			افرض المسافات بين المفاتيح والقيم في الخاصيّات المصنّفة النوع في الكائنات. استعن بالقاعدة <a href="https://eslint.org/docs/rules/key-spacing" rel="external nofollow">key-spacing</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_248" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> foo </span><span class="pun">:</span><span class="pln"> </span><span class="lit">42</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> obj2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> foo</span><span class="pun">:</span><span class="lit">42</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> foo</span><span class="pun">:</span><span class="pln"> </span><span class="lit">42</span><span class="pln"> </span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تجنّب المسافات الباقية بعد نهاية الأسطر. استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-trailing-spaces" rel="external nofollow">no-trailing-spaces</a>.
		</p>
	</li>
	<li>
		<p>
			تجنّب عدة أسطر فارغة، ولاتسمح إلا بسطر واحد جديد في نهاية الملفات. تجنّب كذلك وجود سطر جديد في بداية الملفات. استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-multiple-empty-lines" rel="external nofollow">no-multiple-empty-lines</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_250" style="">
<span class="com">// سيّئ - عدة أسطر فارغة.</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيّئ - سطران جديدان بعد نهاية الملف</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">


</span><span class="com">// سيّئ - سطر جديد في بداية الملف</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> x </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> y </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الفواصل
</h2>

<ul>
<li>
		<p>
			تجنب الفواصل في البداية. استعن بالقاعدة <a href="https://eslint.org/docs/rules/comma-style.html" rel="external nofollow">comma-style</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_252" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> story </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
    once
  </span><span class="pun">,</span><span class="pln"> upon
  </span><span class="pun">,</span><span class="pln"> aTime
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> story </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  once</span><span class="pun">,</span><span class="pln">
  upon</span><span class="pun">,</span><span class="pln">
  aTime</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> hero </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    firstName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Ada'</span><span class="pln">
  </span><span class="pun">,</span><span class="pln"> lastName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Lovelace'</span><span class="pln">
  </span><span class="pun">,</span><span class="pln"> birthYear</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1815</span><span class="pln">
  </span><span class="pun">,</span><span class="pln"> superPower</span><span class="pun">:</span><span class="pln"> </span><span class="str">'computers'</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> hero </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  firstName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Ada'</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Lovelace'</span><span class="pun">,</span><span class="pln">
  birthYear</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1815</span><span class="pun">,</span><span class="pln">
  superPower</span><span class="pun">:</span><span class="pln"> </span><span class="str">'computers'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم فاصلة إضافية. استعن بالقاعدة <a href="https://eslint.org/docs/rules/comma-dangle.html" rel="external nofollow">comma-dangle</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> هذا يؤدي إلى توضيح الاختلافات بين الشفرات البرمجية في إيداعات Git . علاوة على ذلك، تحذف مصرّفات مثل Babel الفواصل الزائدة في الشفرة الناتجة عن التصريف، ممّا يعني أنه لا داعي للقلق من <a href="https://github.com/airbnb/javascript/blob/es5-deprecated/es5/README.md#commas" rel="external nofollow">مشكلة الفاصلة المُجرجَرة</a> (Trailing comma) في المتصفحات القديمة.
		</p>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_254" style="">
<span class="com">// سيئ، فرق بين إيداعين في Git بدون فاصلة إضافية</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> hero </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     firstName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Florence'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">-</span><span class="pln">    lastName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Nightingale'</span><span class="pln">
</span><span class="pun">+</span><span class="pln">    lastName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Nightingale'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">+</span><span class="pln">    inventorOf</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'coxcomb chart'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'modern nursing'</span><span class="pun">]</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد، فرق بين إيداعين في Git بوجود فاصلة إضافية</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> hero </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     firstName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Florence'</span><span class="pun">,</span><span class="pln">
     lastName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Nightingale'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">+</span><span class="pln">    inventorOf</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="str">'coxcomb chart'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'modern nursing'</span><span class="pun">],</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> hero </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  firstName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Dana'</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Scully'</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> heroes </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="str">'Batman'</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'Superman'</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> hero </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  firstName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Dana'</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">:</span><span class="pln"> </span><span class="str">'Scully'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> heroes </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="str">'Batman'</span><span class="pun">,</span><span class="pln">
  </span><span class="str">'Superman'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> createHero</span><span class="pun">(</span><span class="pln">
  firstName</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">,</span><span class="pln">
  inventorOf
</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// does nothing</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> createHero</span><span class="pun">(</span><span class="pln">
  firstName</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">,</span><span class="pln">
  inventorOf</span><span class="pun">,</span><span class="pln">
</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// does nothing</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد (انتبه إلى أنه يجب ألا تظهر فاصلة بعد عامل الاستناد Rest element)</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> createHero</span><span class="pun">(</span><span class="pln">
  firstName</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">,</span><span class="pln">
  inventorOf</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">heroArgs
</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// does nothing</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
createHero</span><span class="pun">(</span><span class="pln">
  firstName</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">,</span><span class="pln">
  inventorOf
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
createHero</span><span class="pun">(</span><span class="pln">
  firstName</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">,</span><span class="pln">
  inventorOf</span><span class="pun">,</span><span class="pln">
</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد (انتبه إلى أنه يجب ألا تظهر فاصلة بعد عامل الاستناد Rest element)</span><span class="pln">

createHero</span><span class="pun">(</span><span class="pln">
  firstName</span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">,</span><span class="pln">
  inventorOf</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">...</span><span class="pln">heroArgs
</span><span class="pun">);</span></pre>

<h2>
	الفاصلة المنقوطة Semicolons
</h2>

<ul>
<li>
		<p>
			استخدم الفاصلة المنقوطة. استعن بالقاعدة <a href="https://eslint.org/docs/rules/semi.html" rel="external nofollow">semi</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> عندما يصادف مفسّر جافاسكريبت عودة إلى السطر بدون فاصلة منقوطة، فإنه يستخدم مجموعة من القواعد تسمى الإدراج التلقائي للفاصلة المنقوطة (<a href="https://tc39.github.io/ecma262/#sec-automatic-semicolon-insertion" rel="external nofollow">Automatic Semicolon Insertion</a>) لتحديد ما إذا كان يجب احتساب نهاية السطر على أنها نهاية للتعليمة البرمجية، ويُدرِج، كما يوحي الاسم، فاصلة منقوطة في الشفرة البرمجية قبل نهاية السطر إذا رأى أن التعليمة قد انتهت. الإدراج التلقائي للفاصلة المنقوطة ترافقه سلوكيات شاذة، قد تتسبّب في إساءة فهم الشفرة البرمجية. تصبح هذه القواعد أكثر تعقيدًا مع إضافة ميزات جديدة إلى جافاسكريبت. سيساعد الوضوح في إنهاء التعليمات البرمجية وإعداد أداة جودة الشفرة (مثل ESLint) لتحديد الفواصل المنقوطة المفقودة في تجنب تلك المشاكل.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_256" style="">
<span class="com">// سيئ، تنتج عنه استثناءات (Exceptions)</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> luke </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> leia </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="pun">[</span><span class="pln">luke</span><span class="pun">,</span><span class="pln"> leia</span><span class="pun">].</span><span class="pln">forEach</span><span class="pun">(</span><span class="pln">jedi </span><span class="pun">=&gt;</span><span class="pln"> jedi</span><span class="pun">.</span><span class="pln">father </span><span class="pun">=</span><span class="pln"> </span><span class="str">'vader'</span><span class="pun">)</span><span class="pln">

</span><span class="com">// سيئ، تنتج عنه استثناءات (Exceptions)</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> reaction </span><span class="pun">=</span><span class="pln"> </span><span class="str">"No! That's impossible!"</span><span class="pln">
</span><span class="pun">(</span><span class="pln">async </span><span class="kwd">function</span><span class="pln"> meanwhileOnTheFalcon</span><span class="pun">(){</span><span class="pln">
  </span><span class="com">// handle `leia`, `lando`, `chewie`, `r2`, `c3p0`</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}())</span><span class="pln">

</span><span class="com">// سيّئ، يُرجع `undefined` بدلًا من القيمة الموجودة في السطر الموالي</span><span class="pln">
</span><span class="com">// يحدث هذا دائمًا عندما تكون التعليمة return مفصولة بسطر عن القمية المرجَعة</span><span class="pln">
</span><span class="com">// وذلك بسبب حدوث الإدراج التلقائي للفاصلة المنقوطة</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln">
    </span><span class="str">'search your feelings, you know it to be foo'</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> luke </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> leia </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
</span><span class="pun">[</span><span class="pln">luke</span><span class="pun">,</span><span class="pln"> leia</span><span class="pun">].</span><span class="pln">forEach</span><span class="pun">((</span><span class="pln">jedi</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  jedi</span><span class="pun">.</span><span class="pln">father </span><span class="pun">=</span><span class="pln"> </span><span class="str">'vader'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> reaction </span><span class="pun">=</span><span class="pln"> </span><span class="str">"No! That's impossible!"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">(</span><span class="pln">async </span><span class="kwd">function</span><span class="pln"> meanwhileOnTheFalcon</span><span class="pun">(){</span><span class="pln">
  </span><span class="com">// handle `leia`, `lando`, `chewie`, `r2`, `c3p0`</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}());</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="str">'search your feelings, you know it to be foo'</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	التحويل بين أنواع البيانات وفرض نوع معيّن Type Casting &amp; Coercion
</h2>

<ul>
<li>
		<p>
			حوّل نوع البيانات في بداية التعليمة.
		</p>
	</li>
	<li>
		<p>
			سلاسل المحارف:
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_258" style="">
<span class="com">// =&gt; this.reviewScore = 9;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> totalScore </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">String</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">reviewScore</span><span class="pun">);</span><span class="pln"> </span><span class="com">//  المتغيّر totalScore كائن "object" وليس سلسلة محارف "string"</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> totalScore </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">reviewScore </span><span class="pun">+</span><span class="pln"> </span><span class="str">''</span><span class="pun">;</span><span class="pln"> 
</span><span class="com">//  يستدعي التابع this.reviewScore.valueOf()</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> totalScore </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">reviewScore</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">();</span><span class="pln"> </span><span class="com">// لا تضمن إرجاع سلسلة محارف</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> totalScore </span><span class="pun">=</span><span class="pln"> </span><span class="typ">String</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">reviewScore</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			بالنسبة للأعداد: استخدم <code>Number</code> لأجل التحويل، أما لتحليل النصوص فاستخدم دائمًا التابع <code>parseInt</code> مع أساس <code>radix</code> . استعن بالقاعدتيْن <a href="https://eslint.org/docs/rules/radix" rel="external nofollow">radix</a> و<a href="https://eslint.org/docs/rules/no-new-wrappers" rel="external nofollow">no-new-wrappers</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_260" style="">
<span class="kwd">const</span><span class="pln"> inputValue </span><span class="pun">=</span><span class="pln"> </span><span class="str">'4'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Number</span><span class="pun">(</span><span class="pln">inputValue</span><span class="pun">);</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> </span><span class="pun">+</span><span class="pln">inputValue</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> inputValue </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> parseInt</span><span class="pun">(</span><span class="pln">inputValue</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Number</span><span class="pun">(</span><span class="pln">inputValue</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> parseInt</span><span class="pun">(</span><span class="pln">inputValue</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضع تعليقًا يشرح ما الذي تفعله ولماذا إذا كنت مضطرّا لاستعمال <code>parseInt</code> واحتجت إلى استخدام <code>Bitshift</code> لأسباب <a href="https://jsperf.com/coercion-vs-casting/3" rel="external nofollow">تتعلق بالأداء</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_262" style="">
<span class="com">// جيّد</span><span class="pln">
</span><span class="com">/**
 * parseInt was the reason my code was slow.
 * Bitshifting the String to coerce it to a
 * Number made it a lot faster.
 */</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> val </span><span class="pun">=</span><span class="pln"> inputValue </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			احذر عند استخدام عمليات الإزاحة bitshift ، فالأعداد مُمثلة ب<a href="https://es5.github.io/#x4.3.19" rel="external nofollow">قيم من 64 بتا</a>. ولكنّ عمليات الإزاحة دائما تُرجع أعدادًا ممثلة بقيم من 32 بت (<a href="https://es5.github.io/#x11.7" rel="external nofollow">المرجع</a>). يمكن أن تؤدي الإزاحة إلى نتائج غير متوقعة عند استخدام قيم عددية أكبر من 32 بتا. أكبر قيمة للأعداد ذات الإشارة الممثلة على 32 بتا هي 2,147,483,647. (<a href="https://github.com/airbnb/javascript/issues/109" rel="external nofollow">نقاش</a>).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_264" style="">
<span class="lit">2147483647</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; 2147483647</span><span class="pln">
</span><span class="lit">2147483648</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; -2147483648</span><span class="pln">
</span><span class="lit">2147483649</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="com">// =&gt; -2147483647</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			القيم المنطقية:
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_266" style="">
<span class="kwd">const</span><span class="pln"> age </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> hasAge </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Boolean</span><span class="pun">(</span><span class="pln">age</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> hasAge </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Boolean</span><span class="pun">(</span><span class="pln">age</span><span class="pun">);</span><span class="pln">

</span><span class="com">// best</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> hasAge </span><span class="pun">=</span><span class="pln"> </span><span class="pun">!!</span><span class="pln">age</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	اصطلاحات التسمية
</h2>

<ul>
<li>
		<p>
			تجنب الأسماء المكونة من حرف واحد. استخدم أسماء معبّرة. استعن بالقاعدة <a href="https://eslint.org/docs/rules/id-length" rel="external nofollow">id-length</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_270" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> q</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> query</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم أسلوب camelCase لتسمية الكائنات، والدوال، والنظائر (Instances). استعن بالقاعدة <a href="https://eslint.org/docs/rules/camelcase.html" rel="external nofollow">camelCase</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_268" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">OBJEcttsssss</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> this_is_my_object </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> c</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> thisIsMyObject </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{};</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> thisIsMyFunction</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستخدم أسلوب التسمية PascalCase إلا عند تسمية المُنشئات أو الأصناف. استعن بالدالة <a href="https://eslint.org/docs/rules/new-cap.html" rel="external nofollow">new-cap</a>.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_272" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> user</span><span class="pun">(</span><span class="pln">options</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> options</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">سيئ</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> user</span><span class="pun">({</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'nope'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">User</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">(</span><span class="pln">options</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="pln">name </span><span class="pun">=</span><span class="pln"> options</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="pun">جيّد</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">User</span><span class="pun">({</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="str">'yup'</span><span class="pun">,</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تستخدم العارضة السفلية في البداية أو النهاية. استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-underscore-dangle.html" rel="external nofollow">camelcno-underscore-danglease</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> لا يوجد في جافاسكريبت مفهوم الخصوصية عندما يتعلّق الأمر بالخاصيّات أو التوابع. على الرغم من أن الكثيرين ينظرون إلى وضع العارضة السفلية في بداية الاسم على أنه اصطلاح يعني “خاص”، إلّا أن هذه الخاصيّات عامة كلها، وعلى هذا النحو، فهي جزء من الواجهة البرمجية <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> العمومية. هذا الاصطلاح قد يؤدي بالمطورين للاعتقاد خطأً بأن التغيير لن يؤثّر سلبًا على الشفرة البرمجية، أو أنه ليست هناك حاجة للاختبار. إن بدا لك هذا الشرح طويلًا، فتذكر هذه الجملة: إذا كنت تريد لشيء أن يكون “خاصّا”، فيجب ألا تضعه في مكان ملحوظ.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_274" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">__firstName__ </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Panda'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">firstName_ </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Panda'</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">_firstName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Panda'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">this</span><span class="pun">.</span><span class="pln">firstName </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Panda'</span><span class="pun">;</span><span class="pln">
</span><span class="com">// جيّد، في البيئات التي يكون WeakMaps متوفّرًا فيها، راجع الرابط التالي</span><span class="pln">
</span><span class="com">// see https://kangax.github.io/compat-table/es6/#test-WeakMap</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> firstNames </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">WeakMap</span><span class="pun">();</span><span class="pln">
firstNames</span><span class="pun">.</span><span class="kwd">set</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Panda'</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا تحفظ مرجعًا إلى <code>this</code>. واستخدم الدوال السهمية أو التابع <code>Function#bind</code> .
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_276" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> self </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">self</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> that </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">that</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> foo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يجب أن يتطابق اسم الملف القاعدي (Base filename) تمامًا مع اسم التصدير الافتراضي.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_278" style="">
<span class="com">// file 1 contents</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">CheckBox</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> </span><span class="typ">CheckBox</span><span class="pun">;</span><span class="pln">

</span><span class="com">// file 2 contents</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> fortyTwo</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">42</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="com">// file 3 contents</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> insideDirectory</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{}</span><span class="pln">

</span><span class="com">// in some other file</span><span class="pln">
</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">CheckBox</span><span class="pln"> from </span><span class="str">'./checkBox'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// PascalCase import/export, camelCase filename</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">FortyTwo</span><span class="pln"> from </span><span class="str">'./FortyTwo'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// PascalCase import/filename, camelCase export</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">InsideDirectory</span><span class="pln"> from </span><span class="str">'./InsideDirectory'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// PascalCase import/filename, camelCase export</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">CheckBox</span><span class="pln"> from </span><span class="str">'./check_box'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// PascalCase import/export, snake_case filename</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> forty_two from </span><span class="str">'./forty_two'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// snake_case import/filename, camelCase export</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> inside_directory from </span><span class="str">'./inside_directory'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// snake_case import, camelCase export</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> index from </span><span class="str">'./inside_directory/index'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// requiring the index file explicitly</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> insideDirectory from </span><span class="str">'./insideDirectory/index'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// requiring the index file explicitly</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">CheckBox</span><span class="pln"> from </span><span class="str">'./CheckBox'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// PascalCase export/import/filename</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> fortyTwo from </span><span class="str">'./fortyTwo'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// camelCase export/import/filename</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> insideDirectory from </span><span class="str">'./insideDirectory'</span><span class="pun">;</span><span class="pln"> </span><span class="com">// camelCase export/import/directory name/implicit "index"</span><span class="pln">
</span><span class="com">// ^ supports both insideDirectory.js and insideDirectory/index.js</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم أسلوب التسمية camelCase عندما التصدير الافتراضي لدالة. يجب أن يكون اسم الملف الخاص بك مطابقًا لاسم دالتك.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_280" style="">
<span class="kwd">function</span><span class="pln"> makeStyleGuide</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> makeStyleGuide</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم أسلوب التسمية PascalCase عندما تصدّر منشئًا أو صنفًا أو صنفًا أو مكتبة دوال أو كائن مجرّدا.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_282" style="">
<span class="kwd">const</span><span class="pln"> </span><span class="typ">AirbnbStyleGuide</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  es6</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">default</span><span class="pln"> </span><span class="typ">AirbnbStyleGuide</span><span class="pun">;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			يجب أن تكون كل حروف المختصرات والكلمات المنحوتة إما مكتوبة بأحرف كبيرة وإما بأحرف صغيرة. <strong>لماذا؟</strong> تهدف التسميات لتسهيل قراءة الشفرة على الإنسان، وليس لاسترضاء خوارزميات الكمبيوتر.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_284" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SmsContainer</span><span class="pln"> from </span><span class="str">'./containers/SmsContainer'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">HttpRequests</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">SMSContainer</span><span class="pln"> from </span><span class="str">'./containers/SMSContainer'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">HTTPRequests</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// جيّد أيضا</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> httpRequests </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">];</span><span class="pln">

</span><span class="com">// أفضل</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> </span><span class="typ">TextMessageContainer</span><span class="pln"> from </span><span class="str">'./containers/TextMessageContainer'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// أفضل</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> requests </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
  </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">];</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			اختياريًّا، يمكنك كتابة ثابت بحروف كبيرة إذا تحقّقت الشروط التالية: 1) التصدير، 2) التصريح بالكلمة <code>const</code> ، أي أنه لا يمكن إعادة إسناده، 3) يمكن للمبرمج أن يثق أنه لم يتغيّر لا هو ولا الخاصيّات المتفرّعة عنه.
		</p>

		<p>
			<strong>لماذا؟</strong> هذه أداة إضافية للحالات التي يكون المبرمج فيها غير متأكد من أن المتغيّر ستتغيّر قيمته. تخبر المتغيّرات المكتوبة بحروف كبيرة (مثل <code>UPPERCASE_VARIABLES</code>) المبرمج أن بإمكانه الوثوق من أن تلك الثوابت (وخاصيّاتها) لن تتغيّر قيمتها.
		</p>

		<ul>
<li>
				هل ينطبق الأمر على كل المتغيّرات المعرّفة بالكلمة <code>const</code>؟ لا حاجة لذلك، وبالتالي يجب ألا تُستخدَم الحروف الكبيرة في تسمية الثوابت داخل ملف، ولكنها يجب أن تُستخدَم للثوابت المُصدَّرة.
			</li>
			<li>
				ماذا عن الكائنات المُصدَّرة؟ استخدم الحروف الكبيرة في المستوى الأعلى من التصدير (مثلًا <code>EXPORTED_OBJECT.key</code>) وتأكّد من أن الخاصيّات المتفرّعة كلها لا تتغيّر.
			</li>
		</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_286" style="">
<span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> PRIVATE_VARIABLE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'should not be unnecessarily uppercased within a file'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> THING_TO_BE_CHANGED </span><span class="pun">=</span><span class="pln"> </span><span class="str">'should obviously not be uppercased'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// سيّئ</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> let REASSIGNABLE_VARIABLE </span><span class="pun">=</span><span class="pln"> </span><span class="str">'do not use let with uppercase variables'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ---</span><span class="pln">

</span><span class="com">// مرخَّص به، لكنه لا يضيف قيمة دلالية</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> apiKey </span><span class="pun">=</span><span class="pln"> </span><span class="str">'SOMEKEY'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// أفضل في أغلب الحالات</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> API_KEY </span><span class="pun">=</span><span class="pln"> </span><span class="str">'SOMEKEY'</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ---</span><span class="pln">

</span><span class="com">// سيّء، حروف كبيرة غير ضرورية في الاسم مع انعدام القيمة الدلالية</span><span class="pln">

</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> MAPPING </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  KEY</span><span class="pun">:</span><span class="pln"> </span><span class="str">'value'</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">export</span><span class="pln"> </span><span class="kwd">const</span><span class="pln"> MAPPING </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  key</span><span class="pun">:</span><span class="pln"> </span><span class="str">'value'</span><span class="pln">
</span><span class="pun">};</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	المسترجعات (Accessors)
</h2>

<ul>
<li>
		<p>
			ليس مفروضًا وجود توابع الاسترجاع للوصول إلى الخاصيّات.
		</p>
	</li>
	<li>
		<p>
			لا تستخدم توابع الاسترجاع أو التعديل التي توفّرها جافاسكريبت لأنّ لها آثارًا جانبيةً غير متوقعة، ويصعب اختبارها وصيانتها والتعامل معها. إنْ أردت استخدام المسترجعات (أو المعدّلات) فمن الجيّد استخدام التوابع <code>()getVal</code> و<code>('setVal('hello</code> لهذا الغرض.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_288" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Dragon</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">get</span><span class="pln"> age</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">set</span><span class="pln"> age</span><span class="pun">(</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Dragon</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  getAge</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  setAge</span><span class="pun">(</span><span class="pln">value</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم<code>()isVal</code> أو <code>()hasVal</code> للخاصيّات والتوابع المنطقية.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_290" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">dragon</span><span class="pun">.</span><span class="pln">age</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">dragon</span><span class="pun">.</span><span class="pln">hasAge</span><span class="pun">())</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			لا ضير في إنشاء دوال <code>()get</code> و <code>()set</code>، ولكن يجب أن تكون متسقة.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_292" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Jedi</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  constructor</span><span class="pun">(</span><span class="pln">options </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">const</span><span class="pln"> lightsaber </span><span class="pun">=</span><span class="pln"> options</span><span class="pun">.</span><span class="pln">lightsaber </span><span class="pun">||</span><span class="pln"> </span><span class="str">'blue'</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">.</span><span class="kwd">set</span><span class="pun">(</span><span class="str">'lightsaber'</span><span class="pun">,</span><span class="pln"> lightsaber</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">set</span><span class="pun">(</span><span class="pln">key</span><span class="pun">,</span><span class="pln"> val</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">this</span><span class="pun">[</span><span class="pln">key</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> val</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">get</span><span class="pun">(</span><span class="pln">key</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="kwd">this</span><span class="pun">[</span><span class="pln">key</span><span class="pun">];</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الأحداث
</h2>

<ul>
<li>
		<p>
			عند ربط حمولات البيانات بالأحداث (سواء كانت أحداث DOM أوأحداث مكتبات خاصّة مثل Backbone)، مرّر كائنًا مصنّف النوع (معروف أيضًا باسم “hash”) بدلًا من قيمة خام. سيسمح ذلك لاحقًا بإضافة المزيد من البيانات إلى حمولة الحدث دون الحاجة إلى إيجاد وتحديث كل معالجات الحدث. على سبيل المثال، بدلًا من:
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_294" style="">
<span class="com">// سيئ</span><span class="pln">
$</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">).</span><span class="pln">trigger</span><span class="pun">(</span><span class="str">'listingUpdated'</span><span class="pun">,</span><span class="pln"> listing</span><span class="pun">.</span><span class="pln">id</span><span class="pun">);</span><span class="pln">

</span><span class="com">// ...</span><span class="pln">

$</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">).</span><span class="pln">on</span><span class="pun">(</span><span class="str">'listingUpdated'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">e</span><span class="pun">,</span><span class="pln"> listingID</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// do something with listingID</span><span class="pln">
</span><span class="pun">});</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<p>
	من الأفضل استخدام:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_298" style="">
<span class="com">// جيّد</span><span class="pln">
$</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">).</span><span class="pln">trigger</span><span class="pun">(</span><span class="str">'listingUpdated'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> listingID</span><span class="pun">:</span><span class="pln"> listing</span><span class="pun">.</span><span class="pln">id </span><span class="pun">});</span><span class="pln">

</span><span class="com">// ...</span><span class="pln">

$</span><span class="pun">(</span><span class="kwd">this</span><span class="pun">).</span><span class="pln">on</span><span class="pun">(</span><span class="str">'listingUpdated'</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">e</span><span class="pun">,</span><span class="pln"> data</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// do something with data.listingID</span><span class="pln">
</span><span class="pun">});</span></pre>

<h2>
	jQuery
</h2>

<ul>
<li>
		<p>
			ضع السابقة <code>$</code> قبل متغيرات jQuery .
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_300" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> sidebar </span><span class="pun">=</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'.sidebar'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> $sidebar </span><span class="pun">=</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'.sidebar'</span><span class="pun">);</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> $sidebarBtn </span><span class="pun">=</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'.sidebar-btn'</span><span class="pun">);</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			أضف عمليات البحث المؤقت في jQuery إلى التخبئة (Cache).
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_302" style="">
<span class="com">// سيئ</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> setSidebar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  $</span><span class="pun">(</span><span class="str">'.sidebar'</span><span class="pun">).</span><span class="pln">hide</span><span class="pun">();</span><span class="pln">

  </span><span class="com">// ...</span><span class="pln">

  $</span><span class="pun">(</span><span class="str">'.sidebar'</span><span class="pun">).</span><span class="pln">css</span><span class="pun">({</span><span class="pln">
    </span><span class="str">'background-color'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'pink'</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> setSidebar</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> $sidebar </span><span class="pun">=</span><span class="pln"> $</span><span class="pun">(</span><span class="str">'.sidebar'</span><span class="pun">);</span><span class="pln">
  $sidebar</span><span class="pun">.</span><span class="pln">hide</span><span class="pun">();</span><span class="pln">

  </span><span class="com">// ...</span><span class="pln">

  $sidebar</span><span class="pun">.</span><span class="pln">css</span><span class="pun">({</span><span class="pln">
    </span><span class="str">'background-color'</span><span class="pun">:</span><span class="pln"> </span><span class="str">'pink'</span><span class="pun">,</span><span class="pln">
  </span><span class="pun">});</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			بالنسبة لاستعلامات DOM استخدم ‎<code>$('.sidebar ul')‎</code> أو <code>parent &gt; child $('.sidebar &gt; ul')‎</code>. راجع <a href="http://jsperf.com/jquery-find-vs-context-sel/16" rel="external nofollow">jsperf</a>.
		</p>
	</li>
	<li>
		<p>
			استخدم التابع <code>find</code> في الاستعلام عن الكائنات في نطاق jQuery.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_304" style="">
<span class="com">// سيئ</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'ul'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'.sidebar'</span><span class="pun">).</span><span class="pln">hide</span><span class="pun">();</span><span class="pln">

</span><span class="com">// سيئ</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.sidebar'</span><span class="pun">).</span><span class="pln">find</span><span class="pun">(</span><span class="str">'ul'</span><span class="pun">).</span><span class="pln">hide</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.sidebar ul'</span><span class="pun">).</span><span class="pln">hide</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
$</span><span class="pun">(</span><span class="str">'.sidebar &gt; ul'</span><span class="pun">).</span><span class="pln">hide</span><span class="pun">();</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
$sidebar</span><span class="pun">.</span><span class="pln">find</span><span class="pun">(</span><span class="str">'ul'</span><span class="pun">).</span><span class="pln">hide</span><span class="pun">();</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	المكتبة القياسية
</h2>

<p>
	تحوي <a href="https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects" rel="external nofollow">المكتبة القياسية</a> أدوات مساعدة لم تعد تُستخدم ولكن يُيقى عليها للتوافق مع المتصفحات القديمة.
</p>

<ul>
<li>
		<p>
			استخدم التابع <code>Number.isNaN</code> بدلًا من التابع العام <code>isNaN</code>. استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-restricted-globals" rel="external nofollow">no-restricted-globals</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> يحوّل التابع <code>isNaN</code> القيم غير العددية إلى أعداد، ويُرجع القيمة <code>true</code> لأي شيء يتحوّل إلى <code>NaN</code>. إذا كان السلوك هو ما ترغب فيه، فكن صريحًا في ذلك.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_307" style="">
<span class="com">// سيئ</span><span class="pln">
isNaN</span><span class="pun">(</span><span class="str">'1.2'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
isNaN</span><span class="pun">(</span><span class="str">'1.2.3'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="typ">Number</span><span class="pun">.</span><span class="pln">isNaN</span><span class="pun">(</span><span class="str">'1.2.3'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
</span><span class="typ">Number</span><span class="pun">.</span><span class="pln">isNaN</span><span class="pun">(</span><span class="typ">Number</span><span class="pun">(</span><span class="str">'1.2.3'</span><span class="pun">));</span><span class="pln"> </span><span class="com">// true</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استخدم التابع <code>Number.isFinite</code> بدلًا من التابع العام <code>isFinite</code>. استعن بالقاعدة <a href="https://eslint.org/docs/rules/no-restricted-globals" rel="external nofollow">no-restricted-globals</a>.
		</p>

		<p>
			<strong>لماذا؟</strong> <code>isFinite</code> تحوّل القيم غير العددية إلى أعداد، وتُرجع القيمة <code>true</code> لأي شيء يتحوّل إلى عدد منته. إذا كان السلوك هو ما ترغب فيه، فكن صريحًا في ذلك.
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6629_309" style="">
<span class="com">// سيئ</span><span class="pln">
isFinite</span><span class="pun">(</span><span class="str">'2e3'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">

</span><span class="com">// جيّد</span><span class="pln">
</span><span class="typ">Number</span><span class="pun">.</span><span class="pln">isFinite</span><span class="pun">(</span><span class="str">'2e3'</span><span class="pun">);</span><span class="pln"> </span><span class="com">// false</span><span class="pln">
</span><span class="typ">Number</span><span class="pun">.</span><span class="pln">isFinite</span><span class="pun">(</span><span class="pln">parseInt</span><span class="pun">(</span><span class="str">'2e3'</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">));</span><span class="pln"> </span><span class="com">// true</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<h2>
	الاختبار
</h2>

<ul>
<li>
		يجب أن تكتب اختبارات، وليس أساسيًّا الإطار الذي تستخدمه لذلك. المهم أن تكتبها.
	</li>
	<li>
		احرص على كتابة العديد من الدوال البسيطة والصغيرة، وقلّل من استخدام البيانات المتحوّلة .
	</li>
	<li>
		كن حذرًا عند استخدام أصناف <code>stubs</code> و <code>mocks</code> لأنها يمكن أن تجعل اختباراتك أكثر هشاشة.
	</li>
	<li>
		نستخدم <a href="https://www.npmjs.com/package/mocha" rel="external nofollow">mocha</a> و<a href="https://www.npmjs.com/package/jest" rel="external nofollow">jest</a> في Airbnb. يُستخدَم <a href="https://www.npmjs.com/package/tape" rel="external nofollow">tape</a> كذلك من حين لآخر في وحدات صغيرة ومعزولة.
	</li>
	<li>
		محاولة اختبار 100٪ من الشفرة هو هدف جيد، حتى لو لم يكن دائمًا عمليّا.
	</li>
	<li>
		كلما أصلحت خللًا، قم بكتابة اختبار ارتداد (Regression test). فمن المؤكد أنّه بدونه ستعود الثغرات مجدّدا.
	</li>
</ul>
<p>
	ترجمة - وبتصرّف - للمقال <a href="https://github.com/airbnb/javascript/blob/master/README.md#strings--line-length" rel="external nofollow">Airbnb JavaScript Style Guide</a>
</p>
]]></description><guid isPermaLink="false">632</guid><pubDate>Tue, 06 Mar 2018 14:08:00 +0000</pubDate></item><item><title>&#x62D;&#x644;&#x642;&#x627;&#x62A; for &#x627;&#x644;&#x62A;&#x643;&#x631;&#x627;&#x631;&#x64A;&#x629; &#x628;&#x628;&#x633;&#x627;&#x637;&#x629; &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%AD%D9%84%D9%82%D8%A7%D8%AA-for-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A8%D8%A8%D8%B3%D8%A7%D8%B7%D8%A9-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r624/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_02/5a8e8248cd315_23(1).png.53e33731223b9422f756aabf59e7dd3f.png" /></p>

<p>
	فلنفترض أنك تريد تشغيل دالة اسمها <code>bounceBall</code> أربع مرات. كيف يمكنك ذلك؟ هل ستختار الطريقة التالية؟:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<span class="kwd">function</span><span class="pln"> bounceBall</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// bounce the ball here</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

bounceBall</span><span class="pun">()</span><span class="pln">
bounceBall</span><span class="pun">()</span><span class="pln">
bounceBall</span><span class="pun">()</span><span class="pln">
bounceBall</span><span class="pun">()</span></pre>

<p>
	يمكن أن تكون الطريقة أعلاه مناسبة إذا كنت تريد تنفيذ الدالة بضع مرات. مالذي سيحدُث إن احتجت لتنفيذ الدالة <code>bounceBall</code> مئة مرة؟
</p>

<p>
	الطريقة الأفضل في هذه الحالة هي استخدام تعليمة التكرار الحلقي <code>for</code>.
</p>

<h2 id="تعليمة-التكرار-الحلقي-for">
	تعليمة التكرار الحلقي for
</h2>

<p>
	تنفّذ تعليمة التكرار الحلقي <code>for</code> كتلة من التعليمات البرمجية بعدد المرات التي تريد. في ما يلي مثال على تنفيذ الدالة <code>bounceBall</code> عشر مرات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>for (let i = 0; i &lt; 10; i++) {
  bounceBall()
}
</code></pre>

<p>
	تتكوّن التعليمة <code>for</code> من أربعة أجزاء:
</p>

<ul>
<li>
		العبارة الابتدائية <code>initialExpression</code>
	</li>
	<li>
		الشرط <code>condition</code>
	</li>
	<li>
		عبارة الزيادة <code>incrementalExpression</code>
	</li>
	<li>
		والجملة <code>statement</code>
	</li>
</ul>
<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>for (initialExpression; condition; incrementExpression) {
  statement
}
</code></pre>

<p>
	ستحتاج عندما تريد تنفيذ تعليمة تكرار حلقي إلى جملة برمجية Statement. الجملة هي كتلة الشفرة البرمجية التي تريد تنفيذها مرات عدّة. يمكنك كتابة أي شفرة ترغب بها مهما كان عدد أسطرها، كما يمكنك استخدام دوال.
</p>

<p>
	تأخذ التعليمة <code>for</code> الصيغة التالية عند استخدام الدالة <code>bounceBall</code> في الجزء الخاصّ بالجملة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>for (initialExpression; condition; incrementExpression) {
  bounceBall()
}
</code></pre>

<p>
	ستحتاج كذلك إلى تعريف عبارة ابتدائية Initial expression تبدأ بها تعليمة التكرار الحلقي. هذا هو الجزء الذي تعرّف فيه متغيرا. من المتعارف عليه تسمية المتغير الابتدائي في تعليمة <code>for</code> بالحرف <code>i</code> وإعطاؤه القيمة <code>0</code>.
</p>

<p>
	هكذا تبدو صيغة <code>for</code> عند تحديد عبارتها الابتدائية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>for (let i = 0; condition; incrementExpression) {
  bounceBall()
}
</code></pre>

<p>
	نزيد قيمة المتغيّر (<code>i</code> في مثالنا) - أو ننقُصه - بعد تنفيذ الحلقة التكرارية لأول مرة، وذلك عن طريق عبارة الزيادة Incremental expression. لزيادة قيمة المتغير <code>i</code> بواحد نعيد إسناده بحيث يُصبح يساوي <code>i + 1</code> أي بالعبارة <code>i = i + 1</code>. تُختَصر العبارة <code>i = i + 1</code>على <code>++i</code> والتي يكثُر استخدامها في حلقات التكرار. لنقص قيمة المتغير <code>i</code> بواحد نعيد إسناده بحيث يُصبح يساوي <code>i - 1</code>، أي بالعبارة <code>i = i - 1</code>. تُختَصر العبارة <code>i = i - 1</code> على <code>--i</code>.
</p>

<p>
	بالعودة إلى المثال مع الدالة <code>bounceBall</code> فإننا زدنا المتغيّر <code>i</code> في كل مرة بواحد. تصبح صيغة التعليمة <code>for</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>for (let i = 0; condition; i++) {
  bounceBall()
}
</code></pre>

<p>
	لكن… هل يجدُر بي زيادة قيمة المتغيّر أم النقص منها؟
</p>

<p>
	توجد الإجابة في الجزء الأخير من تعليمة التكرار الحلقي <code>for</code> وهو الشرط. في حالة تحقّق الشرط - أي أن قيمته تساوي <code>true</code> - فإن الجملة الموجودة في التعليمة <code>for</code> تُنفَّذ وإلا فلا.
</p>

<p>
	ينفّذ مفسر جافاسكريبت عبارة الزيادة <code>incrementalExpression</code> مباشرة بعد تنفيذ الجملة <code>statement</code> ثم يتحقّق مجدّدًا من أن قيمة الشرط تساوي <code>true</code> فإن كان الأمر كذلك نفّذ الجملة <code>statement</code> مرة أخرى. يعيد المفسّر الكرة إلى أن تصبح قيمة الشرط <code>false</code>. حينها يتجاوز الحلقة التكرارية وينفّذ الشفرة التي تليها.
</p>

<p>
	إن لم تكن تريد تنفيذ الحلقة فيمكنك جعل قيمة الشرط مساوية لـ <code>false</code> منذ البداية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>// لن تُنفَّذ الحلقة التكرارية التالية نظرا لأن قيمة الشرط تساوي false
for (let i = 0; i &lt; 0; i++) {
  bounceBall()
  const timesBounced = i + 1
  console.log('The ball has bounced ' + timesBounced + ' times')
}
// ستُنفّذ الشفرة التالية فقط
console.log('next line of code')
</code></pre>

<p>
	ستكون نتيجة تنفيذ الشفرة أعلاه على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>next line of code
</code></pre>

<p>
	عندما تريد تنفيذ الحلقة التكرارية مرتين فستحتاج إلى تغيير الشرط بحيث تكون قيمته <code>false</code> بعد تنفيذ عبارة الزيادة مرتين:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>// ستُنفّذ الحلقة التكرارية التالية مرتين
for (let i = 0; i &lt; 2; i++) {
  bounceBall()
  const timesBounced = i + 1
  console.log('The ball has bounced ' + timesBounced + ' times')")
}

console.log('next line of code')
</code></pre>

<p>
	النتيجة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>The ball has bounced 1 times
The ball has bounced 2 times
next line of code
</code></pre>

<p>
	أما إذا أردت تشغيل الحلقة عشر مرات فسيتوجّب عليك تغيير الشرط بحيث تصبح قيمته <code>false</code> بعد تنفيذ عبارة الزيادة عشر مرات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>// ستُنفّذ الحلقة التكرارية التالية عشر مرات
for (let i = 0; i &lt; 10; i++) {
  bounceBall()
  const timesBounced = i + 1
  console.log('The ball has bounced ' + timesBounced + ' times')")
}

console.log('next line of code')
</code></pre>

<p>
	النتيجة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="27123" href="https://academy.hsoub.com/uploads/monthly_2018_02/01_ten-times.png.eced17be8c331a47e0eb564cb86eb0cd.png" rel=""><img alt="01_ten-times.png" class="ipsImage ipsImage_thumbnailed" data-fileid="27123" data-unique="wsc5ixyfb" src="https://academy.hsoub.com/uploads/monthly_2018_02/01_ten-times.thumb.png.e7bac7ba9d4e13f9c286cc156c73b9dd.png"></a>
</p>

<h2 id="الحلقات-غير-المحدودة-infinite-loops">
	الحلقات غير المحدودة Infinite loops
</h2>

<p>
	نجد أنفسنا أمام حلقات غير محدودة عندما تكون قيمة الشرط في الحلقة التكرارية <code>for</code> مساوية دائما لـ<code>true</code>، ممّا يتسبّب في تجمّد التبويب أو المتصفّح ونحتاج بالتالي لإغلاقه وإعادة تشغيله.
</p>

<h2 id="استخدام-الحلقات-التكرارية-مع-المصفوفات-arrays">
	استخدام الحلقات التكرارية مع المصفوفات Arrays
</h2>

<p>
	في الواقع لن تحتاج كثيرا لاستخدام الحلقات التكرارية لتنفيذ دالة عشر مرات كما فعلنا مع الدالة <code>bounceBall</code> السابقة. أغلب استخدامات الحلقات التكرارية هو مع المصفوفات أو الكائنات Objects.
</p>

<p>
	يتمثّل التكرار عبر المصفوفة في المرور مرة واحدة على كل عنصُر في المصفوفة. بالإمكان استخدام طول المصفوفة (التابع <code>length</code>) في الجزء الخاص بالشرط من تعليمة التكرار.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>const fruitBasket = ['موزة', 'تفاحة', 'إجاصة']

// fruitBasket.length is 3
for (let i = 0; i &lt; fruitBasket.length; i++) {
  console.log("توجد " + fruitBasket[i] + " في السلة")
}
</code></pre>

<p>
	النتيجة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>توجد موزة في السلة
توجد تفاحة في السلة
توجد إجاصة في السلة

</code></pre>

<p>
	هناك طريقة بديلة وهي استخدام عبارة نقص بدلًا من عبارة الزيادة، وذلك بالبدء من نهاية المصفوفة في العبارة الابتدائية ضمن تعليمة التكرار:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>for (let i = fruitBasket.length - 1; i &gt;= 0; i--) {
  console.log("توجد " + fruitBasket[i] + " في السلة")
}
</code></pre>

<p>
	النتيجة (لاحظ الفرق):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>توجد إجاصة في السلة
توجد تفاحة في السلة
توجد موزة في السلة
</code></pre>

<h3 id="المرور-على-المصفوفات-بالحلقة-for-of">
	المرور على المصفوفات بالحلقة for of
</h3>

<p>
	هناك طريقة ثالثة - أفضل بكثير - للمرور عبر مصفوفة، وهي استخدام تعليمة التكرار الحلقي <code>for...of</code> وهي تعليمة جديدة من إضافات المعيار ES6. تُكتَب التعليمة بالصيغة التالية
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>const fruitBasket = ['موزة', 'تفاحة', 'إجاصة']
for (let fruit of fruitBasket) {
  console.log("توجد " + fruit + " في السلة")
}
</code></pre>

<p>
	النتيجة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>توجد موزة في السلة
توجد تفاحة في السلة
توجد إجاصة في السلة
</code></pre>

<p>
	يُفضَّل استخدام التعليمة <code>for ...of</code> بدلا من الطريقة التقليدية لاستخدام تعليمة التكرار الحلقي <code>for</code> عند التعامل مع المصفوفات فهي تمرّ على المصفوفة لمرة واحدة فقط، كما لا تحتاج إلى طول المصفوفة؛ ممّا يجعل قراءة الشفرة وصيانتها أيسر بكثير.
</p>

<p>
	يمكن استخدام التعليمة <code>for ...of</code> مع أي كائن لديه الخاصيّة <code>Symbol.iterator</code>. إن طبعت مصفوفة فارغة باستخدام التعليمة <code>console.log</code> فسترى أن لديها خاصيّة باسم <code>Synmbol.iterator</code> (ضمن المفتاح <code>_proto_</code>).
</p>

<p style="text-align: center;">
	<img alt="02_Iterator.png" class="ipsImage ipsImage_thumbnailed" data-fileid="27124" data-unique="o71mbc29t" src="https://academy.hsoub.com/uploads/monthly_2018_02/02_Iterator.png.9ac39458c42326108fd04f47fc7277a9.png"></p>

<h2 id="العمليات-المنطقية-في-الحلقات-التكرارية">
	العمليات المنطقية في الحلقات التكرارية
</h2>

<p>
	يمكنك استخدام <code>if/else</code> أو أي عمليات منطقية أخرى داخلة حلقة <code>for</code> التكرارية.
</p>

<p>
	فلنفترض مثلا أن لديك مصفوفة بمجموعة من الأعداد وتريد إنشاء مصفوفة ثانية تتضمّن أعداد المصفوفة الأولى التي تصغُر 20.
</p>

<p>
	حتى تصل إلى هدفك فيجب أن تمرّ أولا على عناصر المصفوفة الأولى بحلقة <code>for</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>const numbers = [25, 22, 12, 56, 8, 18, 34];

for (let num of numbers) {
  // سنكمل التعليمات بعد قليل
}
</code></pre>

<p>
	ثم نتحقّق ما إذا كان العنصُر الذي نمرّ عليه يقل عن 20. تصبح الشفرة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>const numbers = [25, 22, 12, 56, 8, 18, 34];

for (let num of numbers) {
  if (num &lt; 20) {
    // نكمل بعد قليل
  }
}
</code></pre>

<p>
	إذا كان العنصُر أصغر من 20 نضيفه إلى مصفوفة أخرى. نستعمل التابع <code>push</code> لهذا الغرض. تصبح الشفرة كالتالي (<code>smallerThan20</code> هو اسم المصفوفة الثانية):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5768_7" style="">
<code>const numbers = [25, 22, 12, 56, 8, 18, 34];
let smallerThan20 = []

for (let num of numbers) {
  if (num &lt; 20) {
    smallerThan20.push(num)
  }
}
</code></pre>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://zellwk.com/blog/js-for-loops/" rel="external nofollow">Understanding for loops</a> لصاحبه Zell Liew.
</p>
]]></description><guid isPermaLink="false">624</guid><pubDate>Fri, 23 Feb 2018 08:03:02 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; Functions &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-functions-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r620/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_02/5a859b0803b4d_16(1).png.43c066156956b8e9c6dbfcceaaa67ec1.png" /></p>

<p>
	تخيّل أنك تعيش في قرية لا تتوفّر على شبكة مياه. تحتاج، للحصول على الماء، لأخذ سطل فارغ والذهاب إلى بئر وسط القرية وسحب المياه من البئر ثم العودة إلى المنزل.
</p>

<p>
	تعاود الكرة مرات عدّة في اليوم، حسب حاجتك للمياه. سيكون شرحُ ما تفعله بالتفصيل في كل مرة تُسأل فيها عن الأمر مضيعة للوقت؛ لذا بدلا من أن تقول “آخذ سطلا فارغا وأذهب إلى البئر وسط المدينة، ثم أسحب دلوا من الماء من البئر وأفرغه في السطل وأعود”، بدلا من ذلك تجيب اختصارا “أجلب الماء”.
</p>

<p>
	لقد أنشأت بهذه الإجابة دالة برمجية Function.
</p>

<h2 id="تعريف-الدوالّ">
	تعريف الدوالّ
</h2>

<p>
	الدالة هي كتلة من الأسطر البرمجية التي تنفّذ مجموعة من المهامّ وفق ترتيب محدَّد، مثلا: “آخذ السطل، أذهب إلى البئر، أسحب الماء منه وأعود”.
</p>

<p>
	تُعرَّف الدالة بالصياغة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<span class="kwd">function</span><span class="pln"> functionName </span><span class="pun">(</span><span class="pln">parameters</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// نفّذ المهام هنا</span><span class="pln">
</span><span class="pun">}</span></pre>

<ul>
<li>
		<code>function</code> هي الكلمة المفتاحية التي تخبر جافاسكريبت أنك بصدد الإعلان عن دالة.
	</li>
	<li>
		<code>functionName</code> هو اسمُ الدالة. في المثال أعلاه فإن اسم الدالة يمكن أن يكون <code>drawWater</code> (اغرف الماء). يمكن أن يكون اسمُ الدالة أيا اسم تختاره ما دام يحترم شروط أسماء المتغيّرات، أي:
		<ul>
<li>
				أن يكون كلمة واحدة،
			</li>
			<li>
				أن يتكوّن فقط من حروف لاتينية (a-z, A-Z)، أرقام (0-9) أو علامة تسطير سفلي <code>_</code>.
			</li>
			<li>
				أن لا يكون <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords" rel="external nofollow">كلمة محجوزة Reserved keywords</a> في جافاسكريبت.
			</li>
		</ul>
</li>
	<li>
		المعاملات Parameters هي مجموعة من المتغيّرات تفصل بينها فاصلة لاتينية <code>,</code> تريد تعريفها للاستخدام داخل الدالة. المعاملات اختيارية ويمكن تعريف دالة دون معاملات.
	</li>
</ul>
<h2 id="استخدام-الدوالّ">
	استخدام الدوالّ
</h2>

<p>
	يمكن استخدامُ الدالة بعد تعريفها. تدلّ العبارات “استخدام الدالة”، “تنفيذ الدالة” أو “استدعاء الدالة” على الشيء ذاته. لاستدعاء الدالة نكتُب اسمَها متبوعا بقوسين <code>()</code>. في ما يلي مثال نعرّف فيه دالة باسم <code>sayHello</code> ثم نستخدمها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>// تعريف الدالة
function sayHello () {
  console.log('Hello world!')
}

// استدعاء الدالة
sayHello()
</code></pre>

<p>
	ينتُج عن تنفيذ الدالة بالطريقة المشروحة أعلاه طباعةُ العبارة <code>Hello world</code>.
</p>

<h3 id="الإزاحة-the-indentation">
	الإزاحة The indentation
</h3>

<p>
	يجب إزاحة جميع الأسطُر البرمجية الموجودة في كتلة، أي تقع بين قوسين معكوفين <code>{}</code>، إلى اليمين. هذه الممارسة مهمّة جدا وتساعد في تسهيل قراءة الشفرة البرمجية وصيانتها، وتمكّنك بنظرة واحدة معرفة أن التعليمة <code>console.log('Hello world')</code> هي جزء من الدالة <code>sayHello</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>function sayHello () {
  // تعليمة console.log أدناه مزاحة قليلا إلى اليمين وبالتالي فهي جزء من الدالة sayHello
  console.log('Hello world!')
}
</code></pre>

<p>
	يمكنك استخدام مسافتيْن (زر المسافة في لوحة المفاتيح مرتيْن) أو مفتاح الجدولة في لوحة المفاتيح Tab لإزاحة التعليمات في الشفرة. يفضّل بعض المطوّرين مفتاح الجدولة في ما يُفضّل آخرون المسافتين. استخدم أيهما تراه مناسبا، مع التأكد من استخدام نفس طريقة الإزاحة في كامل الشفرة.
</p>

<h3 id="المعاملات">
	المعاملات
</h3>

<p>
	تأخذ معظم الدوال معاملات، وهي عبارة عن سلسلة من المتغيّرات تفصل بينها فاصلة <code>,</code>، تُعرَّف لتُستخدَم داخل الدالة. يمكنك تعريف معاملات بالعدد الذي تريد.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>function functionName(param1, param2, param3) {
  // نفّذ المهام هنا
}
</code></pre>

<p>
	تُسنَد القيم إلى المعاملات بتمريرها بين قوسين إلى الدالة في سلسلة تفصل بينها فاصلة <code>,</code>. تُسمَّى القيم المُمرَّرة إلى الدالة بالمعطيات Arguments. يُسنَد المعطى الأول إلى المعامل الأول، والمعطى الثاني إلى المعامل الثاني وهكذا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>functionName('arg1', 'arg2')
</code></pre>

<p>
	فلنشرح الأمر أكثر بمثال. فلنقل إنك تريد تعريف دالة باسم <code>sayName</code> وظيفتها تسجيل الاسم الشخصي والاسم العائلي لشخص. تبدو الدالة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>function sayName(firstName, lastName) {
  console.log('اسمك الشخصي هو ' + firstName)
  console.log('اسمك العائلي هو ' + lastName)
}
</code></pre>

<p>
	تُعرّف الدالة معاملين هما <code>firstName</code> و<code>lastName</code>. فلنفترض أن الاسم الشخصي هو “محمد” والاسم العائلي هو “عيسى”. لجعل الدالة تعمل على النحو المرغوب نمرّر لها المعطييْن <code>محمد</code> و<code>عيسى</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>sayName('محمد', 'عيسى')
</code></pre>

<p>
	نحصُل بعد تنفيذ الدالة بالطريقة أعلاه على النتيجة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>اسمك الشخصي هو محمد
اسمك العائلي هو عيسى
</code></pre>

<p>
	عند تعريف معامل أثناء تعريف الدالة ثم استخدام الدالة دون تمرير معطيات فإن المعامل سيأخذ القيمة “غير معرَّف” <code>undefined</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>sayName()
</code></pre>

<p>
	النتيجة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>// اسمك الشخصي هو undefined
// اسمك العائلي هو undefined
</code></pre>

<h3 id="جملة-إرجاع-return-statement">
	جملة إرجاع Return statement
</h3>

<p>
	يمكن أن تحتوي الدوال على جملة إرجاع تتكوَّن من الكلمة المفتاحية <code>return</code> متبوعة بقيمة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>function functionName () {
  return 'some-value'
}
</code></pre>

<p>
	عندما يجد مفسّر جافاسكريبت هذه الجملة فإنه يتوقّف عن تنفيذ التعليمات الموالية في الدالة ويُرجع قيمة (يمرّر القيمة المعنية إلى الشفرة التي استدعت الدالة):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>function get2 () {
  return 2
  console.log('blah') // لن تُنفذ هذه التعليمة
}

const results = get2()
console.log(results) // تُطبع القيمة 2، وهي القيمة المُرجَعة من الدالة
// ملحوظة: لن تُطبَع القيمة 'blah'

</code></pre>

<p>
	إن كانت الكلمة المفتاحية <code>return</code> متبوعة بعبارة بدلا من قيمة حرفية فإن مفسّر جافاسكريبت يحدّد نتيجة تنفيذ العبارة ثم يُرجِع القيمة الناتجة.
</p>

<p>
	تذكّر أن القيم التي يمكن لجافاسكريبت تمريرها هي إما أنواع أصلية (مثل سلاسل المحارف، الأعداد والقيم المنطقية) أو كائنات Objects (دوالّ، مصفوفات وكائنات). كلّ ما عدا ذلك يجب تقويمه (معرفة قيمته) قبل التمرير إلى الشفرة التي استُدعِيت فيها الدالة.
</p>

<h3 id="تسلسل-تنفيذ-التعليمات-عند-استدعاء-الدوال">
	تسلسل تنفيذ التعليمات عند استدعاء الدوال
</h3>

<p>
	قد تكون الدوال صعبة الفهم على المبتدئين. سنرى، للتأكد من فهم الدوال تماما، مالذي يحدُث عند تعريف دالة واستدعائها. هذه المرة سنتناول كل خطوة على حدة. في ما يلي الشفرة التي سنعمل على تفكيك عملها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>function add2 (num) {
  return num + 2
}

const number = add2(8)
console.log(number) // تطبع العدد 10
</code></pre>

<p>
	أولا وقبل كل شيء، نحتاج إلى تعريف الدالة قبل أن نتمكّن من استخدامها. يرى مفسّر جافاسكريبت في السطر الأول الكلمة المفتاحية <code>function</code> فيعرف أن الكلمة التي تليها، أي <code>add2</code> هي اسم الدالة. بعد تعرّف المفسّر على اسم الدالة يتجاوز الشفرة الموجودة بين معكوفين التي تلي الاسم، لأنه حتى الآن لم يُطلب منه تنفيذ الدالة.
</p>

<p>
	في السطر التالي يجد المفسّر أننا عرّفنا متغيّرا ذا قيمة ثابتة اسمه <code>number</code> وأسندنا له القيمة <code>add2(8)</code>. بما أن الطرف الموجود على يمين علامة الإسناد <code>=</code> هو دالة، فإن جافاسكريبت سيحتاج إلى تنفيذ الدالة قبل إسناد قيمتها إلى المتغيّر. يعيّن المفسّر القيمة <code>8</code> لتكون معطى للمعامل <code>num</code> في الدالة ويبدأ بتنفيذ الدالة.
</p>

<p>
	عند الدخول إلى كتلة الدالة (الشفرة بين قوسين معكوفين بعد اسم الدالة) يجد المفسّر أمامه الكلمة المفتاحية <code>return</code> متبوعة بعبارة <code>num + 2</code>، فيعرف أنه سيحتاج إلى معرفة نتيجة العبارة قبل الخروج من الدالة. بما أن قيمة <code>num</code> هي <code>8</code> فإن <code>num + 2</code> يجب أن تساوي <code>10</code>.
</p>

<p>
	عرف المفسّر الآن قيمة العبارة <code>num + 2</code> ويمكنه بالتالي إرجاع القيمة المُتحصَّل عليها إلى الشفرة التي استدعت الدالة. فيضع القيمة المرجعة مكان الدالة فتُصبح <code>10</code> مكان <code>add2(8)</code>. يُنشئ المفسّر، بعد اكتمال تنفيذ الطرف الأيمن من عملية إسناد المتغيّر والحصول على نتيجتها، متغيّرا بالاسم المذكور <code>number</code> ويعطيه القيمة <code>10</code>. هكذا يُقرأ تسلسل تنفيذ التعليمات في الدوال.
</p>

<h3 id="رفع-الدوال-hoisting">
	رفع الدوال Hoisting
</h3>

<p>
	تُنقَل الدوال تلقائيا عند تعريفها بالطريقة التي رأيناها سابقا إلى أعلى الشفرة البرمجية. بمعنى أن طريقتيْ التعريف والاستخدام التاليّتيْن متكافئتان تماما:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>function sayHello () {
  console.log('Hello world!')
}
sayHello()

// تُحوّل الشفرة التالية عند التنفيذ تلقائياإلى الشفرة أعلاه
sayHello()
function sayHello () {
  console.log('Hello world!')
}
</code></pre>

<p>
	قد يؤدّي الرفع التلقائي للدوال إلى الإرباك؛ لذا من المناسب تعريف الدوال دائما قبل استخدامها.
</p>

<h2 id="تعريف-الدوال-بعبارات-الدوال-function-expressions">
	تعريف الدوال بعبارات الدوال Function expressions
</h2>

<p>
	توجد طريقة ثانية لتعريف الدوال، وهي عبارات الدوال. يُعرَّف في هذه الحالة متغيّر ويُسنَد إلى دالة غير مسمّاة (دالة مجهولة الاسم Anonymous funvtion)
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>const sayHello = function () {
  console.log('This is declared with a function expression!')
}
</code></pre>

<p>
	ينبغي الانتباه إلى أن الدوال المُعرَّفة بعبارات لا تُنقَل تلقائيا إلى أعلى الشفرة. تُنتج الشفرة التالية خطأ:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6197_7" style="">
<code>sayHello () // Error, sayHello is not defined
const sayHello = function () {
  console.log('this is a function!')
}
</code></pre>

<p>
	تُستخدَم الدوال المُعرَّفة بعبارات كثيرا في توابع الكائنات Object methods وفي <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-es6-%D9%86%D8%B7%D8%A7%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D8%B3%D9%87%D9%85%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D8%A6%D9%8A%D8%A9-r567#%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D8%B3%D9%87%D9%85%D9%8A%D8%A9" rel="">الدوالّ السهمية Arrow functions</a>.
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	الدالة هي كتلة من التعليمات البرمجية تنفَّذ وفق ترتيب محدَّد على منوال: خذ سطلا فارغا، اذهب إلى البئر، اسحب الماء ثم عُد إلى المنزل.
</p>

<p>
	تُستدعى الدالة بإضافة قوسين <code>()</code> بعد اسمها. يمكنك عند استدعاء الدالة إضافة معطيات جديدة بذكرها بين القوسين مفصولة بفاصلة <code>,</code>.
</p>

<p>
	يمكن لكلّ دالة أن تحوي جملة إرجاع تعيد قيمة إلى الشفرة التي استُدعِيت منها.
</p>

<p>
	يُفضَّل دائما تعريف الدوال قبل استخدامها.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://zellwk.com/blog/js-functions/" rel="external nofollow">Understanding JavaScript Functions</a> لصاحبه Zell Liew.
</p>
]]></description><guid isPermaLink="false">620</guid><pubDate>Thu, 15 Feb 2018 14:42:13 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62C;&#x645;&#x644; &#x627;&#x644;&#x634;&#x631;&#x637;&#x64A;&#x629; if/else &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AC%D9%85%D9%84-%D8%A7%D9%84%D8%B4%D8%B1%D8%B7%D9%8A%D8%A9-ifelse-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r616/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_02/5a735091ec0c1_09(2).png.2553b5660052b10b0ff8a2a37e148327.png" /></p>
<p>
	فلنقل إنك تسير في شارع مكتظ وسط المدينة، تتأهب للمرور في مفترق طرق وفي هذه الأثناء انتقلت الإشارة الضوئية الخاصّة بالراجلين إلى اللون الأحمر. مالذي ستفعله؟ تتوقف… أليس كذلك؟ ماذا لو تبدّل اللون إلى الأخضر بعد ذلك؟ تعود إلى المشي. يمكننا اعتماد نفس المبدأ في الشفرات البرمجية. يبدو الأمر كما لو أنك تقول “إن أصبح لون الإشارة أحمر فيجب عليك التوقف وإلا استمرّ في المشي”. هذا بالضبط هو عمل الجملة <code>if/else</code> (إنْ… وإلا) في جافاسكريبت.
</p>

<h2>
	<a id="_ifelse_9" rel=""></a>الجملة <code>if/else</code>
</h2>

<p>
	تساعد الجملة <code>if/else</code> بالتحكّم في ما يفعله برنامجك في حالات محدّدة. تأخذ الصيغة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">condition</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// افعل شيئا هنا</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// افعل شيئا مغايرا هنا</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يخبر الشرط Condition الجملة <code>if/else</code> مالذي يجب عليها التحقّق منه قبل الاستمرار. إذا كانت قيمة الشرط صحيحة (تساوي <code>true</code>) فإن جافاسكريبت سينفّذ الشفرة الموجودة داخل كتلة <code>if</code>. أما إذا كانت قيمة الشرط غير صحيحة (أي <code>false</code>) فإن الشفرة الموجودة في الكتلة <code>else</code> هي ما سيُنفّذ. بالعودة إلى مثال الإشارة الضوئية أعلاه فإن الأمر سيأخذ الصيغة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>if (الإشارة حمراء) {
  // توقّف عن المشي
} else {
   // استمرّ في المشي
}
</code></pre>

<p>
	إن احتجت للتحقّق من شروط عدّة فيمكنك إضافة <code>else if</code> بين كتلتيْ <code>if</code> و<code>else</code>. متى ستحتاج لشرط ثان؟ فلنقل إنك تمرّ عبر طريق صغيرة. إن لم تكن هناك سيارات فهل ستستمر في الانتظار إلى أن يتغيّر لون الإشارة الضوئية؟ على الأرجح ستواصل طريقك. بترجمة الحالة أعلاه إلى شفرة برمجية نجد التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>if (الإشارة حمراء) {
  // توقّف عن المشي
} else if (توجد سيارات) {
  // توقّف عن المشي
} else if (شرط آخر) {
  // افعل أمرا آخر
} else {
  // أمر أخير
}
</code></pre>

<p>
	إذا كان الشرط الأول في الشفرة أعلاه متحقّقا فإن مفسّر جافاسكريبت ينفّذ الشفرة الموجودة ضمن كتلة <code>if</code>، أما إذا كان هذا الشرط غير متحقّق فإن المفسّر ينظُر في الشرط الموجود في جملة <code>else if</code> الموالية لمعرفة ما إذا كان متحقّقا… وهكذا إلى إن يمرّ عبر جميع جمل <code>else if</code>. يعتمد مفسّر جافاسكريبت على أساسيْن لمعرفة تحقّق الشرط من عدمه:
</p>

<ul>
	<li>
		عوامل المقارنة Comparison operators.
	</li>
	<li>
		القيم الصحيحة و القيم الخاطئة.
	</li>
</ul>

<h2>
	<a id="__58" rel=""></a>عوامل المقارنة
</h2>

<p>
	توجد أربعة عوامل أساسية للمقارنة:
</p>

<ul>
	<li>
		“أكبر من” <code>&lt;</code> أو “أكبر من أو يساوي”<code>=&lt;</code>
	</li>
	<li>
		“أصغر من” <code>&gt;</code> أو “أصغر من أو يساوي”<code>=&gt;</code>
	</li>
	<li>
		“يساوي تماما” <code>===</code> أو “يساوي” <code>==</code>
	</li>
	<li>
		“يختلف تماما” <code>==!</code> أو “يختلف” <code>=!</code>
	</li>
</ul>

<p>
	النوعان الأولان من عوامل المقارنة واضحان ويستخدمان لمقارنة الأعداد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>24 &gt; 23 // صحيح
24 &gt; 24 // خاطئ
24 &gt;= 24 // صحيح

24 &lt; 25 // صحيح
24 &lt; 24 // خاطئ
24 &lt;= 24 // صحيح
</code></pre>

<p>
	النوعان التاليّان يُستخدمان لمقارنة تساوي شيئين:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>24 === 24 // صحيح
24 !== 24 // خاطئ
</code></pre>

<p>
	إلا أنه يوجد فرق بين “يساوي تماما” <code>===</code> و “يساوي” <code>==</code>، وبين “يختلف تماما” <code>==</code> ! و “يختلف” <code>=</code>!
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>'24' === 24 // خاطئ
'24' == 24 // صحيح

'24' !== 24 // صحيح
'24' != 24 // خاطئ
</code></pre>

<p>
	يتّضح من المثال أعلاه أن مقارنة العدد <code>24</code> بسلسلة المحارف <code>24</code> تعطي نتيجة خاطئة عند استخدام العامل “يساوي تماما” (<code>===</code>) بينما تعطي نتيجة صحيحة عند استخدام العامل “يساوي” (<code>==</code>). لماذا هذا الاختلاف؟ فلنر الفرق بين “يساوي تماما” و “يساوي”.
</p>

<h3>
	<a id="___________96" rel=""></a>الفرق بين <code>===</code> و <code>==</code> (و بين <code>==!</code> و <code>=!</code>)
</h3>

<p>
	أنواع البيانات Data types في جافاسكريبت ليست صرامة بل متساهلة، عكس لغات أخرى. يعني هذا أننا لا نهتم عندما نعرّف متغيّرا بنوع البيانات الذي ستأخذه قيمة هذا المتغيّر.
</p>

<p>
	يمكنك تعريف أي متغيّر وسيتكفّل مفسّر جافاسكريبت بالتعامل مع نوع البيانات الخاصّ بقيمة المتغيّر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>const aString = 'Some string'
const aNumber = 123
const aBoolean = true
</code></pre>

<p>
	عند استخدام العامل “يساوي تماما” (<code>===</code>) أو “يختلف تماما” (<code>==!</code>) فإن مفسّر جافاسكريبت يأخذ أنواع بيانات قيم المتغيّرات بالحسبان؛ لهذا السبب فإن سلسلة المحارف <code>24</code> تختلف عن العدد <code>24</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>'24' === 24 // خطأ
'24' !== 24 // صحيح
</code></pre>

<p>
	أما عند استخدام العامل “يساوي” (<code>==</code>) أو “يختلف” (<code>=!</code>) فإن مفسّر جافاسكريبت يحوّل نوع البيانات بحيث يتساوى نوع طرفيْ المقارنة قبل أن ينظُر في القيمة. عمومًا، يحاول مفسّر جافاسكريبت تحويل جميع أنواع البيانات إلى أعداد عند استخدام عوامل المقارنة (ما عدا <code>===</code>و<code>==!</code>). تُحوَّل سلسلة المحارف <code>24</code> في المثال أدناه إلى العدد <code>24</code> قبل المقارنة. هذا هو السبب الذي يجعل سلسلة المحارف <code>24</code> تساوي العدد <code>24</code> عند استخدام العامل <code>==</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>'24' == 24 // صحيح
'24' != 24 // خاطئ
</code></pre>

<p>
	يمكن كذلك تحويل القيم المنطقية (<code>true</code> و<code>false</code>) إلى أعداد، وعندها تصبح قيمة <code>true</code> تساوي <code>1</code> و<code>false</code> تساوي <code>0</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>0 == false // صحيح
1 == true // صحيح
2 == true // خاطئ
</code></pre>

<p>
	يعدّ التحويل التلقائي الذي يقوم به مفسّر جافاسكريبت أثناء استخدام عوامل المقارنة أحد أكثر الأسباب شيوعا لصعوبة التعرف على العلل Bugs أثناء تطوير البرامج؛ لذا استخدم دوما عوال المقارنة التامّة (<code>===</code> أو<code>==!</code>).
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة Python
		</p>

		<p class="banner-subtitle">
			احترف تطوير التطبيقات مع أكاديمية حسوب والتحق بسوق العمل فور انتهائك من الدورة
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/python-application-development" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة Python" src="https://academy.hsoub.com/learn/assets/images/courses/python-application-development.png">
	</div>
</div>

<h3>
	<a id="___128" rel=""></a>مقارنة الكائنات والمصفوفات
</h3>

<p>
	حاول أن تقارن بين الكائنات أو بين المصفوفات بالعامل <code>===</code> أو <code>==</code> وستجد نتيجة مفاجئة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>const a = { isHavingFun: true }
const b = { isHavingFun: true }

console.log(a === b) // خطأ: الكائن a مختلف تماما عن الكائن b
console.log(a == b) // خطأ: الكائن a مختلف عن الكائن b
</code></pre>

<p>
	الكائنان <code>a</code> و<code>b</code> في المثال أعلاه يبدوان متشابهين تماما: كلاهما كائن ويحويان نفس القيم. الأمر الغريب هو أن المقارنة <code>a === b</code> ترجع دائما قيمة خاطئة <code>false</code>؛ لماذا؟ فلنفترض أنكَ وأخاك (أو أنكِ وأختك) توأم. تبدو مشابهًا تمامًا لأخيك: نفس لون الشعر، نفس شكل الوجه، نفس الثياب؛ كيف يمكن التفريق بينك وأخيك؟ سيكون الأمر صعبًا. لدى كل كائن في جافاسكريبت بطاقة تعريف (هوية) تُسمّى مرجع الكائن Object’s reference. عند استخدام عوامل المقارنة للتحقّق من تساوي كائنين في جافاسكريبت فإنك تطلُب من المفسر التحقّق ممّا إذا كان للكائنيْن نفسُ المرجع (بطاقة التعريف).
</p>

<p>
	ليس غريبًا الآن أن تكون قيمة الشرط <code>a === b</code> في المثال أعلاه مساوية لـ<code>false</code>. فلنعدّل قليلاً على المثال ونسند <code>a</code> إلى <code>b</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>const a = { isHavingFun: true }
const b = a
</code></pre>

<p>
	تصبح نتيجة المقارنة <code>a === b</code> الآن مساوية لـ <code>true</code> (أي أن الكائنين متساويان). السبب في ذلك هو أن الكائنين <code>a</code> و<code>b</code> لديهما الآن نفس المرجع.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>console.log(a === b) // true
</code></pre>

<h2>
	<a id="_____159" rel=""></a>القيم الصحيحة و القيم الخاطئة
</h2>

<p>
	إن وضعت اسم متغيّر (<code>hasApples</code> - بمعنى لديه تفاح - في المثال أدناه) مكان الشرط في جملة <code>if/else</code> فإن مفسّر جافاسكريبت سيبحث عن قيمة صحيحة أو قيمة خاطئة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>const hasApples = 'true'
if (hasApples) {
  // تناول تفاحة
} else {
  // اشتر تفاحا
}
</code></pre>

<p>
	القيم الخاطئة هي قيم تأخذ القيمة <code>false</code> عند تحويلها إلى نوع البيانات المنطقية Boolean. توجد ست قيم خاطئة في جافاسكريبت:
</p>

<ul>
	<li>
		<code>false</code>
	</li>
	<li>
		<code>undefined</code>
	</li>
	<li>
		<code>null</code>
	</li>
	<li>
		<code>0</code> (العدد صفر)
	</li>
	<li>
		<code>""</code> (سلسلة محارف فارغة)
	</li>
	<li>
		<code>NaN</code>
	</li>
</ul>

<p>
	على الجانب الآخر، القيم الصحيحة هي تلك التي تأخذ القيمة <code>true</code> بعد تحويلها إلى بيانات منطقية. في حالة الأعداد فإن أية قيمة مغايرة للصفر تُحوَّل إلى قيمة صحيحة. تُشجّع جافاسكريبت على استخدام التحويل التلقائي إلى قيم صحيحة وقيم خاطئة لكونها تجعل من الشفرة البرمجية أقصر وأسهل فهما. إن أردت على سبيل المثال التحقّق من أن سلسلة محارف فارغة فيمكنك استخدام هذه السلسلة مباشرة في شرط الجملة <code>if/else</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6073_8" style=""><code>const str = ''

if (str) {
  // سلسلة المحارف غير فارغة
} else {
  // سلسلة المحارف فارغة
}
</code></pre>

<h3>
	<a id="_196" rel=""></a>خاتمة
</h3>

<p>
	تُستخدم الجمل الشرطية <code>if/else</code> للتحكّم في عمل البرامج في حالات محدّدة؛ فتسمح لك بتحديد ما إذا كان يتوجب عليك الاستمرار في المشي أو الانتظار لتجاوز مفترق طرق.
</p>

<p>
	توجد طريقتان للتحقّق من الشروط في جافاسكريبت:
</p>

<ul>
	<li>
		عوامل المقارنة
	</li>
	<li>
		القيم الصحيحة والقيم الخاطئة
	</li>
</ul>

<p>
	ترجمة - تصرّف - للمقال <a href="https://zellwk.com/blog/js-if-else/" rel="external nofollow">Understanding if/else statements</a> لصاحبه Zell Liew.
</p>
]]></description><guid isPermaLink="false">616</guid><pubDate>Fri, 09 Feb 2018 07:09:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x651;&#x645;&#x629; &#x639;&#x646; &#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x651;&#x631;&#x627;&#x62A; Variables &#x641;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D9%91%D8%B1%D8%A7%D8%AA-variables-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r612/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_01/5a6f4b62d6fc7_02(1).png.74d9534f7c95b5fac185b1d75d5acd56.png" /></p>

<p>
	نكتُب شفرات برمجيةً أساسا لحلّ مشاكل. مالذي يحدُث عندما تنقر على زرّ؟ هذه أيضًا مشكلة وينبغي علينا - نحن المطورين - حلّها.
</p>

<p>
	نبدأ هذا الدّرس بحلّ مشكلة صغيرة.
</p>

<h2>
	<a id="__4" rel=""></a>عدّ التفاحات
</h2>

<p>
	إن كانت لديك 4 تفاحات واشتريت 27 تفاحة أخرى فكم سيكون لديك من تفاحة؟ اكتُب الإجابة في محرّر النصوص.
</p>

<p>
	ما هي إجابتك؟
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9603_7" style="">
<span class="com">// هل هي هذه؟</span><span class="pln">
</span><span class="lit">31</span><span class="pln">

</span><span class="com">// Or أم هذه؟</span><span class="pln">
</span><span class="lit">4</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">27</span></pre>

<p>
	الإجابتان صحيحتان، إلا أن الأخيرة أحسن؛ إذ أنك تترك لجافاسكريبت عبْء الحساب وتخبره كيف يصل إلى النتيجة.
</p>

<p>
	ولكن لا يزال عندنا مشكلة في الشفرة السابقة. إنْ نظرت إلى <code>4 + 27</code> خارج سياق مشكل التفاحات، فهل ستعرف أننا نعدّ التفاحات التي تحملها الآن؟ الأرجح أن الإجابة هي لا.
</p>

<p>
	الأفضل هو استخدام الطريقة الرياضية لإحلال متغيّرات مكان الأعداد 4 و27؛ إن فعلنا ذلك فستكون لدينا القدرة على كتابة شفرة برمجية ذات معنى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9603_7" style="">
<code>initialApples + applesBought
</code></pre>

<ul>
<li>
		<code>initialApples</code>: عدد التفاحات الابتدائي.
	</li>
	<li>
		<code>applesBought</code>: عدد التفاحات المشتراة.
	</li>
</ul>
<p>
	تُسمّى عمليّة إحلال متغيّر باسم <code>initialApples</code> مكان العدد 4 بتعريف المتغيّر Declaring a variable.
</p>

<h2>
	<a id="__29" rel=""></a>تعريف المتغيّرات
</h2>

<p>
	تُعرَّف المتغيّرات بالصيغة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9603_7" style="">
<code>const variableName = 'value'
</code></pre>

<p>
	توجد أربعة أجزاء في الجملة السابقة يجب الانتباه إليها:
</p>

<ul>
<li>
		اسم المتغيّر <code>variableName</code>
	</li>
	<li>
		القيمة Value
	</li>
	<li>
		علامة الإسناد Assignment <code>=</code>
	</li>
	<li>
		الكلمة المفتاحية <code>const</code>
	</li>
</ul>
<h3>
	<a id="__41" rel=""></a>اسم المتغيّر
</h3>

<p>
	تُشير <code>variableName</code> إلى اسم المتغيّر الذي أنت بصدد تعريفه. يمكنك إعطاء المتغيّر أي اسم تريده بشرط:
</p>

<ul>
<li>
		أن يكون كلمة واحدة
	</li>
	<li>
		أن يتكوّن فقط من حروف لاتينية (a-z, A-Z)، أرقام (0-9) أو علامة تسطير سفلي <code>_</code>
	</li>
	<li>
		ألّا يبدأ برقم
	</li>
	<li>
		ألّا يكون <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar#Keywords" rel="external nofollow">كلمة محجوزة Reserved keywords</a> في جافاسكريبت
	</li>
</ul>
<p>
	إن أردت استخدام أكثر من كلمة في اسم متغيّر فستحتاج لإدماج الكلمات معا وكتابة الحرف الأول من كل الكلمات الموجودة بعد الكلمة الأولى بحرف كبير Capital letter، تُسمّى هذه الطريقة بـ Camel case. المتغيّر <code>applesToBuy</code> مثال على كتابة متغيّر باسم مكوّن من كلمات عدّة.
</p>

<h3>
	<a id="_51" rel=""></a>القيمة
</h3>

<p>
	القيمة هي ما تريد أن يكونه المتغيّر. يمكن للقيمة أن تكون بيانات أوليّة Primitives (مثل سلاسل المحارف Strings والأعداد) أو كائنات (مصفوفات ودوالّ).
</p>

<h3>
	<a id="_____53" rel=""></a>علامة الإسناد <code>=</code> في جافاسكريبت
</h3>

<p>
	لا تعمل علامة <strong>الإسناد</strong> <code>=</code> بنفس طريقة عمل التساوي <code>=</code> في الرياضيات. لذا يتوجّب عدم الخلط بينهما.
</p>

<p>
	عندما تستخدم العلامة <code>=</code> في جافاسكريبت فأنت تُسنِد قيمة جزء العبارة الموجود يمين العلامة <code>=</code> تُسنده إلى الجزء الموجود يسار العلامة. في المثال أدناه نُسنِد القيمة 4 إلى المتغيّر <code>initialApples</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9603_7" style="">
<code>const initialApples = 4
</code></pre>

<p>
	أو بعبارة أخرى نعطي المتغيّر <code>initialApples</code> القيمة 4.
</p>

<p>
	إن طلبت طباعة المتغيّر <code>initialApples</code> فستجد أن النتيجة تساوي 4.
</p>

<h3>
	<a id="___64" rel=""></a>التقويم قبل الإسناد
</h3>

<p>
	لا يُخزّن المتغيّر سوى قيمة وحيدة؛ فإذا كانت لديك معادلة على يمين العلامة <code>=</code> فإن مفسّر جافاسكريبت سيُنفّذ المعادلة الموجودة على الطرف الأيمن ثم بعد ذلك يُسنِد القيمة المُتحصَّل عليها إلى المتغيّر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9603_7" style="">
<code>const initialApples = 4
const applesToBuy = 27

const totalApples = initialApples + applesToBuy
</code></pre>

<p>
	سيبدأ جافاسكريبت عند تعريف المتغيّر <code>totalApples</code> في المثال أعلاه بتقويم العبارة <code>initialApples + applesToBuy</code> (التي تعطي النتيجة 31) ثم بعد ذلك يُسنِد القيمة 31 إلى المتغيّر <code>totalApples</code>.
</p>

<h3>
	<a id="__const_74" rel=""></a>الكلمة المفتاحية <code>const</code>
</h3>

<p>
	توجد ثلاث كلمات مفتاحية لتعريف المتغيّرات، <code>const</code> إحداها. الكلمتان الأخريان هما <code>let</code> و<code>var</code>. تُستخدَم كل من الكلمات الثلاث لتعريف متغيّرات؛ إلا أنه يوجد اختلاف بين عملها.
</p>

<h2>
	<a id="__const_let_var_76" rel=""></a>الفرق بين <code>const</code> و<code>let</code> و<code>var</code>
</h2>

<p>
	أُتيح استخدام كلّ من <code>const</code> و<code>let</code> في الإصدار السادس من جافاسكريبت ES6، ولهما خصوصيّات مقارنة مع <code>var</code> المتاحة منذ إصدارات سابقة، والتي أصبح استخدامها غير منصوح به.
</p>

<p>
	<a id="const_let_79" rel=""></a>يؤدّي تعريف متغيّر بالكلمة المفتاحية <code>const</code> إلى انعدام إمكانيّة إسناد قيمة جديدة للمتغيّر بعد تعريفه. يعني هذا أن الشفرة التالية ستُنتِج خطأ عند تنفيذها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9603_7" style="">
<code>const applesToBuy = 22

// إعادة إسناد قيمة لمتغيّر عُرِّف بـ const يؤدي إلى خطأ أثناء التنفيذ
applesToBuy = 27
</code></pre>

<p>
	أما إن عرّفت متغيّرا بالكلمة المفتاحية <code>let</code> فسيمكنك إسناد قيمة جديدة له دون خطأ:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9603_7" style="">
<code>let applesToBuy = 22
applesToBuy = 27
console.log(applesToBuy)
</code></pre>

<h3>
	<a id="____const__let_93" rel=""></a>أيهما يجب أن أستخدم <code>const</code> أم <code>let</code>؟
</h3>

<p>
	في البداية سيكون استخدامُ <code>let</code> بدلا من <code>const</code> أسهل وأقل إثارة للأخطاء؛ إلا أنك مع الوقت وبعد كتابة برامج عدّة ستلاحظ أنه من الأحسن لك التقليل من إمكانية إسناد قيم جديدة للمتغيّرات باستخدام <code>const</code>.<br>
	ليس هذا الدرسُ التقديمي مناسبا للدخول في تفاصيل أسباب استخدام <code>const</code> لتعريف المتغيّرات. لكن بما أنك ستبدأ في استخدام <code>const</code> أكثر من <code>let</code> عند اكتساب الخبرة بكتابة برامج عدّة بجافاسكريبت فمن الأنسب التعوّد من الآن على هذا الأمر.
</p>

<p>
	بالنسبة لـ<code>var</code> فليست لك حاجة في استخدامها، <code>const</code> و <code>let</code> أفضل بكثير.
</p>

<h2>
	<a id="_98" rel=""></a>الخلاصة
</h2>

<p>
	تُستخدَم المتغيّرات في جافاسكريبت للاحتفاظ بقيم. يمكن للمتغيّرات تخزين أي نوع من القيم، سواء كانت بيانات أوليّة أو كائنات.
</p>

<p>
	تختلف العلامة <code>=</code> في جافاسكريبت عن علامة التساوي <code>=</code> في الرياضيّات، وتدلّ على الإسناد.
</p>

<p>
	ابتعد عن الكلمات المحجوزة لتسمية المتغيّرات واكتب أسماء المتغيّرات المكوّنة من عدّة كلمات وفق أسلوب Camel case.
</p>

<p>
	توجد ثلاث كلمات مفتاحية لتعريف المتغيّرات في جافاسكريبت وهي <code>const</code> و<code>let</code> و<code>var</code>. استخدم <code>let</code> عندما تريد أن تتاح لك إمكانية التعديل على قيمة المتغيّر. لم تعد توجد حاجة لاستخدام الكلمة المفتاحية <code>var</code> في جافاسكريبت.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://zellwk.com/blog/javascript-variables/" rel="external nofollow">What are variables and why use them in JavaScript</a> لصاحبه Zell Liew
</p>

<p>
	حقوق الصورة البارزة محفوظة لـ <a href="https://www.freepik.com/free-photo/computer-program-code_1154220.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">612</guid><pubDate>Fri, 02 Feb 2018 11:08:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; JSON</title><link>https://academy.hsoub.com/programming/javascript/%D8%AA%D8%B9%D9%84%D9%85-json-r604/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_01/23.png.5f56623209297f8ef1c04cd7127752ed.png" /></p>

<h2 id="ما-هي-json؟">
	ما هي JSON؟
</h2>

<p>
	كلمة JSON و تلفظ جيسون هي اختصار ل JavaScript Object Notation. سميت بهذا الاسم لأن لغة جافا سكربت(javascript) كانت أول لغة تستفيد من هذه الصيغة. JSON هي طريقة لتخزين المصفوفات (arrays) و الكائنات (objects) بقيم نصية (string)، و تستخدم بشكل أساسي في نقل البيانات وأقل عرضة للخطر و أسهل من طرق أخرى كطريقة xml. تستخدم عادةً عندما يطلب جزء من تطبيق الويب بعض المعلومات من الخادم (server) من دون إعادة تحميل الصفحة. عادة تتم هذه العملية عن طريق جافا سكربت وطلبات AJAX. منذ النسخة 5.2.0، لغة PHP أصبحت قادرة على تحويل الكائنات والمصفوفات إلى JSON. وقد كانت إضافة رائعة لهذه اللغة. إذا كنت تعمل مع PHP لفترة من الزمن ففي الغالب أنك قمت باستعمال دالة <code>()serialize </code>لعرض كائنات PHP كنصوص، و تستخدم لتحويل كائنات PHP إلى نصوص، و يمكنك فيما بعد استخدام دالة <code>()unserialize</code> لتحويل هذا النص إلى الحالة السابقة بالقيم الأصلية. وليس فقط لغة PHP التي يمكن أن تتعامل مع JSON بل معظم لغات البرمجة يمكنها التعامل مع JSON وتحويل بياناتها إلى JSON.
</p>

<h2 id="صيغة-json">
	صيغة JSON
</h2>

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5457_7" style="">
<span class="pun">{</span><span class="str">"name"</span><span class="pun">:</span><span class="str">"Lushui"</span><span class="pun">,</span><span class="str">"species"</span><span class="pun">:</span><span class="str">"Panda"</span><span class="pun">,</span><span class="str">"diet"</span><span class="pun">:</span><span class="str">"Green Things"</span><span class="pun">,</span><span class="str">"age"</span><span class="pun">:</span><span class="lit">7</span><span class="pun">,</span><span class="str">"colours"</span><span class="pun">:[</span><span class="str">"red"</span><span class="pun">,</span><span class="str">"brown"</span><span class="pun">,</span><span class="str">"white"</span><span class="pun">]}</span></pre>

<p>
	افتراضيًا يتم تخزين JSON بلا أي فراغات (white space) مما يجعل قراءة JSON صعبة قليلًا، من أجل توفير الذاكرة عند نقل البيانات، لكن يمكنك أن تضع مهما كان من فراغات أو أسطر لجعلها مقروءة بالنسبة لك. لكن هل من المعقول أن نقوم بوضع فراغات في هذ الملف يدويًا إذا كان لدينا العديد من الأسطر، هناك العديد من الأدوات التي تتوفر على الإنترنت التي تقوم بتجميل ملف JSON ليصبح أكثر قابلية للقراءة.<br>
	لنقم بإضافة بعض الفراغات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5457_9" style="">
<span class="pun">{</span><span class="pln">
    </span><span class="str">"name"</span><span class="pun">:</span><span class="pln">         </span><span class="str">"Lushui"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"species"</span><span class="pun">:</span><span class="pln">      </span><span class="str">"Panda"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"diet"</span><span class="pun">:</span><span class="pln">         </span><span class="str">"Green Things"</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"age"</span><span class="pun">:</span><span class="pln">          </span><span class="lit">7</span><span class="pun">,</span><span class="pln">
    </span><span class="str">"colours"</span><span class="pun">:</span><span class="pln">      </span><span class="pun">[</span><span class="str">"red"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"brown"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"white"</span><span class="pun">]</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كما ترى في هذا المثال أنه لدينا عدد من المفاتيح والقيم. كل مفتاح يجب أن تكون له قيمة مقابلة، إذا كنت قد تعاملت مع جافا سكربت من قبل فسوف ترى أن JSON لا تختلف كثيرًا عن جافا سكربت.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5457_11" style="">
<span class="kwd">var</span><span class="pln"> lushui </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    name</span><span class="pun">:</span><span class="pln">       </span><span class="str">'Lushui'</span><span class="pun">,</span><span class="pln">
    species</span><span class="pun">:</span><span class="pln">    </span><span class="str">'Panda'</span><span class="pun">,</span><span class="pln">
    diet</span><span class="pun">:</span><span class="pln">       </span><span class="str">'Green Things'</span><span class="pun">,</span><span class="pln">
    age</span><span class="pun">:</span><span class="pln">        </span><span class="lit">7</span><span class="pun">,</span><span class="pln">
    colours</span><span class="pun">:</span><span class="pln">    </span><span class="pun">[</span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'brown'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'white'</span><span class="pun">]</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	في جافا سكربت يتم تعيين هذا الكائن لمتغير كالتالي: 
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5457_13" style="">
<span class="kwd">var</span><span class="pln"> lushui </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="pun">..</span><span class="pln"> </span><span class="pun">};</span></pre>

<p>
	لكن JSON هي صيغة لنقل البيانات، وليست لغة برمجة، لا تملك أي مفاهيم برمجية لذلك لا نحتاج إلى المتغيرات أو ما شابه في JSON. في جافا سكربت وفي JSON الكائنات يتم احتوائها داخل { } وكل مفتاح له قيمة، في جافا سكربت المفاتيح لا تتطلب وضعها بين إشارتي " " لأنها تمثل متغيرات. في جافا سكربت و JSON المفتاح و قيمته يفصل بينهما بـ ":" و كل مفتاح و قيمته مفصولان عن المفاتيح و القيم الآخرى بـ "," .<br>
	JSON تدعم أنواع القيم التالية:
</p>

<ul>
<li>
		Double
	</li>
	<li>
		Float
	</li>
	<li>
		String
	</li>
	<li>
		Boolean
	</li>
	<li>
		Array
	</li>
	<li>
		Object
	</li>
	<li>
		Null
	</li>
</ul>
<p>
	القيم العددية تمثل بلا إشارتي " " ، القيم المنطقية تمثل بـ true أو false و بلا إشارتي " " كما PHP ، و يجب التشديد مرة أخرى أن النصوص تمثل بإشارتي " " . القيمة null تعمل كعملها في php وتمثل في JSON بوضع الكلمة فقط غير محاطة بأي شيء. المصفوفات في JSON وجافا سكربت هي نفسها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5457_15" style="">
<span class="com">// JavaScript</span><span class="pln">
</span><span class="pun">[</span><span class="str">'red'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'brown'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'white'</span><span class="pun">]</span><span class="pln">

</span><span class="pun">[</span><span class="str">"red"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"brown"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"white"</span><span class="pun">]</span></pre>

<p>
	لاحظ أنني لم أضع تعليق قبل المصفوفة الثانية، لأن JSON لا تدعم التعليق بسبب أنها تستخدم لنقل البيانات وليس هناك حاجة للتعليق لأنك لا تكتب أوامر برمجية لأنك لو عدت لملف JSON لاحقًا فكل ما فيه بيانات سوف تعرفها عند قراءتها مباشرةً. JSON تدعم المصفوفات و الكائنات المتداخلة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5457_17" style="">
<span class="pun">{</span><span class="pln">
    </span><span class="str">"an_object"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="str">"an_array_of_objects"</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
            </span><span class="pun">{</span><span class="pln"> </span><span class="str">"The"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"secret"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
            </span><span class="pun">{</span><span class="pln"> </span><span class="str">"is"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"that"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
            </span><span class="pun">{</span><span class="pln"> </span><span class="str">"I"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"still"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
            </span><span class="pun">{</span><span class="pln"> </span><span class="str">"love"</span><span class="pun">:</span><span class="pln"> </span><span class="str">"shoes!"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
        </span><span class="pun">]</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لدينا في المثال السابق كائن JSON يحتوي كائن آخر يحتوي مصفوفة من الكائنات.
</p>

<h2 id="json-و-php">
	JSON و PHP
</h2>

<p>
	كما ذكرت سابقًا، منذ النسخة 5.2.0 وفرت الدعم لتحويل البيانات إلى JSON والآن سوف نلقي نظرة على هذه الميزة في PHP عن قرب. لتحويل قيمة في PHP إلى JSON فقط نحتاج إلى دالة ()<code>json_encode</code> كما التالي:
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5457_19" style="">
<span class="pun">&lt;?</span><span class="pln">php

$truth </span><span class="pun">=</span><span class="pln"> array</span><span class="pun">(</span><span class="str">'panda'</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">'Awesome!'</span><span class="pun">);</span><span class="pln">
echo json_encode</span><span class="pun">(</span><span class="pln">$truth</span><span class="pun">);</span></pre>

<p>
	نتيجة تنفيذ التعليمات السابقة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5457_21" style="">
<span class="pun">{</span><span class="str">"panda"</span><span class="pun">:</span><span class="str">"Awesome!"</span><span class="pun">}</span></pre>

<p>
	رائع هذا بالضبط ما كما نريده، لنقم الآن بتحويل هذه البيانات إلى مرة آخرى إلى صيغة مفهومة من قبل PHP.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5457_23" style="">
<span class="pun">&lt;?</span><span class="pln">php

$truth </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="str">'{"panda":"Awesome!"}'</span><span class="pun">);</span><span class="pln">
echo $truth</span><span class="pun">[</span><span class="str">'panda'</span><span class="pun">];</span></pre>

<p>
	لنلقي نظرة على النتيجة؟
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5457_25" style="">
<span class="typ">Fatal</span><span class="pln"> error</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Cannot</span><span class="pln"> </span><span class="kwd">use</span><span class="pln"> </span><span class="kwd">object</span><span class="pln"> of type stdClass </span><span class="kwd">as</span><span class="pln"> array </span><span class="kwd">in</span><span class="pln"> </span><span class="pun">...</span></pre>

<p>
	كما ترى، دالة ()<code>json_decode</code> لا تتحول إلى مصفوفة PHP. بدلًا من ذلك تستخدم كائن <code>stdClass</code> لتمثيل بياناتنا، لنصل إلى بياناتنا بشكل صحيح سندخل إلى خصائص هذا الكائن بهذه الطريقة.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5457_27" style="">
<span class="pun">&lt;?</span><span class="pln">php

$truth </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="str">'{"panda":"Awesome!"}'</span><span class="pun">);</span><span class="pln">
echo $truth</span><span class="pun">-&gt;</span><span class="pln">panda</span><span class="pun">;</span><span class="pln">

</span><span class="com">// Awesome!</span></pre>

<p>
	لكن إذا ما زلت ترغب في الحصول على هذه البيانات كمصفوفة فقط أضف وسيط آخر إلى هذه الدالة وهو true.
</p>

<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_5457_29" style="">
<span class="pun">&lt;?</span><span class="pln">php

$truth </span><span class="pun">=</span><span class="pln"> json_decode</span><span class="pun">(</span><span class="str">'{"panda":"Awesome!"}'</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">);</span><span class="pln">
echo $truth</span><span class="pun">[</span><span class="str">'panda'</span><span class="pun">];</span><span class="pln">

</span><span class="com">// Awesome!</span></pre>

<p>
	ترجمة –وبتصرّف- للمقال <a href="https://daylerees.com/laravel-four-primer-json/" rel="external nofollow">Laravel 4 Primer: JSON</a> لصاحبه Dayle Rees
</p>
]]></description><guid isPermaLink="false">604</guid><pubDate>Tue, 23 Jan 2018 15:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x64A;&#x632;&#x627;&#x62A; &#x627;&#x644;&#x62C;&#x62F;&#x64A;&#x62F;&#x629; &#x641;&#x64A; ES6: &#x627;&#x644;&#x642;&#x648;&#x627;&#x644;&#x628; Templates &#x648;&#x627;&#x644;&#x643;&#x627;&#x626;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-es6-%D8%A7%D9%84%D9%82%D9%88%D8%A7%D9%84%D8%A8-templates-%D9%88%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86%D8%A7%D8%AA-r574/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_12/15.png.2696568fc2ff47a195855f5bed680685.png" /></p>

<p>
	تعرّفنا في <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-es6-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D8%A6%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D9%83-destructuring-r570/" rel="">مقال سابق</a> على ميزات جديدة في الإصدار ES6 من جافاسكريبت. سنتابع في هذا المقال الحديث عن الميزات الأكثر استخداما من هذا الإصدار وذلك بتناول الإضافات الجديدة التالية:
</p>

<ul>
<li>
		المُعاملان <code>rest</code>و<code>spread</code>.
	</li>
	<li>
		تحسينات على الكائنات.
	</li>
	<li>
		القوالب Templates.
	</li>
</ul>
<h2 id="المعاملان-rest-وspread">
	المعاملان rest وspread
</h2>

<p>
	يبدو المعاملان <code>rest</code> و<code>spread</code> متشابهين، ويُشار إلى كليهما بثلاث نقاط <code>...</code>. يختلف عمل المعاملين تبعا لطريقة استخدامهما.
</p>

<h3 id="المعامل-rest">
	المعامل rest
</h3>

<p>
	يعمل <code>rest</code> حرفيا على أخذ بقيّة الشيء ووضعها ضمن مصفوفة. يحوّل المعامل لائحة من المعاملات المحدّدة بفاصلة إلى مصفوفة.
</p>

<p>
	فلنر أمثلة عملية على <code>rest</code>. فلنتخيّل أن لدينا دالة باسم <code>add</code> تجمع المعطيات المُمرَّرة لها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<span class="pln">sum</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)</span><span class="pln"> </span><span class="com">// 55</span></pre>

<p>
	نعتمد في الإصدار ES5 على المتغيّر <code>arguments</code> في كل مرة نحتاج فيها للتعامل مع دالة تأخذ عددا غير محدّد من المعاملات. المتغيّر <code>arguments</code> هو من النوع <code>Symbol</code> الشبيه بالمصفوفات <code>Array</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sum</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">arguments</span></span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

sum</span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">7</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">9</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">)</span></code></pre>

<p style="text-align: center;">
	<img alt="03_arguments.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25840" data-unique="n7coqpv50" src="https://academy.hsoub.com/uploads/monthly_2017_12/03_arguments.png.265faba6e8ee2db46aaf89376874b756.png"></p>

<p>
	إحدى الطرق التي يمكن استخدامها لجمع قيم <code>arguments</code> هي تحويلها إلى مصفوفة <code>Array</code> باستخدام <code>Array.prototype.slice.call(arguments)</code> ثم المرور على كل عدد باستخدام تابع مصفوفة مثل <code>forEach</code> و<code>reduce</code>.
</p>

<p>
	من السهل استخدام <code>forEach</code> لهذا الغرض، لذا سأشرح استخدام <code>reduce</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sum</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> argsArray </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Array</span></span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">arguments</span></span><span class="pun">)</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> argsArray</span><span class="pun">.</span><span class="pln">reduce</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">sum</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> sum </span><span class="pun">+</span><span class="pln"> current
  </span><span class="pun">},</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	يتيح لنا المعامل <code>rest</code> جعل جميع القيم المفصولة بفاصلة في مصفوفة مباشرة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">sum</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(...</span><span class="pln">args</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> args</span><span class="pun">.</span><span class="pln">reduce</span><span class="hljs-function"><span class="hljs-params"><span class="pun">((</span><span class="pln">sum</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> sum </span><span class="pun">+</span><span class="pln"> current</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">)</span></span></span></code></pre>

<p>
	أو إن أردنا التقليل من استخدام الدوال السهمية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs actionscript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sum</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="hljs-rest_arg"><span class="pun">...</span><span class="pln">args</span></span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> args</span><span class="pun">.</span><span class="pln">reduce</span><span class="pun">((</span><span class="pln">sum</span><span class="pun">,</span><span class="pln"> current</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> sum </span><span class="pun">+</span><span class="pln"> current</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	عرّجنا سريعا عند الحديث عن تفكيك المصفوفات على المعامل <code>rest</code> بسرعة. حاولنا حينها تفكيك المصفوفة <code>scores</code> إلى القيم الثلاث الأعلى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs livecodeserver"><span class="kwd">let</span><span class="pln"> scores </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'98'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'95'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'93'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'90'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'87'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'85'</span></span><span class="pun">]</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> scores

console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 98</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 95</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 93</span></span></code></pre>

<p>
	إن رغبنا في الحصول على بقية النتائج فبإمكاننا جعلها في مصفوفة مستقلة بالمعامل <code>rest</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs livecodeserver"><span class="kwd">let</span><span class="pln"> scores </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'98'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'95'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'93'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'90'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'87'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'85'</span></span><span class="pun">]</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">restOfScores</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> scores

console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">restOfScores</span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// [90, 97, 95]</span></span></code></pre>

<p>
	تذكّر دائما - لتحنب الخلط - أن المعامل <code>rest</code> يجعل كل شيء في مصفوفة؛ ويظهر في معاملات الدوال وأثناء تفكيك المصفوفات.
</p>

<h3 id="المعامل-spread">
	المعامل spread
</h3>

<p>
	يعمل المعامل <code>spread</code> بطريقة معاكسة لعمل <code>rest</code>. يأخذ المعامل مصفوفة ويوزّعها على لائحة معاملات يُفصَل بين قيمها بفاصلة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> array </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'one'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'two'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'three'</span></span><span class="pun">]</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// نتيجة التعليمتين التاليتين متطابقة</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(...</span><span class="pln">array</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// one two three</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'one'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'two'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'three'</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// one two three</span></span></code></pre>

<p>
	يُستخدَم المعامل <code>spread</code> غالبا لجمع المصفوفات بطريقة تسهّل قراءتها وفهمها.
</p>

<p>
	نريد على سبيل المثال جمع المصفوفات التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> array1 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'one'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'two'</span></span><span class="pun">]</span><span class="pln">
</span><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> array2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'three'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'four'</span></span><span class="pun">]</span><span class="pln">
</span><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> array3 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'five'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'six'</span></span><span class="pun">]</span></code></pre>

<p>
	يُستخدَم التابع <code>Array.concat</code> في الإصدارات القديمة من جافاسكريبت لجمع عدد غير محدَّد من المصفوفات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> combinedArray </span><span class="pun">=</span><span class="pln"> array1</span><span class="pun">.</span><span class="pln">concat</span><span class="pun">(</span><span class="pln">array2</span><span class="pun">).</span><span class="pln">concat</span><span class="pun">(</span><span class="pln">array3</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">console</span></span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">combinedArray</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> [</span><span class="hljs-string"><span class="com">'one'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'two'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'three'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'four'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'five'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'six'</span></span><span class="com">]</span></code></pre>

<p>
	يتيح المعامل <code>spread</code> توزيع قيم المصفوفات على مصفوفة جديدة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs lasso"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> combinedArray </span><span class="hljs-subst"><span class="pun">=</span></span><span class="pln"> </span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="pln">array1</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">...</span></span><span class="pln">array2</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">...</span></span><span class="pln">array3</span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">combinedArray</span><span class="pun">)</span><span class="pln"> </span><span class="com">// </span></span><span class="hljs-preprocessor"><span class="com">[</span></span><span class="hljs-string"><span class="com">'one'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'two'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'three'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'four'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'five'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'six'</span></span><span class="hljs-preprocessor"><span class="com">]</span></span></code></pre>

<p>
	يُستخدَم المعامل <code>spread</code> كذلك لحذف عنصُر من مصفوفة دون التعديل عليها. تُستخدَم هذه الطريقة كثيرا في <a href="http://redux.js.org/" rel="external nofollow">Redux</a> (يشرح <a href="https://egghead.io/lessons/javascript-redux-avoiding-array-mutations-with-concat-slice-and-spread" rel="external nofollow">هذا الفيديو</a>) كيف يفعلون ذلك.
</p>

<h2 id="تحسينات-على-الكائنات">
	تحسينات على الكائنات
</h2>

<p>
	الكائنات من الأمور التي يجدر بكلّ مبرمج جافاسكريبت التعوّد عليها. للتذكير؛ تبدو الكائنات بالهيئة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> anObject </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  property1</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'value1'</span></span><span class="pun">,</span><span class="pln">
  property2</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'value2'</span></span><span class="pun">,</span><span class="pln">
  property3</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'value3'</span></span><span class="pun">,</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	يضيف الإصدار ES6 ثلاث ميزات جديدة للكائنات في جافاسكريبت:
</p>

<ul>
<li>
		اختصار قيم الخاصيّات Properties،
	</li>
	<li>
		اختصارات للتوابع Methods،
	</li>
	<li>
		إمكانية استخدام أسماء محسوبة للخاصيّات.
	</li>
</ul>
<p>
	سنعرّج على كل واحدة من هذه الميزات.
</p>

<h3 id="اختصار-قيم-الخاصيات">
	اختصار قيم الخاصيّات
</h3>

<p>
	هل سبق لك ملاحظة أنك تسند أحيانا متغيّرا إلى خاصية كائن تشترك معه في الاسم؟ شيء من قبيل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> fullName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell Liew'</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> </span><span class="typ">Zell</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  fullName</span><span class="pun">:</span><span class="pln"> fullName
</span><span class="pun">}</span></code></pre>

<p>
	قد ترغب في طريقة أكثر اختصارا من السابق بما أن الخاصيّة <code>fullName</code>تساوي قيمة المتغيّر <code>fullName</code>. تساعد ميزة اختصار قيم الخاصيّات التي يضيفها الإصدار ES6 في تقليل الشفرة اللازمة لكتابة الكائنات عندما يوافق اسمُ المتغيّر اسمَ الخاصيّة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs r"><span class="kwd">const</span><span class="pln"> fullName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell Liew'</span></span><span class="pln">

</span><span class="com">// استخدام ميزة الاختصار في ES6</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">Zell</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  fullName
</span><span class="pun">}</span><span class="pln">

</span><span class="com">// يُترجَم الاختصار في الخلفية إلى </span><span class="hljs-keyword"><span class="com">...</span></span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">Zell</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  fullName</span><span class="pun">:</span><span class="pln"> fullName
</span><span class="pun">}</span></code></pre>

<h3 id="اختصارات-التوابع">
	اختصارات التوابع
</h3>

<p>
	التوابع هي خاصيّات بصيغة دوالّ. تُسمّى هذه الخاصيّات توابع لأنها دوال. في ما يلي مثال على تابع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> anObject </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  aMethod</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln"> console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-string"><span class="str">"I'm a method!~~"</span></span><span class="pun">)}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	يتيح الإصدار ES6 كتابة التوابع بطريقة مختصرة. يمكننا حذف الكلمة المفتاحية <code>function</code> ولن يتغيّر شيء:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> anObject </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// حسب ES6</span></span><span class="pln">
  aShorthandMethod </span><span class="pun">(</span><span class="pln">arg1</span><span class="pun">,</span><span class="pln"> arg2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{},</span><span class="pln">

  </span><span class="hljs-comment"><span class="com">// حسب ES5</span></span><span class="pln">
  aLonghandMethod</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">arg1</span><span class="pun">,</span><span class="pln"> arg2</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pun">},</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	استخدم هذه الميزة لاختصار توابع الكائنات ولا تلجأ إلى الدوال السهمية لكتابة التوابع (راجع <a href="" rel="">الدوال السهمية</a> في مقال سابق).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> dontDoThis </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> تجنّب هذا</span><span class="pln">
  </span><span class="hljs-attribute"><span class="pln">arrowFunction</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<h3 id="أسماء-محسوبة-للخاصيات">
	أسماء محسوبة للخاصيّات
</h3>

<p>
	تحتاج أحيانا إلى أسماء متغيّرة (ديناميكية) لخاصيّات الكائن. في هذه الحالة ننشئ متغيّرا نضع فيه اسم الخاصيّة الديناميكية. تضطرّ في الإصدارات القديمة من جافاسكريبت لإنشاء الكائن ثم إسناد الخاصيّة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs cs"><span class="hljs-comment"><span class="com">// متغيّر لحفظ اسم الخاصيّة الجديدة</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> newPropertyName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'smile'</span></span><span class="pln">

</span><span class="hljs-comment"><span class="com">// ننشئ الكائن أولا</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> anObject </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> aProperty</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'a value'</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// ثم نسند قيمة للخاصية الجديدة</span></span><span class="pln">
anObject</span><span class="pun">[</span><span class="pln">newPropertyName</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">':D'</span></span><span class="pln">

</span><span class="hljs-comment"><span class="com">// إضافة خاصيّة مختلفة قليلا عن السابقة وإسناد قيمة لها</span></span><span class="pln">
anObject</span><span class="pun">[</span><span class="hljs-string"><span class="str">'bigger '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> newPropertyName</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'XD'</span></span><span class="pln">

</span><span class="hljs-comment"><span class="com">// النتيجة</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// {</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">//   aProperty: 'a value',</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">//   'bigger smile': 'XD'</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">//   smile: ':D',</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// }</span></span></code></pre>

<p>
	ينزع الإصدار ES6 الحاجة للّف والدوران كما في المثال السابق؛ إذ أصبح بإمكانك إسناد أسماء متغيّرة للخاصيّات مباشرة أثناء إنشاء الكائن بجعل الخاصيّة المتغيّرة داخل أقواس معكوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> newPropertyName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'smile'</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> anObject </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  aProperty</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'a value'</span></span><span class="pun">,</span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// أسماء متغيّرة للكائنات</span></span><span class="pln">
  </span><span class="pun">[</span><span class="pln">newPropertyName</span><span class="pun">]:</span><span class="pln"> </span><span class="hljs-string"><span class="str">':D'</span></span><span class="pun">,</span><span class="pln">
  </span><span class="pun">[</span><span class="hljs-string"><span class="str">'bigger '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> newPropertyName</span><span class="pun">]:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'XD'</span></span><span class="pun">,</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// النتيجة</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// {</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">//   aProperty: 'a value',</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">//   'bigger smile': 'XD'</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">//   smile: ':D',</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// }</span></span></code></pre>

<h2 id="القوالب">
	القوالب
</h2>

<p>
	التعامل مع سلاسل المحارف Strings في جافاسكريبت مزعج للغاية. رأينا مثالا على ذلك في دالة <code>announcePlayer</code> عند الحديث عن المعاملات المبدئية. أنشأنا في تلك الدالة سلاسل محارف فارغة ودمجناها باستخدام عامل الجمع <code>+</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs matlab"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">announcePlayer</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">firstName</span><span class="pun">,</span><span class="pln"> lastName</span><span class="pun">,</span><span class="pln"> teamName</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-transposed_variable"><span class="pln">console</span><span class="pun">.</span></span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">firstName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">' '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> lastName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">', '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> teamName</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	تأتي القوالب في الإصدار ES6 لتفادي هذا المشكل (كانت القوالب تُسمى سلاسل محارف القوالب Template strings في مسودات ES6).
</p>

<p>
	توضع سلاسل المحارف التي نريد جعلها قالبا بين علامتيْ `. يمكن استخدام متغيّرات جافاسكريبت في القوالب داخل ماسك المكان <code>{}$</code> .
</p>

<p>
	هكذا يبدو الأمر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> firstName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> lastName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> teamName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'unaffiliated'</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> theString </span><span class="pun">=</span><span class="pln"> </span><span class="str">`${firstName} ${lastName}, ${teamName}`</span><span class="pln">

console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">theString</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Zell Liew, unaffiliated</span></span></code></pre>

<p>
	يمكنك كلك إنشاء سلاسل محارف متعدّدة الأسطُر بسهولة. تعمل الشفرة التالية دون مشكل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs livecodeserver"><span class="kwd">const</span><span class="pln"> multi </span><span class="pun">=</span><span class="pln"> </span><span class="str">`One upon </span><span class="hljs-operator"><span class="str">a</span></span><span class="str"> </span><span class="hljs-built_in"><span class="str">time</span></span><span class="str">,
In </span><span class="hljs-operator"><span class="str">a</span></span><span class="str"> land far far away,
there lived </span><span class="hljs-operator"><span class="str">a</span></span><span class="str"> witich,
who could change night </span><span class="hljs-keyword"><span class="str">into</span></span><span class="str"> day`</span></code></pre>

<p>
	يمكنك كذلك إنشاء شفرات HTML في جافاسكريبت باستخدام القوالب (ربما لا تكون هذه هي أفضل طريقة لإنشاء عناصر HTML، لكنها على كل حال أفضل من إنشاء عناصر HTML الواحد تلو الآخر).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs xml"><span class="kwd">const</span><span class="pln"> container </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'div'</span><span class="pun">)</span><span class="pln">
</span><span class="kwd">const</span><span class="pln"> aListOfItems </span><span class="pun">=</span><span class="pln">
  </span><span class="str">`</span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">ul</span></span><span class="str">&gt;</span></span><span class="str">
    </span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">Point number one</span><span class="hljs-tag"><span class="str">&lt;/</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">
    </span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">Point number two</span><span class="hljs-tag"><span class="str">&lt;/</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">
    </span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">Point number three</span><span class="hljs-tag"><span class="str">&lt;/</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">
    </span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">Point number four</span><span class="hljs-tag"><span class="str">&lt;/</span><span class="hljs-title"><span class="str">li</span></span><span class="str">&gt;</span></span><span class="str">
  </span><span class="hljs-tag"><span class="str">&lt;/</span><span class="hljs-title"><span class="str">ul</span></span><span class="str">&gt;</span></span><span class="str">`</span><span class="pln">

container</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> aListOfItems

document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">container</span><span class="pun">)</span></code></pre>

<p>
	تأتي مع القوالب ميزة الوسوم Tags، وهي دوال يمكن بواسطتها التعامل مع سلاسل المحارف الموجودة في القوالب إن أردت استبدال سلسلة بأخرى.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5808_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> animal </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'lamb'</span></span><span class="pln">

</span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> هذه الدالة تمثّل وسما</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">tagFunction</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Do something here</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="kwd">string</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> tagFunction </span><span class="str">`</span><span class="javascript"><span class="str">Mary had a little ${animal}</span></span><span class="str">`</span></code></pre>

<p>
	عليّ الاعتراف أنه على الرغم من أن وسوم القوالب تبدو ميزة مفيدة للغاية إلا أنني لم أحتج حتى الساعة لاستخدامها.
</p>

<h3 id="خاتمة">
	خاتمة
</h3>

<p>
	تعرّفنا في هذا الدليل على أكثر ميزات الإصدار ES6 من جافاسكريبت استخداما. سيكون من المفيد التعوّد على استخدام هذه الإضافات كل ما كان ذلك ممكنا، فمن المؤكّد أنها ستجعل شفرتك البرمجية أقصر وأسهل قراءة وبالتالي تزيد من إنتاجيّتك.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://zellwk.com/blog/es6" rel="external nofollow">Introduction to commonly used ES6 features</a> لصاحبه Zell.
</p>
]]></description><guid isPermaLink="false">574</guid><pubDate>Fri, 15 Dec 2017 08:09:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x64A;&#x632;&#x627;&#x62A; &#x627;&#x644;&#x62C;&#x62F;&#x64A;&#x62F;&#x629; &#x641;&#x64A; ES6: &#x627;&#x644;&#x645;&#x639;&#x627;&#x645;&#x644;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x628;&#x62F;&#x626;&#x64A;&#x629; &#x648;&#x627;&#x644;&#x62A;&#x641;&#x643;&#x64A;&#x643; Destructuring</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-es6-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D8%A6%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D9%83-destructuring-r570/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_12/08.png.ad6531a19b84d496147a0e83572b5d55.png" /></p>

<p>
	تعرّفنا في <a href="https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-es6-%D9%86%D8%B7%D8%A7%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D8%B3%D9%87%D9%85%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D8%A6%D9%8A%D8%A9-r567/" rel="">مقال سابق</a> على ميزات جديدة في الإصدار ES6 من جافاسكريبت. سنتابع في هذا المقال الحديث عن الميزات الأكثر استخداما من هذا الإصدار وذلك بتناول الإضافات الجديدة التالية:
</p>

<ul>
<li>
		المعاملات المبدئية
	</li>
	<li>
		التفكيك Destructuring.
	</li>
</ul>
<h2 id="المعاملات-المبدئية">
	المعاملات المبدئية
</h2>

<p>
	تتيح هذه الخاصيّة تحديد معاملات افتراضية عند تعريف الدوال. نأخذ مثالاً لتوضيح الفائدة التي نجنيها من هذا الأمر,
</p>

<p>
	سنفترض أننا نريد كتابة دالة تطبع اسم عضو في فريق لعبة. إن كتبنا الدالة حسب الطريقة القديمة - قبل الإصدار ES6 - فستكون شبيهة بالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<span class="kwd">function</span><span class="pln"> announcePlayer </span><span class="pun">(</span><span class="pln">firstName</span><span class="pun">,</span><span class="pln"> lastName</span><span class="pun">,</span><span class="pln"> teamName</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">firstName </span><span class="pun">+</span><span class="pln"> </span><span class="str">' '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> lastName </span><span class="pun">+</span><span class="pln"> </span><span class="str">', '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> teamName</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

announcePlayer</span><span class="pun">(</span><span class="str">'Stephen'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Curry'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Golden State Warriors'</span><span class="pun">)</span><span class="pln">
</span><span class="com">// Stephen Curry, Golden State Warriors</span></pre>

<p>
	يبدو الأمر مناسبا للوهلة الأولى؛ لكن ماذا لو أردنا الإعلان عن اسم لاعب لا ينتمي لأي فريق؟ ستكون نتيجة تنفيذ الدالة أعلاه كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs scss"><span class="hljs-function"><span class="pln">announcePlayer</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pun">)</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Zell Liew, undefined</span></span></code></pre>

<p>
	طبعا <code>undefined</code> ليس اسم فريق. سيكون من المناسب الإشعار بأن اللاعب غير منتمٍ (Unaffiliated) لأي فريق عند عدم تمرير المعامل للدالة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs scss"><span class="hljs-function"><span class="pln">announcePlayer</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'unaffiliated'</span></span><span class="pun">)</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Zell Liew, unaffiliated</span></span></code></pre>

<p>
	يمكننا تحسين الشفرة بالتحقق من تمرير المعامل إلى المتغيّر <code>teamName</code> بدلاً من تمرير القيمة <code>unaffiliated</code> في كلّ مرة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">announcePlayer</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">firstName</span><span class="pun">,</span><span class="pln"> lastName</span><span class="pun">,</span><span class="pln"> teamName</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(!</span><span class="pln">teamName</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    teamName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'unaffiliated'</span></span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">firstName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">' '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> lastName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">', '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> teamName</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

announcePlayer</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Zell Liew, unaffiliated</span></span><span class="pln">

announcePlayer</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Stephen'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Curry'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Golden State Warriors'</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Stephen Curry, Golden State Warriors</span></span></code></pre>

<p>
	يمكن تقليل الأسطُر باستخدام العوامل Ternary operators المنطقية الثلاثية <code>?</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">announcePlayer</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">firstName</span><span class="pun">,</span><span class="pln"> lastName</span><span class="pun">,</span><span class="pln"> teamName</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> team </span><span class="pun">=</span><span class="pln"> teamName </span><span class="pun">?</span><span class="pln"> teamName </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'unaffiliated'</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">firstName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">' '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> lastName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">', '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> team</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	يمكن بالاعتماد على ميزة المعاملات المبدئية في ES6 إضافة علامة <code>=</code> أمام اسم المعامل عند تعريف الدالة وسيأخذ المعامل تلقائية القيمة المُحدَّدة عند عدم تمرير قيمة له أثناء استدعاء الدالة.
</p>

<p>
	يصبح مثالنا السابق عند كتابته حسب صيغة ES6 كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">announcePlayer</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">firstName</span><span class="pun">,</span><span class="pln"> lastName</span><span class="pun">,</span><span class="pln"> teamName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'unaffiliated'</span></span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-built_in"><span class="pln">console</span></span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">firstName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">' '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> lastName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">', '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> teamName</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

announcePlayer</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Zell Liew, unaffiliated</span><span class="pln">

announcePlayer</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Stephen'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Curry'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Golden State Warriors'</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Stephen Curry, Golden State Warriors</span></code></pre>

<p>
	لاحظ أن اسم الفريق يصبح <code>unaffiliated</code> عند عدم تمرير المعامل الأخير إلى الدالة.
</p>

<p>
	أمر أخير. يمكنك استخدام القيمة المبدئية للمعامل بتمرير <code>undefined</code> يدويا إلى الدالة. تفيد هذه الطريقة إذا كان المعامل الذي تريد استخدام قيمته المبدئية ليس الأخير في معطيات الدالة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs javascript"><span class="pln">announcePlayer</span><span class="pun">(</span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">undefined</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Zell Liew, unaffiliated</span></span></code></pre>

<h2 id="التفكيك">
	التفكيك
</h2>

<p>
	يعدّ التفكيك طريقة مناسبة لاستخراج قيم من المصفوفات Arrays والكائنات Objects. توجد فروق طفيفة بين تفكيك المصفوفات وتفكيك الكائنات.
</p>

<h3 id="تفكيك-الكائنات">
	تفكيك الكائنات
</h3>

<p>
	فلنفترض أن لدينا الكائن التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> </span><span class="typ">Zell</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  firstName</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">,</span><span class="pln">
  lastName</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	ستحتاج - للحصول على الاسم الشخصي (<code>firstName</code>) والاسم العائلي (<code>lastName</code>) من <code>Zell</code> إلى إنشاء متغيّريْن وإسناد كل قيمة إل متغيّر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> firstName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Zell</span><span class="pun">.</span><span class="pln">firstName </span><span class="hljs-comment"><span class="com">// Zell</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> lastName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Zell</span><span class="pun">.</span><span class="pln">lastName </span><span class="hljs-comment"><span class="com">// Liew</span></span></code></pre>

<p>
	يتيح تفكيك الكائن إنشاء هذين المتغيّرين وإسنادهما بسطر واحد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> firstName</span><span class="pun">,</span><span class="pln"> lastName </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Zell</span><span class="pln">

console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">firstName</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Zell</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">lastName</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Liew</span></span></code></pre>

<p>
	مالذي يحدُث هنا؟ تطلُب من جافاسكريبت عند إضافة القوسين المعكوفين على النحو الذي رأيناه أثناء تعريف المتغيّرات تطلُب إنشاء المتغيرات المذكورة وإسناد <code>Zell.firstName</code> إلى <code>firstName</code> و<code>Zell.lastName</code> إلى <code>lastName</code>.
</p>

<p>
	تترجم جافاسكريبت - الإصدار ES6 - الشفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> firstName</span><span class="pun">,</span><span class="pln"> lastName </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Zell</span></code></pre>

<p>
	إلى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_9" style="">
<span class="pln">let firstName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Zell</span><span class="pun">.</span><span class="pln">firstName
let lastName </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Zell</span><span class="pun">.</span><span class="pln">lastName</span></pre>

<p>
	إن سبق استخدام اسم المتغيّر فلن يكون باستطاعتنا تعريفه من جديد؛ خصوصا عند استخدام <code>let</code> أو <code>const</code>. الشفرة التالية غير صحيحة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs r"><span class="kwd">let</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell Liew'</span></span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> course </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'JS Fundamentals for Frontend Developers'</span></span><span class="pln">
  </span><span class="com">// </span><span class="hljs-keyword"><span class="com">...</span></span><span class="com"> other properties</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">// تتسبّب التعليمة التالية في الخطأ Uncaught SyntaxError: Identifier </span><span class="hljs-string"><span class="com">'name'</span></span><span class="com"> has already been declared</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> name </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> course</span></code></pre>

<p>
	يمكن تفادي الخطأ في الحالات السابقة بإعادة تسمية المتغيّر أثناء تفكيك الكائن باستخدام النقطتين العموديّتين <code>:</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> name</span><span class="pun">:</span><span class="pln"> courseName </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> course

console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">courseName</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// JS Fundamentals for Frontend Developers</span></span></code></pre>

<p>
	يترجم مفسّر الإصدار ES6 التعليمة عند استخدام النقطتين على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> courseName </span><span class="pun">=</span><span class="pln"> course</span><span class="pun">.</span><span class="pln">name</span></code></pre>

<p>
	أمر أخير بخصوص تفكيك الكائنات. عند استخراج خاصيّة غير موجودة في الكائن فإن المتغيّر يأخذ القيمة <code>undefined</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> course </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'JS Fundamentals for Frontend Developers'</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">package</span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> course

console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="kwd">package</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// undefined</span></span></code></pre>

<p>
	هل تذكر المعاملات المبدئية؟ يمكنك استخدامها لاستخراج المتغيّرات كذلك. الصياغة مطابقة لتلك المستخدمة عند تعريف الدوال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> course </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'JS Fundamentals for Frontend Developers'</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">package</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'full course'</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> course

console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="kwd">package</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// full course</span></span></code></pre>

<p>
	يمكنك كذلك إعادة تسمية المتغيّرات مع تحديد قيم مبدئية لها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> course </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  name</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'JS Fundamentals for Frontend Developers'</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="kwd">package</span><span class="pun">:</span><span class="pln"> packageName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'full course'</span></span><span class="pln"> </span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> course

console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">packageName</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// full course</span></span></code></pre>

<h3 id="تفكيك-المصفوفات">
	تفكيك المصفوفات
</h3>

<p>
	يشبه تفكيك المصفوفات تفكيك الكائنات. تُستخدَم الأقواس المُربَّعة <code>[]</code> بدلا من <code>{}</code> لاستخراج متغيّرات من المصفوفة. المتغيّر الأول بين الأقواس يأخذ قيمة العنصُر الأول في المصفوفة والمتغيّر الثاني قيمة العنصر الثاني وهكذا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs livecodeserver"><span class="kwd">let</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-constant"><span class="pln">one</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-constant"><span class="pln">two</span></span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">]</span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-constant"><span class="pln">one</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 1</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-constant"><span class="pln">two</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 2</span></span></code></pre>

<p>
	إن حدّدت متغيرات أكثر من عناصر المصفوفة فإن المتغيرات الزائدة تأخذ القيمة <code>undefined</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs livecodeserver"><span class="kwd">let</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-constant"><span class="pln">one</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-constant"><span class="pln">two</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-constant"><span class="pln">three</span></span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">]</span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-constant"><span class="pln">one</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 1</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-constant"><span class="pln">two</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 2</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-constant"><span class="pln">three</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// undefined</span></span></code></pre>

<p>
	في الغالب نستخرج العناصر التي نحتاجها من المصفوفة فقط. يمكن استخدام الكلمة المفتاحية <code>rest</code> على النحو التالي لاستقبال بقية المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs livecodeserver"><span class="kwd">let</span><span class="pln"> scores </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">'98'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'95'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'93'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'90'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'87'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'85'</span></span><span class="pun">]</span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln">rest</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> scores

console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 98</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 95</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// 93</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">rest</span><span class="pun">)</span><span class="hljs-comment"><span class="pln"> </span><span class="com">// [90, 87, 85]</span></span></code></pre>

<p>
	سنخصّص جزءًا من هذا المقال للحديث عن العامل <code>rest</code>، ولكن قبل ذلك سنتحدّث عن ميزة خاصّة عند تفكيك المصفوفات وهي مبادلة المتغيّرات Swapping variables.
</p>

<p>
	فلنفترض أن لدينا متغيّريْن <code>a</code> و<code>b</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span></code></pre>

<p>
	نريد مبادلة هذين المتغيّرين بحيث تكون قيمة <code>a</code> تساوي <code>3</code> وقيمة <code>b</code> تساوي <code>2</code>. نحتاج - في الإصدار ES5 - إلى استخدام متغيّر ظرفي لإكمال المبادلة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> temp

</span><span class="hljs-comment"><span class="com">// المبادلة</span></span><span class="pln">
temp </span><span class="pun">=</span><span class="pln"> a </span><span class="hljs-comment"><span class="com">// temp = 2</span></span><span class="pln">
a </span><span class="pun">=</span><span class="pln"> b </span><span class="hljs-comment"><span class="com">// a = 3</span></span><span class="pln">
b </span><span class="pun">=</span><span class="pln"> temp </span><span class="hljs-comment"><span class="com">// b = 2</span></span></code></pre>

<p>
	فلنر الآن كيفية المبادلة في ES6 بتفكيك المصفوفات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// نحتاج لنقطة فاصلة هنا لأن السطر الموالي يبدأ بقوس معكوف مربَّع</span></span><span class="pln">

</span><span class="hljs-comment"><span class="com">// المبادلة باستخدام ميزة تفكيك المصفوفات</span></span><span class="pln">
</span><span class="pun">[</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">b</span><span class="pun">,</span><span class="pln"> a</span><span class="pun">]</span><span class="pln">

console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">a</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// 3</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">b</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// 2</span></span></code></pre>

<h3 id="تفكيك-المصفوفات-والكائنات-في-الدوال">
	تفكيك المصفوفات والكائنات في الدوال
</h3>

<p>
	أروع ما في التفكيك إمكانيةُ استخدامه في أي مكان تريده. حتى إن بإمكانك تفكيك المصفوفات والكائنات في الدوال.
</p>

<p>
	فلنفترض أن لدينا دالة تأخذ مصفوفة من النتائج وتعيد كائنا بالنتائج الثلاث الأعلى. تشبه الدالة التالية ما فعلناه عند تفكيك المصفوفات السابقة:
</p>

<p>
	<strong>ملحوظة:</strong> ليس ضروريا استخدام الدوال السهمية للاستفادة من ميزات ES6 الأخرى.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs livecodeserver"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">topThree</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-title"><span class="pln">scores</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="kwd">let</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> scores
  </span><span class="hljs-constant"><span class="kwd">return</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">,</span><span class="pln">
    </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">,</span><span class="pln">
    </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	توجد طريقة بديلة لكتابة الدالة أعلاه وهي تفكيك المصفوفة أثناء تعريف الدالة. سنقلّل عدد الأسطُر في هذه الحالة كما أننا نعرف أن المعطى المُمرَّر لنا مصفوفة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs applescript"><span class="kwd">function</span><span class="pln"> topThree </span><span class="pun">([</span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">])</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="hljs-command"><span class="pln">  </span><span class="kwd">return</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">first</span></span><span class="pun">,</span><span class="pln">
    </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">second</span></span><span class="pun">,</span><span class="pln">
    </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">third</span></span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	سنرى الآن تفصيلا صغيرا. بما أننا نستطيع الجمع بين المعاملات المبدئية والتفكيك أثناء تعريف الدوال.. فما هي نتيجة الشفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs php"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sayMyName</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">({</span><span class="pln">
  firstName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">,</span><span class="pln">
  lastName </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Liew'</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{})</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
 console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">firstName </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">' '</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> lastName</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	الأمر معقَّد قليل إذ أننا جمعنا ميزات عدّة في آن.
</p>

<p>
	أولا؛ نرى أن الدالة تأخذ معطى واحدا، وهو كائن اختياري تكون قميته <code>{}</code> عند عدم تحديد قيمة.<br>
	ثانيًّا، نحاول تفكيك الكائن واستخراج المتغيرين <code>firstName</code> و<code>lastName</code> منه واستخدامهما إن وُجدا.<br>
	أخيرا؛ عندما لا يُعيَّن المتغيران <code>firstName</code> و<code>lastName</code> في الكائن المُمرَّر فإننا نحدّد قيمتيهما بـ <code>Zell</code> و<code>Liew</code> على التوالي.
</p>

<p>
	تعطي الدالة النتائج التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4342_7" style="">
<code class="hljs scss"><span class="hljs-function"><span class="pln">sayMyName</span><span class="pun">()</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Zell Liew</span></span><span class="pln">
</span><span class="hljs-function"><span class="pln">sayMyName</span><span class="pun">({</span><span class="pln">firstName</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pun">})</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Zell Liew</span></span><span class="pln">
</span><span class="hljs-function"><span class="pln">sayMyName</span><span class="pun">({</span><span class="pln">firstName</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Vincy'</span></span><span class="pun">,</span><span class="pln"> lastName</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zhang'</span></span><span class="pun">})</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Vincy Zhang</span></span></code></pre>

<p>
	سنتعرّف في مقال لاحق على ميزات أخرى جديدة في الإصدار ES6.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://zellwk.com/blog/es6" rel="external nofollow">Introduction to commonly used ES6 features</a> لصاحبه Zell.
</p>
]]></description><guid isPermaLink="false">570</guid><pubDate>Fri, 08 Dec 2017 15:54:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x64A;&#x632;&#x627;&#x62A; &#x627;&#x644;&#x62C;&#x62F;&#x64A;&#x62F;&#x629; &#x641;&#x64A; ES6: &#x646;&#x637;&#x627;&#x642; &#x627;&#x644;&#x645;&#x62A;&#x63A;&#x64A;&#x631;&#x627;&#x62A;&#x60C; &#x627;&#x644;&#x62F;&#x648;&#x627;&#x644; &#x627;&#x644;&#x633;&#x647;&#x645;&#x64A;&#x629; &#x648;&#x627;&#x644;&#x645;&#x639;&#x627;&#x645;&#x644;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x628;&#x62F;&#x626;&#x64A;&#x629;</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D9%85%D9%8A%D8%B2%D8%A7%D8%AA-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF%D8%A9-%D9%81%D9%8A-es6-%D9%86%D8%B7%D8%A7%D9%82-%D8%A7%D9%84%D9%85%D8%AA%D8%BA%D9%8A%D8%B1%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D9%84-%D8%A7%D9%84%D8%B3%D9%87%D9%85%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%85%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D8%A6%D9%8A%D8%A9-r567/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_12/5a21192eb74e3_01(1).png.7ce34cee811fb0535bd13f4bc14bf188.png" /></p>

<p>
	تطوّرت لغة البرمجة جافاسكريبت كثيرا خلال السنوات القليلة الماضية. إن كنت تتعلّم جافاسكريبت في 2017 دون أن تتعامل مع الإصدار ES6 فأنت تفوّت الفرصة لاستغلال طريقة يسيرة لقراءة شفرات جافاسكريبت وكتابتها.
</p>

<p>
	لا تقلق إن لم تكن خبيرًا في جافاسكريبت، فليس ضروريًا أن تكون ماهرًا جدًا في جافاسكريبت للاستفادة من الامتيازات التي يمنحها الإصدار ES6. سنتعرّف في هذا المقال على ميزات يقدّمها ES6 ويمكنك استخدامها يوميًا للتعوّد على الصياغة الجديدة لجافاسكريبت.
</p>

<h2 id="الميزات-الجديدة-في-es6">
	الميزات الجديدة في ES6
</h2>

<p>
	يقدّم الإصدار ES6 الكثير من الميزات الجديدة ويضيفها إلى جافاسكريبت. يمكنك التعرّف على أهم هذه الميزات بقراءة المقاليْن التاليّيْن:
</p>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%A7-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%82%D8%A7%D8%AF%D9%85-%D9%85%D9%86-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-ecmascript-6-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r12/" rel="">ما الجديد في الإصدار القادم من جافاسكريبت (ECMAScript 6) - الجزء الأول</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%A7-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%82%D8%A7%D8%AF%D9%85-%D9%85%D9%86-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-ecmascript-6-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%AB%D8%A7%D9%86%D9%8A-r26/" rel="">ما الجديد في الإصدار القادم من جافاسكريبت (ECMAScript 6) - الجزء الثاني</a>.
	</li>
</ul>
<p>
	ليس ضروريًا أن تعرف كلّ ما يقدّمه الإصدار الجديد من أول وهلة. سأتشارك معك في هذا المقال ثلاث ميزات للبدء بها واستخدامها:
</p>

<ul>
<li>
		الكلمتان المفتاحيّتان <code>let</code> و<code>const</code>.
	</li>
	<li>
		الدوال السهمية Arrow functions.
	</li>
</ul>
<p>
	بالمناسبة؛ تدعم أغلب المتصفّحات الحديثة - مثل Edge، الإصدارات الحديثة من فيرفكس وكروم - ES6 جيّدًا دون الحاجة لأدوات إضافية مثل Webpack. بالنسبة للمتصفحات القديمة نسبيًا توجد مكتبات بديلة Polyfills يوفّرها مجتمع جافاسكريبت؛ ابحث عنها. ننتقل بعد التقديم إلى الميزة الأولى.
</p>

<h2 id="الكلمتان-المفتاحيتان-let-وconst">
	الكلمتان المفتاحيّتان let وconst
</h2>

<p>
	تُستخدَم الكلمة المفتاحية <code>var</code> عادة في ES5 (الإصدار القديم من جافاسكريبت) لتعريف المتغيّرات. يُمكن في ES6 إبدال <code>var</code> بـ <code>let</code> و<code>const</code>؛ وهما كلمتان مفتاحيّتان لهما تأثير معتبر وتساعدان في تسهيل كتابة الشفرات البرمجية. نبدأ بإلقاء نظرة على الفرق بين <code>let</code> و<code>var</code> لنفهم لماذا <code>let</code> و<code>const</code> أفضل.
</p>

<h3 id="الفرق-بين-let-وvar">
	الفرق بين let وvar
</h3>

<p>
	بما أننا معتادون على <code>var</code> فسنبدأ أولاً بها. يمكننا تعريف المتغيرات بـ<code>var</code> ثم استخدامها بعد ذلك في أي مكان من النطاق Scope الحالي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<span class="kwd">var</span><span class="pln"> me </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Zell'</span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">me</span><span class="pun">)</span><span class="pln"> </span><span class="com">// Zell</span></pre>

<p>
	عرّفنا في المثال السابق متغيّرا عامًّا Global باسم <code>me</code>. نستطيع استخدام المتغيّر العام <code>me</code> في دالة على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> me </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pln">
</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sayMe</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">me</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

sayMe</span><span class="pun">()</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Zell</span></span></code></pre>

<p>
	إلا أن العكس ليس صحيحًا. إن عرّفنا متغيّرًا باسم <code>me</code> داخل الدالة فلن يمكننا استخدامه خارجها وسيظهر خطأ في التنفيذ:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sayMe</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> me </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">me</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

sayMe</span><span class="pun">()</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Zell</span></span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">me</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Uncaught ReferenceError: me is not defined</span></span></code></pre>

<p>
	يمكننا القول إذًا إن <code>var</code> ذات نطاق معرَّف على مستوى الدالة Function-scoped. يعني هذا أن أي متغيّر عُرِّف داخل دالّة بـ<code>var</code> لن يوجد خارج هذه الدالة. إن عُرِّف المتغيّر بـ<code>var</code> خارج الدالة فسيكون موجودًا في النطاق الخارجي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> me </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">// النطاق العام</span></span><span class="pln">

</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sayMe</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> me </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Sleepy head'</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">// نطاق الدالة المحلّي</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">me</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

sayMe</span><span class="pun">()</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Sleepy head</span></span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">me</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Zell</span></span></code></pre>

<p>
	بالنسبة للكلمة المفتاحية <code>let</code> فهي ذات نطاق معرَّف على مستوى الكتلة Block-scoped. يعني هذا أنه عند إنشاء متغيّر بـ<code>let</code> فستكون موجودة داخل كتلة <code>let</code>. لكن.. ما هي “الكتلة”؟
</p>

<p>
	تُعرَّف الكتلة في جافاسكريبت بأنها كل ما يوجد بين قوسين معكوفين. في ما يلي أمثلة على الكتل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs cs"><span class="pun">{</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// نطاق كتلة جديدة</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// نطاق كتلة جديدة</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">while</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// نطاق كتلة جديدة</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// نطاق كتلة جديدة</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	الفرق بين المتغيرات المعرَّفة على مستوى الدالة وتلك المعرَّفة على مستوى الكتلة كبير جدًا. إن استخدمت متغيّرات معرَّفة على مستوى الدالة فمن السهل تغيير قيمة المتغيّر دون قصد. في ما يلي مثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">var</span></span><span class="pln"> me </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-literal"><span class="kwd">true</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-reserved"><span class="kwd">var</span></span><span class="pln"> me </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Sleepy head'</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-built_in"><span class="pln">console</span></span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">me</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> </span><span class="hljs-string"><span class="com">'Sleepy head'</span></span></code></pre>

<p>
	يظهر في المثال السابق أن المتغيّر <code>me</code> يأخذ القيمة “Sleepy head” بعد الخروج من كتلة التعليمة <code>if</code>. ربما لا تواجه مشاكل على النحو المذكور في المثال أعلاه لأنك لا تعرّف متغيّرات بنفس الاسم؛ لكن إن كنت ممّن يستخدم <code>var</code> في حلقات <code>for</code> التكرارية فربما تصادف بعضًا من الأمور الغريبة التي تحدث بسبب آلية التعامل مع نطاقات المتغيّرات في جافاسكريبت. فلنتأمل الشفرة التالية التي تطبع قيمة المتغيّر <code>i</code> أربع مرات ثم تطبعها من جديد مع استخدام الدالة <code>setTimeout</code> التي تنتظر 1000 ملي ثانية (أي ثانية واحدة) قبل تنفيذ التعليمة <code>console.log</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
  setTimeout</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">},</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1000</span></span><span class="pun">)</span><span class="pln">
</span><span class="pun">};</span></code></pre>

<p>
	مالذي تتوقّعه من الشفرة السابقة؟
</p>

<p style="text-align: center;">
	<img alt="01_var_settimeout.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25687" data-unique="fzb2zr7ga" src="https://academy.hsoub.com/uploads/monthly_2017_12/01_var_settimeout.png.67b894ecfd0f13594111003b42ecf2be.png"></p>

<p>
	نلاحظ أن المتغيّر <code>i</code> أخذ القيمة <code>5</code> في مرات تنفيذ الدالة <code>setTimeout</code> الأربع. كيف أصبحت قيمة <code>i</code> تساوي <code>5</code> في كل مرة تُنفّذ فيها الدالة <code>setTimeout</code>؟ يعود السبب في ذلك إلى أن قيمة المتغيّر <code>i</code> أصبحت تساوي <code>5</code> حتى قبل تنفيذ الدالة <code>setTimeout</code> لأول مرة. وبما أن <code>var</code> تعرّف المتغيّر على مستوى الدالة فإن <code>i</code> هو نفس المتغيّر الذي تعمل عليه الحلقة التكرارية والذي أصبح يساوي <code>5</code> أثناء انتظار <code>setTimeout</code> لانقضاء الأجل المحدّد (1000 ملي ثانية). للحصول على قيمة المتغيّر <code>i</code> التي مُرِّرت إلى الدالة <code>setTimeout</code> (التي تُنفّذ التعليمات متأخرة بثانية عن وقت حصولها على القيمة) فسنتحتاج إلى دالة أخرى - وليكن اسمها <code>logLater</code> للتأكد من أن الحلقة التكرارية <code>for</code> لا تغيّر قيمة <code>i</code> قبل تنفيذ تعليمات <code>setTimeout</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs matlab"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">logLater</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  setTimeout</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-transposed_variable"><span class="pln">console</span><span class="pun">.</span></span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-built_in"><span class="pln">i</span></span><span class="pun">)</span><span class="pln">
  </span><span class="pun">})</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">i</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">i</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">i</span></span><span class="pun">++)</span><span class="pln"> </span><span class="hljs-cell"><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
  logLater</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span></span><span class="pun">;</span></code></pre>

<p style="text-align: center;">
	<img alt="02_var_settimeout.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25686" data-unique="r96wxq0vb" src="https://academy.hsoub.com/uploads/monthly_2017_12/02_var_settimeout.png.fa4578fe9599bd2eb6f4598a5d18c913.png"></p>

<p>
	نلاحظ طباعة قيم <code>i</code> الصحيحة: <code>1</code>، <code>2</code>، <code>3</code> و<code>4</code>. من الجيّد أن الأمور الغريبة التي تحدُث مع المتغيرات المعرَّفة على مستوى الدالة - مثل ما حدث مع حلقة <code>for</code> السابقة - يمكن تفاديها باستخدام <code>let</code>. باستطاعتنا إعادة كتابة المثال الأصلي الذي ينادي <code>setTimeout</code> دون الحاجة لكتابة دالة مستقلة، وذلك عن طريق تعريف المتغيرات بـ<code>let</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
  setTimeout</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
  </span><span class="pun">},</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1000</span></span><span class="pun">)</span><span class="pln">
</span><span class="pun">};</span></code></pre>

<p>
	ستلاحظ عند تنفيذ الشفرة السابقة أن قيم <code>i</code> تأتي حسب المتوقع. تسهّل المتغيرات المُعرَّفة على مستوى الكتلة - كما رأينا - كتابة الشفرات البرمجية بحذف بعض المشاكل التي تواجهها المتغيرات المعرفة على مستوى الدالة. أنصح - لتسهيل الأمور - باستخدام <code>let</code> بدلا من <code>var</code> عند تعريف المتغيّرات في جافاسكريبت. ننتقل بعد أن تعرّفنا على عمل <code>let</code> إلى <code>const</code> والفرق بين الاثنتين.
</p>

<h3 id="الفرق-بين-let-وconst">
	الفرق بين let وconst
</h3>

<p>
	تتشابه <code>let</code> و<code>const</code> في أنهما تعرّفان المتغيرات على مستوى الكتلة. يكمن الفرق في أن المتغيرات التي تُعرَّف بـ<code>const</code> لا يمكن تغيير قيمتها بعد تعريفها أول مرة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs rust"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Sleepy head'</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">// TypeError: Assignment to constant variable.</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> name1 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Zell'</span></span><span class="pln">
name1 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Sleepy head'</span></span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">name1</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// 'Sleepy head'</span></span></code></pre>

<p>
	بما أن قيم المتغيرات المعرفة بـ<code>const</code> لا يمكن التعديل عليها فهي مناسبة للمتغيرات ذات القيمة الثابتة. فلنفترض أن لدينا زرا لفتح نافذة منبثقة. أعرف أنه لن يكون هناك سوى زرّ واحد من هذا النوع ولن يُعدَّل عليه. استخدم <code>const</code> في هذه الحالة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> modalLauncher </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">document</span></span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="hljs-string"><span class="str">'.jsModalLauncher'</span></span><span class="pun">)</span></code></pre>

<p>
	أفضّل دائمًا استخدام <code>const</code> عند تعريف المتغيّرات كل ما كان ذلك ممكنًا، لأني أتأكد من أن قيمة المتغيّر لن يُعدَّل عليها؛ في ما عدا ذلك وفي جميع الحالات المتبقية أستخدم <code>let</code>.
</p>

<h2 id="الدوال-السهمية">
	الدوال السهمية
</h2>

<p>
	يُشار إلى الدوال السهمية بالعلامة <code>&lt;=</code>، وهي اختصار لإنشاء دوال مجهولة الاسم Anonymous functions. يمكن استخدام هذه الدوال في أي مكان يُمكن استخدام الكلمة المفتاحية <code>function</code> فيه. على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs php"><span class="kwd">let</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">7</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">98</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">]</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// استخدام دالة مجهولة الاسم حسب الطريقة القديمة (الإصدار ES5)</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> moreThan20 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">num</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> num </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">20</span></span><span class="pln">
</span><span class="pun">})</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// استخدام الدوال السهمية</span></span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> moreThan20 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">num </span><span class="pun">=&gt;</span><span class="pln"> num </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">20</span></span><span class="pun">)</span></code></pre>

<p>
	تقلّل الدوال السهمية من حجم الشفرة البرمجية وبالتالي تكون هناك أماكن أقل للأخطاء؛ كما تسهّل فهمَ الشفرة البرمجية عند التعود على أسلوبها. فلنر التفاصيل العملية للدوال السهمية.
</p>

<h3 id="إنشاء-الدوال-السهمية">
	إنشاء الدوال السهمية
</h3>

<p>
	ربما تكون متعوّدا على إنشاء الدوال في جافاسكريبت على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">namedFunction</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// Do something</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	ولاستخدامها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs erlang"><span class="hljs-function"><span class="hljs-title"><span class="pln">namedFunction</span></span><span class="hljs-params"><span class="pun">()</span></span></span></code></pre>

<p>
	توجد طريقة أخرى لإنشاء الدوال وهي إنشاء دالة مجهولة الاسم وإسنادها إلى متغيّر. لإنشاء دالة مجهولة الاسم فإننا نحذف الاسم من تعريف الدالة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> namedFunction </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// Do something</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	توجد طريقة ثالثة فإنشاء الدوال، وهي إنشاءها مباشرة في معامل دالة أخرى؛ وهذه هي الطريقة الأكثر انتشارًا لإنشاء الدوال مجهولة الاسم. في ما يلي مثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-comment"><span class="com">// استخدام دالة مجهولة الاسم في معامل راجع Callback</span></span><span class="pln">
button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="hljs-string"><span class="str">'click'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// Do something</span></span><span class="pln">
</span><span class="pun">})</span></code></pre>

<p>
	بما أن الدوال السهمية هي اختصارات للدوال مجهولة الاسم فإنه يمكن إحلالها في أي مكان توجد به دوال مجهولة الاسم.
</p>

<p>
	أمثلة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs php"><span class="hljs-comment"><span class="com">// دالة عادية</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> namedFunction </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">arg1</span><span class="pun">,</span><span class="pln"> arg2</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">/* do your stuff */</span></span><span class="pun">}</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// دالة سهمية</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> namedFunction2 </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="pln">arg1</span><span class="pun">,</span><span class="pln"> arg2</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="hljs-comment"><span class="com">/* do your stuff */</span></span><span class="pun">}</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// دالة عادية في معامل راجع</span></span><span class="pln">
button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="hljs-string"><span class="str">'click'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// Do something</span></span><span class="pln">
</span><span class="pun">})</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// دالة سهمية في معامل راجع</span></span><span class="pln">
button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="hljs-string"><span class="str">'click'</span></span><span class="pun">,</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// Do something</span></span><span class="pln">
</span><span class="pun">})</span></code></pre>

<p>
	هل لاحظت التشابه؟ في الأساس حذفنا الكلمة المفتاحية <code>function</code> وأبدلناها بالعلامة <code>&lt;=</code> مع تغيير موضعها قليلا. هل تقتصر الدوال السهمية على إحلال <code>&lt;=</code> مكان <code>function</code>؟ أم أن هناك تفاصيل أخرى؟
</p>

<h3 id="صيغة-كتابة-الدوال-السهمية">
	صيغة كتابة الدوال السهمية
</h3>

<p>
	في الواقع، تختلف كتابة الدوال السهمية حسب عامليْن هما:
</p>

<ul>
<li>
		عدد المعاملات المطلوبة
	</li>
	<li>
		الحاجة للإرجاع الضمني Implicit return (لنتيجة التنفيذ)
	</li>
</ul>
<p>
	العامل الأول هو عدد المعاملات المُممرَّرة إلى الدالة السهمية. يمكنك حذف الأقواس التي تحيط بالمعاملات إن كان لديك معامل واحد, إن لم توجد معاملات فيمكنك إبدال الأقواس <code>()</code> بعلامة تسطير سفلي <code>_</code>.
</p>

<p>
	الصيغ التالية كلّها صحيحة لكتابة دالة سهمية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">zeroArgs</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="hljs-regexp"><span class="com">/* do something */</span></span><span class="pun">}</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> zeroWithUnderscore </span><span class="pun">=</span><span class="pln"> _</span><span class="hljs-function"><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="hljs-regexp"><span class="com">/* do something */</span></span><span class="pun">}</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> oneArg </span><span class="pun">=</span><span class="pln"> arg1</span><span class="hljs-function"><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="hljs-regexp"><span class="com">/* do something */</span></span><span class="pun">}</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">oneArgWithParenthesis</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">arg1</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="hljs-regexp"><span class="com">/* do something */</span></span><span class="pun">}</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">manyArgs</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">arg1</span><span class="pun">,</span><span class="pln"> arg2</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="hljs-regexp"><span class="com">/* do something */</span></span><span class="pun">}</span></code></pre>

<p>
	العامل الثاني في صيغة كتابة الدوال السهمية هو الحاجة لإرجاع النتيجة ضمنيا. تضيف الدوال السهمية مبدئيًا كلمة <code>return</code> المفتاحية إن كانت شفرة الدالة تمتدّ على سطر واحد فقط ولم تكن مضمّنة في كتلة (بين قوسين معكوفين <code>{...}</code>). ‘الطريقتان التاليتان في كتابة الدوال السهمية متكافئتان:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">sum1</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">num1</span><span class="pun">,</span><span class="pln"> num2</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> num1 </span><span class="pun">+</span><span class="pln"> num2
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">sum2</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">num1</span><span class="pun">,</span><span class="pln"> num2</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> num1 </span><span class="pun">+</span><span class="pln"> num2 </span><span class="pun">}</span></code></pre>

<p>
	العاملان المذكوران أعلاه هما السبب في كونك تستطيع كتابة المتغيّر <code>moreThan20</code> بالطريقة المختصرة التي رأيناها سابقًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs php"><span class="kwd">let</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">7</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">98</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">]</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// بدون استخدام ميزات ES6</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> moreThan20 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">num</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> num </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">20</span></span><span class="pln">
</span><span class="pun">})</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// باستخدام ميزات ES6</span></span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> moreThan20 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">array</span></span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">num </span><span class="pun">=&gt;</span><span class="pln"> num </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">20</span></span><span class="pun">)</span></code></pre>

<p>
	بالمختصر، الدوال السهمية رائعة. ستحتاج لبعض الوقت حتى تتعوّد عليها. حاول استخدامها ومع الزمن ستعتادها. أريد قبل إنهاء الحديث عن الدوال السهمية تعريفك بتفصيل عمليّ آخر يسبّب الكثير من الخلط عند استخدام هذه الدوال.
</p>

<h3 id="المتغير-this">
	المتغيّر this
</h3>

<p>
	تختلف قيمة المتغيّر <code>this</code> المُعرَّف مسبقا حسب طريقة استدعائه. تكون قيمة المتغيّر <code>this</code> الكائن <code>Window</code> عند استدعاء المتصفّح له خارج أي دالة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs cpp"><span class="pln">console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Window</span></span></code></pre>

<p>
	عند استدعاء المتغيّر داخل دالة بسيطة فإن قيمته ستكون الكائن العام Global object (أي الكائن <code>Window</code> عندما يتعلّق الأمر بالمتصفّح).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">hello</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

hello</span><span class="pun">()</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Window</span></span></code></pre>

<p>
	تسند جافاسكريبت دائما الكائن <code>Window</code> إلى المتغيّر <code>this</code> عندما يُستدعى من دالة بسيطة (مثل <code>setTimeout</code>). عند استخدام المتغيّر داخل تابع Method فإن القيمة تكون كائن التابع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> o </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  sayThis</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

o</span><span class="pun">.</span><span class="pln">sayThis</span><span class="pun">()</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// o</span></span></code></pre>

<p>
	يحيل المتغيّر <code>this</code> إلى الكائن المُنشَأ حديثا عند استدعائه داخل دالة مشيّدة Constructor:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="typ">Person</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">age</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">age </span><span class="pun">=</span><span class="pln"> age
</span><span class="pun">}</span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> greg </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">Person</span><span class="pun">(</span><span class="hljs-number"><span class="lit">22</span></span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> thomas </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">Person</span><span class="pun">(</span><span class="hljs-number"><span class="lit">24</span></span><span class="pun">)</span><span class="pln">

console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">greg</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// this.age = 22</span></span><span class="pln">
console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">thomas</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// this.age = 24</span></span></code></pre>

<p>
	أما عند استخدام المتغيّر <code>this</code> داخل مستمع لحدث Event listener فإن قيمته تكون العنصُر الذي أطلق الحدث:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> button </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="hljs-string"><span class="str">'button'</span></span><span class="pun">)</span><span class="pln">

button</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="hljs-string"><span class="str">'click'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// button</span></span><span class="pln">
</span><span class="pun">})</span></code></pre>

<p>
	يظهر من الأمثلة السابقة أن قيمة <code>this</code> تحدّدها الدالة التي تستدعيه. تعرّف كل دالة قيمة خاصة بها لـ<code>this</code>. لا تُربَط <code>this</code> في الدوال السهمية بقيمة جديدة أبدا، مهما كانت طريقة استدعاء الدالة. تبقى قيمة المتغيّر <code>this</code> مساوية دائما لقيمة <code>this</code> في السياق الذي توجد به الدالة السهمية. يبدو الأمر مربكًا نوعًا ما، لذا سنأخذ بضعة أمثلة للشرح.
</p>

<p>
	أولا؛ لا تستخدم أبدا دوال سهمية لتعريف توابع الكائنات؛ لأنك لن تستطيع حينها الإحالة إلى الكائن باستخدام المتغيّر <code>this</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> o </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> تجنّب تعريف التوابع بدوال سهمية </span><span class="pln">
  </span><span class="hljs-attribute"><span class="pln">notThis</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-built_in"><span class="pln">console</span></span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Window</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">objectThis</span><span class="pun">()</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Uncaught </span><span class="hljs-attribute"><span class="com">TypeError</span></span><span class="com">: </span><span class="hljs-keyword"><span class="com">this</span></span><span class="com">.objectThis </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">not</span></span><span class="com"> a </span><span class="hljs-reserved"><span class="com">function</span></span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> استخدم دوال عادية لتعريف التوابع</span><span class="pln">
  </span><span class="hljs-attribute"><span class="pln">objectThis</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-reserved"><span class="kwd">function</span></span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-built_in"><span class="pln">console</span></span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> o</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> يمكن أيضا استخدام الاختصار التالي لتعريف التوابع</span><span class="pln">
  objectThis2 </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-built_in"><span class="pln">console</span></span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> o</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	ثانيًّا؛ من المستحسَن ألا تستخدم الدوال السهمية لإنشاء مستمعات لأحداث لأن <code>this</code> لن تحيل إلى العنصُر الذي ربطت به المستمع. إن فعلت فيمكنك الحصول على السياق الحقيقي لـ<code>this</code> باستخدام <code>event.currentTarget</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs mel"><span class="hljs-keyword"><span class="pln">button</span></span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="hljs-string"><span class="str">'click'</span></span><span class="pun">,</span><span class="pln"> </span><span class="kwd">function</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="kwd">this</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// button</span></span><span class="pln">
</span><span class="pun">})</span><span class="pln">

</span><span class="hljs-keyword"><span class="pln">button</span></span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="hljs-string"><span class="str">'click'</span></span><span class="pun">,</span><span class="pln"> e </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="kwd">this</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Window</span></span><span class="pln">
  console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">event</span></span><span class="pun">.</span><span class="pln">currentTarget</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// button</span></span><span class="pln">
</span><span class="pun">})</span></code></pre>

<p>
	ثالثًا؛ قد تحتاج لاستخدام <code>this</code> مع الدوال السهمية في أماكن تتبدّل فيها قيمة المتغيّر بدون رغبتك. الدالة <code>setTimeout</code> مثال على ذلك. بهذه الطريقة لن تحتاج للتعامل مع مشاكل <code>this</code>، <code>that</code> و<code>self</code> الاعتيادية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> o </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// Old way</span></span><span class="pln">
  oldDoSthAfterThree</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> that </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pln">
    setTimeout</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// Window</span></span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">that</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// o</span></span><span class="pln">
    </span><span class="pun">})</span><span class="pln">
  </span><span class="pun">},</span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// Arrow function way</span></span><span class="pln">
  doSthAfterThree</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
    setTimeout</span><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">)</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// o</span></span><span class="pln">
    </span><span class="pun">},</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3000</span></span><span class="pun">)</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	الاستخدام السابق مفيد جدًا عندما تحتاج لحذف صنف Class أو إضافته بعد انقضاء مدة معينة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> o </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-attribute"><span class="pln">button</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">document</span></span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="hljs-string"><span class="str">'button'</span></span><span class="pun">)</span><span class="pln">
  </span><span class="hljs-attribute"><span class="pln">endAnimation</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-reserved"><span class="kwd">function</span></span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">button</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">add</span><span class="pun">(</span><span class="hljs-string"><span class="str">'is-closing'</span></span><span class="pun">)</span><span class="pln">
    setTimeout</span><span class="hljs-function"><span class="hljs-params"><span class="pun">(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">button</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(</span><span class="hljs-string"><span class="str">'is-closing'</span></span><span class="pun">)</span><span class="pln">
      </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">button</span><span class="pun">.</span><span class="pln">classList</span><span class="pun">.</span><span class="pln">remove</span><span class="pun">(</span><span class="hljs-string"><span class="str">'is-open'</span></span><span class="pun">)</span><span class="pln">
    </span><span class="pun">},</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3000</span></span><span class="pun">)</span></span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></span></code></pre>

<p>
	في الختام، استخدم الدوال السهمية في أي مكان آخر لتجعل شفرتك البرمجية أنظف كما في مثالنا السابق <code>moreThan20</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2560_7" style="">
<code class="hljs vbscript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">array</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">7</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">98</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">]</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> moreThan20 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">array</span></span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">filter</span></span><span class="pun">(</span><span class="pln">num </span><span class="pun">=&gt;</span><span class="pln"> num </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">20</span></span><span class="pun">)</span></code></pre>

<p>
	سنتعرّف في مقال لاحق على ميزات أخرى جديدة في الإصدار ES6.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://zellwk.com/blog/es6" rel="external nofollow">Introduction to commonly used ES6 features</a> لصاحبه Zell.
</p>
]]></description><guid isPermaLink="false">567</guid><pubDate>Fri, 01 Dec 2017 08:56:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x648;&#x638;&#x627;&#x626;&#x641; &#x62A;&#x648;&#x627;&#x628;&#x639; &#x627;&#x644;&#x62A;&#x643;&#x631;&#x627;&#x631; &#x641;&#x64A; &#x627;&#x644;&#x62C;&#x627;&#x641;&#x627; &#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%88%D8%B8%D8%A7%D8%A6%D9%81-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%A7%D9%84%D8%AA%D9%83%D8%B1%D8%A7%D8%B1-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r564/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/5a180fcb6dffd_24-2(1).png.34f2b636ebab1bc769137cb30e4dd17d.png" /></p>

<p>
	المصفوفة في الجافا سكريبت تتكون من قائمة عناصر، وتتيح الجافا سكريبت للمبرمجين العديد من الوظائف التي تعمل على المصفوفات. الوظائف التي تقوم بالتعديل على المصفوفة الأصلية تُعرف بتوابع التعديل (Mutator Methods)، والوظائف التي تُعيد قيمة جديدة أو شكل آخر من المصفوفة تُعرف بتوابع الوصول (Accessor Methods). يوجد نوع ثالث من التوابع يُسمى بتوابع التكرار (Iteration Methods) والتي سنتناولها بالشرح في هذا المقال. تُتيح توابع التكرار العمل على كل عنصر في المصفوفة كلٌ على حدة، وترتبط هذه التوابع بشكل أساسي بحلقات التكرار. للاستفادة أكثر من هذا الدرس، يجب أن يكون لديك معرفة مُسبقة بكيفية إنشاء المصفوفات، فهرستها، التعديل عليها والمرور على عناصرها بواسطة حلقة التكرار. تستطيع مراجعة <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r555/" rel="">درس فهم المصفوفات في الجافا سكريبت</a> لأخذ فكرة عما سبق. ما سنتناوله في هذا الدرس يشمل شرح استخدام وظائف التكرار لتنفيذ حلقة التكرار على المصفوفات وإجراء عمليات على كل عنصر في المصفوفة، توضيح كيفية ترشيح نتائج العمل على المصفوفة، تلخيص عناصر المصفوفة في قيمة واحدة والبحث عن قيم وفهارس معينة.
</p>

<h2 id="فهم-الدوال-السهمية-arrow-functions">
	فهم الدوال السهمية (Arrow Functions)
</h2>

<p>
	العديد من الأمثلة في هذا المقال ستستخدم صيغة الدوال السهمية في الجافا سكريبت والتي يتم تمثيلها بواسطة علامة المساواة ثم علامة الأكبر من <code>&lt;=</code>.<br>
	الدالة في الجافا سكريبت عبارة عن كتلة من الشيفرة البرمجية يتم تنفيذها وإعادة استخدامها أكثر من مرة، وعادةً ما تُكتب وفق الصيغة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<span class="kwd">var</span><span class="pln"> example </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// code to execute</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

example</span><span class="pun">();</span><span class="pln">

</span><span class="pun">النسخة</span><span class="pln"> </span><span class="pun">الأخيرة</span><span class="pln"> </span><span class="pun">من</span><span class="pln"> </span><span class="pun">الجافا</span><span class="pln"> </span><span class="pun">السكريبت</span><span class="pln"> </span><span class="pun">-حتى</span><span class="pln"> </span><span class="pun">وقت</span><span class="pln"> </span><span class="pun">كتابة</span><span class="pln"> </span><span class="pun">هذا</span><span class="pln"> </span><span class="pun">الدرس-</span><span class="pln"> </span><span class="pun">تسمح</span><span class="pln"> </span><span class="pun">باستخدام</span><span class="pln"> </span><span class="pun">الدوال</span><span class="pln"> </span><span class="pun">السهمية</span><span class="pln"> </span><span class="pun">والتي</span><span class="pln"> </span><span class="pun">تُكتب</span><span class="pln"> </span><span class="pun">وفق</span><span class="pln"> </span><span class="pun">الصيغة</span><span class="pln"> </span><span class="pun">التالية:</span><span class="pln">
</span><span class="kwd">var</span><span class="pln"> example </span><span class="pun">=</span><span class="pln"> </span><span class="pun">()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// code to execute</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

example</span><span class="pun">();</span></pre>

<p>
	في الدوال السهمية تُكتب الأقواس لاستقبال معاملات الدالة. في حالة كان لدينا مُعامل واحد فقط فنستطيع حينها التخلي عن كتابة الأقواس كما في الصيغة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> example </span><span class="pun">=</span><span class="pln"> parameter1 </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-comment"><span class="com">// code to execute</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	سنعتمد في شرح هذا الدرس على الدوال السهمية، وللاطلاع أكثر على هذا الموضوع، تستطيع الذهاب الى هذا <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions" rel="external nofollow">المرجع</a> .
</p>

<h2 id="الوظيفة-foreach">
	الوظيفة ()forEach
</h2>

<p>
	تقوم الوظيفة <code>()forEach</code> باستدعاء دالة ليتم تنفيذها على كل عنصر في مصفوفة معينة. فمثلًا، نفترض وجود المصفوفة fish بالعناصر التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"cod"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	نستطيع استخدام الوظيفة <code>()forEach</code> لطباعة كل عنصر في المصفوفة fish على الطرفية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs avrasm"><span class="com">// Print </span><span class="hljs-keyword"><span class="com">out</span></span><span class="com"> each item </span><span class="hljs-keyword"><span class="com">in</span></span><span class="com"> the array</span><span class="pln">
fish</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">forEach</span></span><span class="pun">(</span><span class="pln">individualFish </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">log</span></span><span class="pun">(</span><span class="pln">individualFish</span><span class="pun">)</span><span class="hljs-comment"><span class="pun">;</span></span><span class="pln">
</span><span class="pun">})</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">
piranha
barracuda
cod
eel</span></code></pre>

<p>
	يوجد طريقة أخرى لعمل ما سبق وذلك باستخدام جملة التكرار <code>for</code> بالإضافة لاستخدام الخاصية <code>length</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs rust"><span class="hljs-comment"><span class="com">// Loop through the length of the array</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> fish</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="pln">fish</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	استخدام جملة <code>for</code> السابقة في طباعة كل عنصر على حدة يعطينا نفس النتيجة عند استخدام <code>()forEach</code>، ولكن استخدام الطريقة <code>()forEach</code> يُعتبر خيارًا مختصرًا ومباشرًا وأفضل لمثل هذه الحالات.
</p>

<h2 id="الوظيفة-map">
	الوظيفة ()map
</h2>

<p>
	تقوم الوظيفة <code>()map</code> ببناء مصفوفة ناتجة عن استدعاء دالة على عناصر مصفوفة أخرى. نستطيع طباعة عناصر مصفوفة عنصر-عنصر كمثال توضيحي على كيفية استخدام وظيفة <code>()map</code> ولكن على العكس من الوظيفة <code>()forEach</code>، لابد من حفظ ناتج الوظيفة في متغير جديد.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"cod"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Print out each item </span><span class="hljs-keyword"><span class="com">in</span></span><span class="com"> the array</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> printFish </span><span class="pun">=</span><span class="pln"> fish</span><span class="pun">.</span><span class="pln">map</span><span class="pun">(</span><span class="pln">individualFish</span><span class="hljs-function"><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-built_in"><span class="pln">console</span></span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">individualFish</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

printFish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
piranha
barracuda
cod
eel</span></code></pre>

<p>
	مثال أخر على استخدام الوظيفة <code>()map</code>، حيث نستطيع أيضًا أن نُغير قيمة كل عنصر في مصفوفة وحفظ العناصر الجديدة الناتجة عن هذا التغيير في مصفوفة أخرى. فمثلًا، يمكننا إضافة الحرف s الى نهاية كل عنصر في المصفوفة fish لجعل الأسماء أسماء جمع.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs coffeescript"><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Pluralize all items </span><span class="hljs-keyword"><span class="com">in</span></span><span class="com"> the fish array</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> pluralFish </span><span class="pun">=</span><span class="pln"> fish</span><span class="pun">.</span><span class="pln">map</span><span class="pun">(</span><span class="pln">individualFish</span><span class="hljs-function"><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="str">`</span><span class="javascript"><span class="str">${individualFish}s</span></span><span class="str">`</span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

pluralFish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranhas'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'barracudas'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'cods'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'eels'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	المصفوفة الأصلية fish لم تتغير، ولكن المصفوفة الجديدة pluralFish أصبحت الان تحتوي على النسخة المُعدلة من المصفوفة الأصلية.
</p>

<h2 id="الوظيفة-filter">
	الوظيفة ()filter
</h2>

<p>
	تقوم الوظيفة <code>()filter</code> بإنشاء مصفوفة جديدة تحتوي على عناصر من المصفوفة الأصلية تتوافق مع شرط معين. الهدف الرئيسي من هذه الوظيفة هو إجراء عملية الترشيح، فمثلًا، نستطيع أن نحصل من الوظيفة <code>()filter</code> على مصفوفة جديدة تحتوي على العناصر التي تبدأ بحرف مُعين، وذلك بالاستفادة من خاصية فهرسة النصوص التي تُمكننا من الحصول على الحرف الأول لكل عنصر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> seaCreatures </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"whale"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"squid"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"starfish"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"narwhal"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Filter all creatures that start </span><span class="hljs-reserved"><span class="com">with</span></span><span class="com"> </span><span class="hljs-string"><span class="com">"s"</span></span><span class="com"> into a </span><span class="hljs-keyword"><span class="com">new</span></span><span class="com"> list</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> filteredList </span><span class="pun">=</span><span class="pln"> seaCreatures</span><span class="pun">.</span><span class="pln">filter</span><span class="pun">(</span><span class="pln">creature</span><span class="hljs-function"><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> creature</span><span class="pun">[</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">]</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="hljs-string"><span class="str">"s"</span></span><span class="pun">;</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

filteredList</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'shark'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'squid'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'starfish'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	في المثال السابق اختبرنا جميع العناصر التي تبدأ بالحرف <code>s</code> وحفظنا النتيجة في مصفوفة جيدة باسم filteredList.
</p>

<h2 id="الوظيفة-reduce">
	الوظيفة ()reduce
</h2>

<p>
	تقوم الوظيفة <code>()reduce</code> باختصار مصفوفة في قيمة واحدة، وعادةً يُرى هذا الاستخدام مع المصفوفات التي تحتوي على أرقام، مثل الحصول على مجموع عناصر مصفوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> numbers </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-number"><span class="lit">42</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">23</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">16</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">15</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Get the sum </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> all numerical values</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> sum </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="pln">reduce</span><span class="hljs-function"><span class="hljs-params"><span class="pun">((</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> a </span><span class="pun">+</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">})</span></span><span class="pun">;</span><span class="pln">

</span><span class="hljs-title"><span class="pln">sum</span></span><span class="pun">;</span><span class="pln">
</span><span class="hljs-title"><span class="typ">Output</span></span><span class="pln">
</span><span class="lit">108</span></span></code></pre>

<p>
	تُستخدم الوظيفة <code>()reduce</code> أيضًا مع النصوص وأنواع البيانات الأخرى، وتكون القيمة المُرجعة من الوظيفة إما رقم أو نص أو أي نوع بيانات أخر.
</p>

<h2 id="الوظيفة-find">
	الوظيفة ()find
</h2>

<p>
	تُعيد الوظيفة <code>()find</code> أول عنصر من مصفوفة يتوافق مع شرط مُعين. لتوضيح ذلك، سوف نُنشئ مصفوفة تحتوي على أسماء مخلوقات بحرية، وسنستخدم الوظيفة <code>()find</code> في إيجاد المخلوقات البحرية ذات النوع الرخوي مثل الأخطبوط (من الرخويات).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> seaCreatures </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"whale"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"octopus"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"cuttlefish"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"flounder"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Check </span><span class="hljs-keyword"><span class="com">if</span></span><span class="com"> a given value </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> a cephalopod</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> isCephalopod </span><span class="pun">=</span><span class="pln"> cephalopod</span><span class="hljs-function"><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"cuttlefish"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"octopus"</span></span><span class="pln"> </span><span class="pun">].</span><span class="pln">includes</span><span class="pun">(</span><span class="pln">cephalopod</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">find</span><span class="pun">(</span><span class="pln">isCephalopod</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="typ">Octopus</span></code></pre>

<p>
	بما أن “octopus” هو العنصر الأول في المصفوفة seaCreatures الذي ينطبق عليه الشرط، فإنه هو القيمة الأولى التي تم إرجاعها. نستفيد من الوظيفة <code>()find</code> في عملنا مع المصفوفات التي تحتوي على قيمة عديدة.
</p>

<h2 id="الوظيفة-findindex">
	الوظيفة ()findIndex
</h2>

<p>
	تُعيد الوظيفة <code>()findIndex</code> فهرس أول عنصر من مصفوفة يتوافق مع شرط مُعين. سنستخدم نفس المثال السابق في وظيفة <code>()find</code> لإيجاد فهرس أول عنصر من المصفوفة من النوع الرخوي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> seaCreatures </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"whale"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"octopus"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"cuttlefish"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"flounder"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	باستخدام المصفوفة isCephalopod مع الوظيفة <code>()findIndex</code> سنحصل على رقم الفهرس للعنصر بدلا من قيمته.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs coffeescript"><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Check </span><span class="hljs-keyword"><span class="com">if</span></span><span class="com"> a given value </span><span class="hljs-keyword"><span class="com">is</span></span><span class="com"> a cephalopod</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> isCephalopod </span><span class="pun">=</span><span class="pln"> cephalopod</span><span class="hljs-function"><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"cuttlefish"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"octopus"</span></span><span class="pln"> </span><span class="pun">].</span><span class="pln">includes</span><span class="pun">(</span><span class="pln">cephalopod</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">findIndex</span><span class="pun">(</span><span class="pln">isCephalopod</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span></code></pre>

<p>
	العنصر “octopus” هو العنصر الأول من المصفوفة الذي ينطبق عليه الشرط وموقعه في الفهرس رقم 1 وهي القيمة التي حصلنا عليها. في حالة لم ينطبق الشرط على أية عنصر في المصفوفة، فإن القيمة المرجعة هي -1.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_2669_7" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="kwd">const</span></span><span class="pln"> isThereAnEel </span><span class="pun">=</span><span class="pln"> eel </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">].</span><span class="pln">includes</span><span class="pun">(</span><span class="pln">eel</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">findIndex
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">-</span><span class="hljs-number"><span class="lit">1</span></span></code></pre>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	في هذا الدرس قمنا بمراجعة أغلب وظائف توابع التكرار في الجافا سكريبت. وظائف التكرار تعمل على كل عنصر في المصفوفة كلٌ على حدة وغالبًا ما يتم تطبيق دالة جديدة معها. تم شرح كيفية المرور على المصفوفة وعناصرها من خلال حلقة تكرار، تغيير قيمة العنصر في المصفوفة، ترشيح المصفوفة، اختصار المصفوفة في قيمة واحدة والبحث في المصفوفة باستخدام قيم العناصر او فهارسها. لأخذ فكرة عن المصفوفات تستطيع الاطلاع على <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r555/" rel="">درس فهم المصفوفات في الجافا سكريبت</a> .
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-array-methods-in-javascript-iteration-methods" rel="external nofollow">How To Use Array Methods in JavaScript: Iteration Methods</a> لصاحبته Tania Rascia
</p>

<p>
	حقوق الصورة البارزة محفوظة لـ <a href="https://www.freepik.com/free-vector/circular-technological-background-with-a-mesh-of-dots_1055189.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">564</guid><pubDate>Fri, 24 Nov 2017 12:25:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x648;&#x638;&#x627;&#x626;&#x641; &#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; &#x641;&#x64A; &#x627;&#x644;&#x62C;&#x627;&#x641;&#x627; &#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A; &#x2013; &#x62A;&#x648;&#x627;&#x628;&#x639; &#x627;&#x644;&#x648;&#x635;&#x648;&#x644;</title><link>https://academy.hsoub.com/programming/javascript/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%88%D8%B8%D8%A7%D8%A6%D9%81-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%E2%80%93-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-r561/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/17-2.png.d9b99cb50ba8655fcc54cb707356f950.png" /></p>

<p>
	المصفوفة في جافا سكريبت هي نوع من أنواع البيانات المتاحة فيها وتتكون من قائمة من العناصر. تحتوي الجافا سكريبت على العديد من الوظائف المُرفقة والتي تعمل على المصفوفات. الوظائف التي تقوم بالتعديل على المصفوفة الأصلية تُعرف بتوابع التعديل (Mutator Methods)، والوظائف التي تُعيد قيمة جديدة أو شكلًا آخر من المصفوفة تُعرف بتوابع الوصول (Accessor Methods). في هذا المقال سنتحدث عن توابع الوصول. للاستفادة أكثر من هذا الدرس، يجب أن يكون لديك معرفة مسبقة بكيفية إنشاء المصفوفات، فهرستها، التعديل عليها والمرور على عناصرها بواسطة حلقة التكرار. تستطيع مراجعة درس <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r555/" rel="">فهم المصفوفات في الجافا سكريبت</a> لأخذ فكرة عما سبق. هذا الدرس يوضح كيفية دمج المصفوفات ببعضها، تحويل المصفوفات الى نصوص، نسخ أجزاء من مصفوفة وحفظها كمصفوفة جديدة بالإضافة لتحديد فهارس المصفوفة.
</p>

<h2 id="الوظيفة-concat">
	الوظيفة <code>()concat</code>
</h2>

<p>
	تقوم الوظيفة <code>()concat</code> بدمج مصفوفتين أو أكثر ببعضها البعض لينتج لدينا مصفوفة جديدة. في المثال التالي نقوم بإنشاء مصفوفتين تحتويان على أنواع الأسماك الصدفية ومن ثم نقوم بدمجهما في مصفوفة واحدة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<span class="com">// Create arrays of monovalves and bivalves</span><span class="pln">
let monovalves </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"abalone"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"conch"</span><span class="pln"> </span><span class="pun">];</span><span class="pln">
let bivalves </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"oyster"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"mussel"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"clam"</span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="com">// Concatenate them together into shellfish variable</span><span class="pln">
let shellfish </span><span class="pun">=</span><span class="pln"> monovalves</span><span class="pun">.</span><span class="pln">concat</span><span class="pun">(</span><span class="pln">bivalves</span><span class="pun">);</span></pre>

<p>
	بمجرد استدعائنا للمصفوفة الجديدة، سنرى أنها تحتوي على العناصر الموجودة في كلا المصفوفتين السابقتين.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs bash"><span class="pln">shellfish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'abalone'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'conch'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'oyster'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'mussel'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'clam'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	نستطيع تمرير أكثر من مُعطى للوظيفة <code>()concate</code> لتسمح لنا بكفاءة وبخطوة واحدة أن ندمج مجموعة مصفوفات ببعضها البعض.
</p>

<h2 id="الوظيفة-join">
	الوظيفة <code>()join</code>
</h2>

<p>
	تقوم الوظيفة <code>()join</code> بتحويل جميع عناصر مصفوفة معينة إلى قيمة نصية. في المثال التالي، تقوم الوظيفة بعملية تحويل عناصر المصفوفة fish الى قيمة نصية. لاحظ أنه بدون أن نُمرر أي معطى للوظيفة <code>()join</code> سيتم فصل عناصر المصفوفة عن بعضها بواسطة فاصلة عادية وذلك في القيمة النصية الناتجة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Join the elements of an array into a string</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> fishString </span><span class="pun">=</span><span class="pln"> fish</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">join</span></span><span class="pun">();</span><span class="pln">

fishString</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="hljs-string"><span class="str">'piranha,barracuda,koi,eel'</span></span></code></pre>

<p>
	اذا أردنا أن يتم فصل العناصر عن بعضها البعض بواسطة مسافة أو أي فاصل اخر، فعلينا أن نضيف الفاصل الذي نرغب به كمُعطى للوظيفة <code>()join</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs cs"><span class="hljs-comment"><span class="com">// Join the elements of an array into a string</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> fishString </span><span class="pun">=</span><span class="pln"> fish</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">join</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">', '</span></span><span class="pun">);</span><span class="pln">

fishString</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="hljs-string"><span class="str">'piranha, barracuda, koi, eel'</span></span></code></pre>

<p>
	في المثال السابق، مررنا الفاصل ‘, ’ الذي يحتوي على فاصلة عادية ومسافة وذلك لفصل عناصر المصفوفة ولكي نحصل على نص مقروء بطريقة أفضل. في حالة قمنا بتمرير فاصل فارغ للوظيفة <code>()join</code>، فإن الفاصلة التلقائية سيتم ازالتها بالكامل.
</p>

<h2 id="الوظيفة-slice">
	الوظيفة <code>()slice</code>
</h2>

<p>
	نستخدم الوظيفة <code>()slice</code> لنسخ أجزاء من مصفوفة إلى مصفوفة أخرى جديدة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	لنفترض أننا نربد نسخ أخر عنصرين في المصفوفة fish الى مصفوفة جديدة، فإننا سنبدأ بالنسخ من الفهرس 2 الذي يمثل موقع العنصر “koi” وسينتهي النسخ عند رقم الفهرس الذي يلي فهرس أخر عنصر نريد نسخه. بما أن فهرس أخر عنصر “eel” هو 3، فإننا سنمرر للمعطى الثاني القيمة 4.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs vhdl"><span class="com">// Slice a </span><span class="hljs-keyword"><span class="com">new</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">array</span></span><span class="com"> from </span><span class="hljs-number"><span class="com">2</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> </span><span class="hljs-number"><span class="com">5</span></span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> fishWithShortNames </span><span class="pun">=</span><span class="pln"> fish</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">);</span><span class="pln">

fishWithShortNames</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'koi</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'eel</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	في هذه الحالة الخاصة، وبسبب أن العنصر “eel” هو أخر عنصر في المصفوفة، فإن المُعطى الأخير في الوظيفة <code>()slice</code> غير ضروري، حيث أن النسخ سيبدأ من فهرس البداية وينتهي لنهاية المصفوفة عند عدم تمرير المعطى الثاني.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs vhdl"><span class="com">// Slice a </span><span class="hljs-keyword"><span class="com">new</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">array</span></span><span class="com"> from </span><span class="hljs-number"><span class="com">2</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> the </span><span class="hljs-keyword"><span class="com">end</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> the </span><span class="hljs-keyword"><span class="com">array</span></span><span class="pln">
</span><span class="kwd">let</span><span class="pln"> fishWithShortNames </span><span class="pun">=</span><span class="pln"> fish</span><span class="pun">.</span><span class="pln">slice</span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">);</span><span class="pln">

fishWithShortNames</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'koi</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'eel</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	انتبه ألا يختلط عليك الأمر مع وظيفة توابع التعديل المسماة <code>()splice</code> والتي تقوم بإضافة أو حذف العناصر من المصفوفة الأصلية.
</p>

<h2 id="الوظيفة-indexof">
	الوظيفة <code>()indexOf</code>
</h2>

<p>
	تُعيد هذه الوظيفة رقم الفهرس لأول وجود لعنصر معين في مصفوفة، وتظهر فائدة هذه الوظيفة بشكل واضح في المصفوفات التي تحتوي قيم عديدة ومتكررة.<br>
	في المثال التالي، يتكرر وجود العنصر”barracuda” مرتين في المصفوفة fish.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	باستخدام الوظيفة <code>()indexOf</code> نستطيع الحصول على موقع العنصر الأول من القيمة “barracuda”.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs haskell"><span class="com">// </span><span class="hljs-type"><span class="com">Find</span></span><span class="com"> the first </span><span class="hljs-keyword"><span class="com">instance</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> an element</span><span class="pln">
</span><span class="hljs-title"><span class="pln">fish</span></span><span class="pun">.</span><span class="pln">indexOf</span><span class="pun">(</span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-type"><span class="typ">Output</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span></code></pre>

<p>
	إذا قمنا بتمرير قيمة غير موجودة في المصفوفة فإن نتيجة الوظيفة ستكون القيمة الخاصة -1.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs avrasm"><span class="pln">fish</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">indexOf</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pun">;</span></span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">-</span><span class="hljs-number"><span class="lit">1</span></span></code></pre>

<h2 id="الوظيفة-lastindexof">
	الوظيفة <code>()lastIndexOf</code>
</h2>

<p>
	تُعيد هذه الوظيفة رقم الفهرس للوجود الأخير لعنصر معين في مصفوفة. نستطيع اختبار هذه الوظيفة على نفس المثال السابق الذي يحتوي على تكرار القيمة “barracuda” مرتين.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6574_7" style="">
<code class="hljs erlang"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="com">// </span><span class="hljs-variable"><span class="com">Find</span></span><span class="com"> the last instance </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> an element</span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">last</span><span class="hljs-variable"><span class="pln">IndexOf</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-variable"><span class="typ">Output</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">3</span></span></code></pre>

<p>
	الوظيفة <code>()lastIndexOf</code> تبدأ بالبحث عن العنصر ابتداءً من نهاية المصفوفة وبذلك فهي فعليًا تعيد فهرس أول عنصر تجده أثناء عملية البحث.
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	من خلال هذا الدرس قمنا بمراجعة وظائف توابع الوصول المرفقة مع مصفوفات الجافا سكريبت. توابع الوصول تقوم بإنشاء نسخة جديدة من المصفوفة بعكس توابع التعديل التي تقوم بتغيير المصفوفة الأصلية.<br>
	تعلمنا كيفية دمج مصفوفتين أو أكثر، تحويل عناصر المصفوفة الى مجموعة قيم نصية مُجزأة بفاصلة عادية بالإضافة الى كيفية نسخ أجزاء من المصفوفة الى مصفوفة جديدة. وفي النهاية تعلمنا كيفية الحصول على فهرس أول وجود لعنصر أو أخر وجود له في مصفوفة معينة. لمراجعة أساسيات المصفوفات، راجع درس <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r555/" rel="">فهم المصفوفات في الجافا سكريبت</a>.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-array-methods-in-javascript-mutator-methods" rel="external nofollow">How To Use Array Methods in JavaScript Mutator Methods</a> لصاحبته Tania Rascia
</p>
]]></description><guid isPermaLink="false">561</guid><pubDate>Fri, 17 Nov 2017 22:59:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x648;&#x638;&#x627;&#x626;&#x641; &#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; &#x641;&#x64A; &#x627;&#x644;&#x62C;&#x627;&#x641;&#x627; &#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A; &#x2013; &#x62A;&#x648;&#x627;&#x628;&#x639; &#x627;&#x644;&#x62A;&#x639;&#x62F;&#x64A;&#x644;</title><link>https://academy.hsoub.com/programming/javascript/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%88%D8%B8%D8%A7%D8%A6%D9%81-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%E2%80%93-%D8%AA%D9%88%D8%A7%D8%A8%D8%B9-%D8%A7%D9%84%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-r558/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/10-2.png.00391d7593991af514f5878510a52f5f.png" /></p>

<p>
	تتكون المصفوفة في الجافا سكريبت من قائمة عناصر، وتحتوي الجافا سكريبت على العديد من الوظائف المرفقة والتي تعمل على المصفوفات. الوظائف التي تقوم بالتعديل عل المصفوفة الأصلية تُعرف بتوابع التعديل (Mutator Methods)، والوظائف التي تعيد قيمة جديدة أو شكل آخر تُعرف بتوابع الوصول (Accessor Methods).<br>
	للاستفادة أكثر من هذا المقال، يجب أن يكون لديك معرفة مسبقة بكيفية إنشاء المصفوفات، فهرستها، التعديل عليها والمرور على عناصرها بواسطة حلقة التكرار. تستطيع مراجعة <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r555/" rel="">درس فهم المصفوفات في الجافا سكريبت</a> لأخذ فكرة عما سبق.<br>
	المصفوفات تتشابه مع النصوص من حيث أن كلاهما يتكون من مجموعة من العناصر التي يمكن الوصول لها عبر رقم الفهرس. على الرغم من ذلك، من الأهمية أن نتذكر أن النصوص ثابتة وغير قابلة للتعديل (Immutable). ولكن على الجانب الاّخر، فإن المصفوفات غير ثابتة (Mutable)، ونستطيع التعديل عليها بشكل مباشر.<br>
	في هذا المقال سوف نشرح عمليات إضافة وإزالة العناصر من المصفوفة، عكس المصفوفة، استبدال المصفوفة والتعديل على عناصرها.
</p>

<h2 id="الوظيفة-isarray">
	الوظيفة ()isArray
</h2>

<p>
	قبل البدء بشرح توابع التعديل، سنتعرض للوظيفة <code>()isArray</code> والتي تقوم بفحص هل الكائن عبارة عن مصفوفة أم لا. في حالة كان الكائن الذي نقوم بفحصه من نوع مصفوفة، فإن الوظيفة ستعيد القيمة المنطقية true، وفي حالة لم يكن مصفوفة، فإن الوظيفة ستعيد القيمة المنطقية false.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<span class="pln">let fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"piranha"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"barracuda"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"koi"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"eel"</span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="com">// Test if fish variable is an array</span><span class="pln">
</span><span class="typ">Array</span><span class="pun">.</span><span class="pln">isArray</span><span class="pun">(</span><span class="pln">fish</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="typ">True</span></pre>

<p>
	الوظيفة <code>()isArray</code> مفيدة بسبب أن العملية <code>typeof</code> التي تُستخدم عادة في فحص هذه الحالات ستعيد لنا القيمة <code>object</code> عند استخدامها مع المصفوفة، ومن المهم في بعض الأحيان معرفة هل الكائن مصفوفة أم لا.<br>
	لاحظ أن الوظيفة <code>()isArray</code> تُكتب بطريقة مختلفة عن أغلب وظائف المصفوفات، حيث يتم تمرير الكائن الذي يمثل المصفوفة كمُعطى للوظيفة.<br>
	بعد أن تعرفنا على الوظيفة التي تساعدنا في فحص هل الكائن الذي نتعامل معه مصفوفة أم لا، سنبدأ بشرح وظائف توابع التعديل.
</p>

<h2 id="الوظيفة-pop">
	الوظيفة ()pop
</h2>

<p>
	أول وظيفة سنتناولها في الشرح هي وظيفة <code>()pop</code>، التي تُزيل العنصر الأخير من نهاية مصفوفة.<br>
	لنفترض أنه لدينا مصفوفة باسم fish تحتوي على أنواع بعض الأسماك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	عند استدعاء الوظيفة <code>()pop</code> سيتم إزالة اخر عنصر في المصفوفة، والذي سيكون العنصر الذي يساوي القيمة النصية “eel” :
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs vhdl"><span class="com">// </span><span class="hljs-keyword"><span class="com">Use</span></span><span class="com"> pop method </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> remove an item from the </span><span class="hljs-keyword"><span class="com">end</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> an </span><span class="hljs-keyword"><span class="com">array</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">pop</span><span class="pun">();</span></code></pre>

<p>
	نقوم بطباعة محتوى المصفوفة لنتأكد من أنها أصبحت لا تحتوي القيمة المحذوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="pln">fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranha'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'barracuda'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'koi'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	بذلك نكون قد أزلنا العنصر “eel” من المصفوفة بنجاح. الوظيفة <code>()pop</code> لا تأخذ أي معاملات أخرى.
</p>

<h2 id="الوظيفة-shift">
	الوظيفة ()shift
</h2>

<p>
	الوظيفة <code>()shift</code> هي وظيفة أخرى من توابع التعديل وتقوم بإزالة العنصر الأول من المصفوفة. لنفترض وجود المصفوفة fish بالعناصر التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	نستخدم الوظيفة <code>()shift</code> لإزالة العنصر الأول “piranha” والموجود في الفهرس رقم 0، وكذلك سيتم إزاحة كافة عناصر المصفوفة بمقدار فهرس واحد للأسفل.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs vhdl"><span class="com">// </span><span class="hljs-keyword"><span class="com">Use</span></span><span class="com"> shift method </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> remove an item from the beginning </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> an </span><span class="hljs-keyword"><span class="com">array</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">shift</span><span class="pun">();</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'barracuda</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'koi</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'eel</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	في المثال السابق، تم إزالة العنصر الأول وإجراء عملية الإزاحة لكافة العناصر الباقية، لهذا السبب، وبشكل عام، فإنه يُفضل أن يتم استخدام الوظيفة <code>()pop</code> قدر المستطاع لإزالة العناصر من المصفوفة لعدم وجود عملية إزاحة العناصر عند استخدامها.
</p>

<h2 id="الوظيفة-push">
	الوظيفة ()push
</h2>

<p>
	الوظيفة <code>()push</code> تعمل على إضافة عنصر جديد أو عدة عناصر جديدة في نهاية المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	لإضافة عنصر جديد، نمرر العنصر للوظيفة كمُعامل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs vhdl"><span class="com">// </span><span class="hljs-keyword"><span class="com">Use</span></span><span class="com"> push method </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> add an item </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> the </span><span class="hljs-keyword"><span class="com">end</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> an </span><span class="hljs-keyword"><span class="com">array</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="hljs-string"><span class="str">"swordfish"</span></span><span class="pun">);</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'piranha</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'barracuda</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'koi</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'eel</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'swordfish</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	من الممكن أيضًا أن نضيف أكثر من عنصر دفعة واحدة لنهاية المصفوفة بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs perl"><span class="pln">fish</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">push</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"swordfish"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"dragonfish"</span></span><span class="pun">)</span><span class="pln"> </span></code></pre>

<h2 id="الوظيفة-unshift">
	الوظيفة unshift()
</h2>

<p>
	لإضافة عنصر جديد أو عدة عناصر في بداية المصفوفة، نستخدم الوظيفة <code>()unshift</code>.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs vhdl"><span class="kwd">let</span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">
</span><span class="com">// </span><span class="hljs-keyword"><span class="com">Use</span></span><span class="com"> unshift method </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> add an item </span><span class="hljs-keyword"><span class="com">to</span></span><span class="com"> the beginning </span><span class="hljs-keyword"><span class="com">of</span></span><span class="com"> an </span><span class="hljs-keyword"><span class="com">array</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">unshift</span><span class="pun">(</span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">);</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'shark</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'piranha</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'barracuda</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'koi</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'eel</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	في المثال السابق، العنصر shark”” تم اضافته في الفهرس رقم 0، مع إزاحة كافة العناصر للإمام. نستطيع إضافة عدة عناصر دفعة واحدة بنفس الطريقة التي استخدمناها مع الوظيفة <code>()shift</code> وذلك بتمرير العناصر بحيث تكون مفصولة عن بعضها بفاصلة عادية.<br>
	الوظيفتان <code>()pop</code> و <code>()push</code> تؤثران على نهاية المصفوفة، والوظيفتان <code>()shift</code> و <code>()unshift</code> تؤثران على بداية المصفوفة. يوجد طريقة سهلة لتذكر هذه المعلومة وهي معرفة أن الوظيفتان <code>()shift</code> و <code>()unshift</code> تقومان بعمل إزاحة للعناصر في المصفوفة.
</p>

<h2 id="الوظيفة-splice">
	الوظيفة ()splice
</h2>

<p>
	تقوم الوظيفة <code>()splice</code> بإضافة أو إزالة عنصر من أي موقع في المصفوفة. الوظيفة تقوم إما بالإضافة أو الحذف كلٌ على حدة، أو الإضافة والحذف بشكل متزامن.<br>
	تأخذ الوظيفة <code>()splice</code> ثلاث معاملات، الأول هو الفهرس الذي سنبدأ من عنده العملية، الثاني هو عدد العناصر التي نريد حذفها، الثالث هو العنصر الذي نريد اضافته (اختياري).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs livecodeserver"><span class="pln">splice</span><span class="pun">(</span><span class="pln">index </span><span class="hljs-built_in"><span class="pln">number</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">number</span></span><span class="pln"> </span><span class="hljs-operator"><span class="pln">of</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">items</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> remove</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">items</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">add</span></span><span class="pun">)</span></code></pre>

<p>
	الأمثلة التالية توضح كيفية استخدام الوظيفة <code>()splice</code> في إضافة وحذف العناصر في المصفوفة.
</p>

<h2 id="الإضافة-باستخدام-splice">
	الإضافة باستخدام ()splice
</h2>

<p>
	إذا قمنا بإعداد المعامل الثاني في الوظيفة <code>()splice</code> ليأخذ القيمة 0، فإنه لن يتم حذف أي عنصر. بهذه الطريقة، نستطيع أن نضيف عنصر لمصفوفة في أي موقع فيها، وهذه الطريقة تُعتبر أفضل وأقوى من استخدام الوظيفتين <code>()push</code> و <code>()unshift</code> واللتان تقومان بالإضافة في نهاية المصفوفة أو بدايتها فقط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// Splice a new item number into index position 1</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">splice</span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"manta ray"</span></span><span class="pun">);</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranha'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'manta ray'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'barracuda'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'koi'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'eel'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	النص الجديد “manta ray” تم إضافته للمصفوفة في الفهرس رقم 1.
</p>

<h2 id="الإزالة-باستخدام-splice">
	الإزالة باستخدام ()splice
</h2>

<p>
	إذا تجاهلنا المُعامل الثالث (الاختياري) في الوظيفة <code>()splice</code>، نستطيع ببساطة إزالة أي عنصر في المصفوفة ومن أي موقع فيها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// Remove two items, starting at index position 1</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">splice</span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">);</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranha'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'eel'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	في المثال السابق، قمنا بحذف عنصرين من المصفوفة ابتداء من الفهرس 1. إذا لم نقم بإدخال المعامل الثاني الذي يُمثل عدد العناصر التي نريد حذفها، سيتم حذف جميع عناصر المصفوفة ابتداءً من الفهرس 1 وحتى نهاية المصفوفة.
</p>

<h2 id="الإضافة-والإزالة-باستخدام-splice">
	الإضافة والإزالة باستخدام ()splice
</h2>

<p>
	باستخدام كافة المعاملات للوظيفة <code>()splice</code>، نستطيع إجراء كلتا عمليتي الإضافة والحذف في نفس الوقت.<br>
	لتوضيح هذا، لنقم بحذف نفس العناصر السابقة في المثال قبل السابق واضافة العنصر الجديد في الفهرس 1:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs cs"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="hljs-comment"><span class="com">// Remove two items and add one</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">splice</span><span class="pun">(</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"manta ray"</span></span><span class="pun">);</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranha'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'manta ray'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'eel'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	الوظيفة <code>()splice</code> تُعتبر وظيفة قوية في إجراء التعديلات على أي مصفوفة. انتبه أن لا يكون لديك لبس بين الوظيفة <code>()splice</code> والوظيفة <code>()slice</code> التي تُعتبر وظيفة من توابع الوصول وتقوم بإنشاء نسخة من جزء من مصفوفة.
</p>

<h2 id="الوظيفة-reverse">
	الوظيفة ()reverse
</h2>

<p>
	تقوم هذه الوظيفة بعكس ترتيب العناصر في المصفوفة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	باستخدام الوظيفة <code>()reverse</code>، فإن العنصر الأخير سيكون الأول، والعنصر الأول سيكون اّخر العناصر، ولا تأخذ هذه الوظيفة أي معاملات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_11" style="">
<span class="com">// Reverse the fish array</span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">reverse</span><span class="pun">();</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="str">'eel'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'koi'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'barracuda'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'piranha'</span><span class="pln"> </span><span class="pun">]</span></pre>

<h2 id="الوظيفة-fill">
	الوظيفة ()fill
</h2>

<p>
	تقوم الوظيفة <code>()fill</code> باستبدال جميع عناصر المصفوفة بقيمة ثابتة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span></code></pre>

<p>
	لنفترض وجود المصفوفة fish ولتحتوي على 4 عناصر، باستخدام الوظيفة <code>()fill</code> سنستبدل جميع العناصر الأربعة بقيمة واحدة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs vhdl"><span class="com">// Replace </span><span class="hljs-keyword"><span class="com">all</span></span><span class="com"> values </span><span class="hljs-keyword"><span class="com">in</span></span><span class="com"> the </span><span class="hljs-keyword"><span class="com">array</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">with</span></span><span class="com"> </span><span class="hljs-string"><span class="com">"shark"</span></span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">fill</span><span class="pun">(</span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">);</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'shark</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'shark</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'shark</span></span><span class="str">'</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-attribute"><span class="str">'shark</span></span><span class="str">'</span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	نستطيع أن نمرر للوظيفة <code>()fill</code> معاملين إضافيين وكلاهما اختياري، ويمثلان فهرس البداية الذي نبدأ من عنده عملية الاستبدال وفهرس النهاية الذي ننهي عملية الاستبدال قبله.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="pln">fish</span><span class="pun">.</span><span class="pln">fill</span><span class="pun">(</span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">)</span><span class="pln"> </span><span class="com">// &gt; [ </span><span class="hljs-string"><span class="com">'piranha'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'shark'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'shark'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'shark'</span></span><span class="com"> ]</span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">fill</span><span class="pun">(</span><span class="hljs-string"><span class="str">"shark"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">);</span><span class="pln"> </span><span class="com">// &gt; [ </span><span class="hljs-string"><span class="com">'piranha'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'shark'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'shark'</span></span><span class="com">, </span><span class="hljs-string"><span class="com">'eel'</span></span><span class="com"> ]</span></code></pre>

<h2 id="الوظيفة-sort">
	الوظيفة ()sort
</h2>

<p>
	الوظيفة <code>()sort</code> تقوم بترتيب عناصر المصفوفة بناءً على الحرف الأول في العنصر. في حالة وجود أكثر من عنصر بنفس الحرف الأول، يتم الترتيب بناءً على الحرف الثاني وهكذا.<br>
	بشكل تلقائي تقوم الوظيفة بالترتيب الأبجدي لمصفوفة نصية والتي يكون جميع عناصرها إما uppercase أو lowercase.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

</span><span class="com">// Sort items </span><span class="hljs-keyword"><span class="com">in</span></span><span class="com"> array</span><span class="pln">
fish</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">();</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'barracuda'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'eel'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'koi'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranha'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	بما أن الوظيفة <code>()sort</code> تعتمد على الترميز النصي للحرف الأول، فإنها ستُرتب العناصر التي تكون حالتها uppercase قبل العناصر التي حالتها lowercase. انظر للمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

fish</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">();</span><span class="pln">

fish</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Koi'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'barracuda'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'eel'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranha'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	الأرقام تأتي قبل الأحرف بغض النظر عن حالتها في ترتيب المصفوفة. انظر للمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> fish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">"piranha"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"barracuda"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Koi"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"1 eel"</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

fish</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-string"><span class="str">'1 eel'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'Koi'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'barracuda'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'piranha'</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	لن تقوم الوظيفة بترتيب مصفوفة أعداد حسب قيمة الأعداد فيها (الأصغر ثم الأكبر)، ولكنها ستقوم بفحص الرقم الأول في كل عدد ويتم الترتيب بناءً عليه.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="kwd">let</span></span><span class="pln"> numbers </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="hljs-number"><span class="lit">42</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">23</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">16</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">15</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="pln"> </span><span class="pun">];</span><span class="pln">

numbers</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-number"><span class="lit">15</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">16</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">23</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">42</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<p>
	لترتيب الأعداد في مصفوفة أعداد بطريقة سليمة وحسب قيمة الأعداد (من الأصغر إلى الأكبر)، نستطيع إنشاء وظيفة “مقارنة” ونمررها كمعامل للوظيفة <code>()sort</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9173_9" style="">
<code class="hljs coffeescript"><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> Function to sort numbers </span><span class="hljs-keyword"><span class="com">by</span></span><span class="com"> size</span><span class="pln">
</span><span class="hljs-reserved"><span class="kwd">const</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-title"><span class="pln">sortNumerically</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln"> b</span><span class="pun">)</span></span><span class="pln"> </span><span class="pun">=&gt;</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> a </span><span class="pun">-</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

numbers</span><span class="pun">.</span><span class="pln">sort</span><span class="pun">(</span><span class="pln">sortNumerically</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Output</span><span class="pln">
</span><span class="pun">[</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">15</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">16</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">23</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">42</span></span><span class="pln"> </span><span class="pun">]</span></code></pre>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	في هذا الدرس، قمنا باستعراض أغلب وظائف توابع التعديل في لغة الجافا سكريبت. الوظائف من هذا النوع تقوم بالتعديل على المصفوفة الأصلية التي تستخدمها، على العكس من وظائف توابع الوصول، وتعلمنا خلال هذا الدرس كيفية إضافة وإزالة العناصر من المصفوفة في بدايتها أو نهايتها، بالإضافة لكيفية ترتيب المصفوفة، عكسها واستبدال عناصرها. لمراجعة أساسيات المصفوفات، راجع <a href="https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r555/" rel="">درس فهم المصفوفات في الجافا سكريبت</a>.
</p>



<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-array-methods-in-javascript-mutator-methods" rel="external nofollow">How To Use Array Methods in JavaScript Mutator Methods</a> لصاحبه Tania Rascia
</p>

<p>
	حقوق الصورة البارزة محفوظة لـ <a href="https://www.freepik.com/free-vector/circular-technological-background-with-a-mesh-of-dots_1055189.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">558</guid><pubDate>Fri, 10 Nov 2017 15:25:00 +0000</pubDate></item><item><title>&#x641;&#x647;&#x645; &#x627;&#x644;&#x645;&#x635;&#x641;&#x648;&#x641;&#x627;&#x62A; &#x641;&#x64A; &#x627;&#x644;&#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D8%B5%D9%81%D9%88%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D8%A7%D9%84%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r555/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_11/03.png.c45725e1612bf3875ca65cb5927eea36.png" /></p>

<h2>
	مقدمة
</h2>

<p>
	تُعتبر المصفوفة في الجافا سكريبت كائن عمومي (global) الغرض منه هو تخزين البيانات، وتحتوي المصفوفة إما على مجموعة من العناصر بنوع بيانات واحد أو أكثر، وقد تكون فارغة. نستخدم الفهارس العددية التي تبدأ من القيمة 0 للوصول إلى عناصر المصفوفة.
</p>

<p>
	المصفوفات مفيدة جدًا بما أنها تُخزن عدة قيم في متغير واحد، وهذا الأمر يقلل وينظم الشيفرة البرمجية التي نكتبها ويجعلها أكثر ملائمة للقراءة والصيانة. تستطيع المصفوفة أن تحتوي على أي نوع بيانات، ابتداءً من الأرقام ومرورا بالنصوص والكائنات وغيرها من أنواع البيانات.
</p>

<p>
	لتوضيح كيف من الممكن أن تكون المصفوفات مهمة، لنفترض أننا نريد أن نحفظ أسماء المحيطات في متغيرات عدة، بحيث يكون لكل محيط المتغير الخاص به:
</p>

<p>
	 
</p>

<table style="width:100%"><tbody>
<tr>
<td style="background-color: rgb(155, 0, 155); text-align: left; padding: 1px 20px; color: white;">
				oceans.js
			</td>
		</tr>
<tr>
<td>
				<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_7" style="">
<span class="com">// Assign the five oceans to five variables</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> ocean1 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Pacific"</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> ocean2 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Atlantic"</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> ocean3 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Indian"</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> ocean4 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Arctic"</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> ocean5 </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Antarctic"</span><span class="pun">;</span></pre>
			</td>
		</tr>
</tbody></table>
<p>
	هذه الطريقة مُضجرة جدا، وتُصبح أكثر صعوبة بشكل متسارع في المتابعة والصيانة.
</p>

<p>
	باستخدام المصفوفات، نستطيع تبسيط الأمر.
</p>

<table style="width:100%"><tbody>
<tr>
<td style="background-color: rgb(155, 0, 155); text-align: left; padding: 1px 20px; color: white;">
				oceans.js
			</td>
		</tr>
<tr>
<td>
				<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_9" style="">
<span class="com">// Assign the five oceans</span><span class="pln">

let oceans </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="str">"Pacific"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Atlantic"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Indian"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Arctic"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Antarctic"</span><span class="pun">,</span><span class="pln">

</span><span class="pun">];</span></pre>
			</td>
		</tr>
</tbody></table>
<p>
	بدلًا من استخدام خمسة متغيرات منفصلة، نستطيع الان أن يكون لدينا متغير واحد يحتوي على جميع العناصر الخمسة.
</p>

<p>
	لإنشاء المصفوفة، نستخدم الأقواس المربعة [ ] كما هو واضح في الشيفرة البرمجية السابقة، وللوصول إلى عنصر معين في المصفوفة، نستخدم الفهرس مع المصفوفة بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_11" style="">
<span class="com">// Print out the first item of the oceans array</span><span class="pln">

oceans</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="typ">Pacific</span></pre>

<p>
	في هذا الدرس سنتعلم كيفية بناء المصفوفة، وكيفية الوصول إلى عناصرها، والاضافة إليها وتعديلها والحذف منها، كما سنتعلم كيفية المرور خلال عناصرها باستخدام حلقة التكرار.
</p>

<h2>
	إنشاء مصفوفة
</h2>

<p>
	يوجد طريقتان لإنشاء المصفوفة في جافا سكريبت:
</p>

<ol>
<li>
		التعريف اللفظي باستخدام الأقواس المعكوفة.
	</li>
	<li>
		التعريف بواسطة الباني (constructor) باستخدام كلمة new.
	</li>
</ol>
<p>
	لنوضح كيفية إنشاء مصفوفة تحتوي على أنواع سمك القرش، وذلك باستخدام التعريف اللفظي بواسطة الأقواس المربعة:
</p>

<table style="width:100%"><tbody>
<tr>
<td style="background-color: rgb(155, 0, 155); text-align: left; padding: 1px 20px; color: white;">
				sharks.js
			</td>
		</tr>
<tr>
<td>
				<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_13" style="">
<span class="com">// Initialize array of shark species with array literal</span><span class="pln">

let sharks </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln">

</span><span class="pun">];</span></pre>
			</td>
		</tr>
</tbody></table>
<p>
	الان نُعرف نفس المصفوفة باستخدام الباني وذلك بواسطة الجملة new Array() :
</p>

<table style="width:100%"><tbody>
<tr>
<td style="background-color: rgb(155, 0, 155); text-align: left; padding: 1px 20px; color: white;">
				sharks.js
			</td>
		</tr>
<tr>
<td>
				<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_15" style="">
<span class="com">// Initialize array of shark species with array constructor</span><span class="pln">

let sharks </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Array</span><span class="pun">(</span><span class="pln">

    </span><span class="str">"Hammerhead"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Great White"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"Tiger"</span><span class="pun">,</span><span class="pln">

</span><span class="pun">);</span></pre>
			</td>
		</tr>
</tbody></table>
<p>
	كلا الطريقتين سوف يُنشئ لنا المصفوفة، ولكن طريقة التعريف اللفظي هي المشهورة والأكثر تفضيلا بما أن التعريف باستخدام الباني قد يؤدي إلى نتائج غير مستقرة وغير متوقعة وعليك الانتباه في حال صادفتك تلك الطريقة في التعريف أو في حال استخدامك لها.
</p>

<p>
	نستطيع طباعة محتويات المصفوفة بكتابة المتغير الخاص بها مباشرة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_17" style="">
<span class="com">// Print out the entire sharks array</span><span class="pln">

sharks</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'Hammerhead'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Great White'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'Tiger'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	تُستخدم المصفوفات عادة في تجميع العناصر أو القوائم من نفس نوع البيانات، ولكن من الناحية التقنية، فإن المصفوفات تستطيع أن تحتوي على عناصر من أنواع مختلفة بالإضافة إلى إمكانية أن تحتوي على مصفوفات أخرى:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_19" style="">
<span class="com">// Initialize array of mixed datatypes</span><span class="pln">

let mixedData </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="str">"String"</span><span class="pun">,</span><span class="pln">

    </span><span class="kwd">null</span><span class="pun">,</span><span class="pln">

    </span><span class="lit">7</span><span class="pun">,</span><span class="pln">

    </span><span class="pun">[</span><span class="pln">

        </span><span class="str">"another"</span><span class="pun">,</span><span class="pln">

        </span><span class="str">"array"</span><span class="pun">,</span><span class="pln">

    </span><span class="pun">],</span><span class="pln">

</span><span class="pun">];</span><span class="pln">
</span></pre>

<p>
	بعد أن تعلمنا كيفية إنشاء المصفوفة، نستطيع الان التعامل معا بأكثر من طريقة، ولكننا في البداية نحتاج الى فهم كيفية فهرسة المصفوفات (Arrays Indexing).
</p>

<p>
	ملاحظة: قد تجد اخر عنصر في المصفوفة ينتهي بفاصلة وأحيانا قد لا تجد هذه الفاصلة. تُعرف هذه الفاصلة بالفاصلة التابعة (Trailing comma)، ومن الشائع ان تكون غير موجودة، ولكن بشكل عام أصبح من الأفضل أن يتم استخدامها في الشيفرة البرمجية بسبب أنها تجعل الاختلافات بين الإصدارات (في عملية إدارة الإصدارات Versions Control) أكثر وضوحا وتسهل من إضافة وإزالة عناصر المصفوفة دون أخطاء. لاحظ أن الفاصلة التابعة غير مسموح بها في ملفات JSON.
</p>

<h2>
	فهرسة المصفوفات
</h2>

<p>
	إذا تعاملت مسبقاً مع النصوص والفهرسة في الجافا سكريبت، ستكون مُلمًا بمفهوم فهرسة المصفوفات، حيث أن النص يُعتبر شبيهًا بالمصفوفة.
</p>

<p>
	لا تحتوي المصفوفات على عناصر مزدوجة على شكل اسم/قيمة، وبدلا من ذلك، فإن المصفوفات تُفهرس بقيم عددية تبدأ من القيمة 0. المثال التالي ينشئ مصفوفة باسم seaCreatures:
</p>

<table style="width:100%"><tbody>
<tr>
<td style="background-color: rgb(155, 0, 155); text-align: left; padding: 1px 20px; color: white;">
				seacreatures.js
			</td>
		</tr>
<tr>
<td>
				<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_21" style="">
<span class="pln">let seaCreatures </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="str">"octopus"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"squid"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"shark"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"seahorse"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"starfish"</span><span class="pun">,</span><span class="pln">

</span><span class="pun">];</span></pre>
			</td>
		</tr>
</tbody></table>
<p>
	الجدول التالي يُفصل كيف يتم فهرسة كل عنصر في المصفوفة بقيمة عددية ابتداءً من 0:
</p>

<center>
	<table border="1"><tbody>
<tr>
<td style="background-color: rgb(155, 0, 155); padding: 5px 10px; text-align: center; color: white;">
					octopus
				</td>
				<td style="background-color: rgb(155, 0, 155); padding: 5px 10px; text-align: center; color: white;">
					squid
				</td>
				<td style="background-color: rgb(155, 0, 155); padding: 5px 10px; text-align: center; color: white;">
					shark
				</td>
				<td style="background-color: rgb(155, 0, 155); padding: 5px 10px; text-align: center; color: white;">
					seahorse
				</td>
				<td style="background-color: rgb(155, 0, 155); padding: 5px 10px; text-align: center; color: white;">
					starfish
				</td>
			</tr>
<tr>
<td style=" padding: 5px 10px; text-align: center;">
					0
				</td>
				<td style=" padding: 5px 10px; text-align: center;">
					1
				</td>
				<td style=" padding: 5px 10px; text-align: center;">
					2
				</td>
				<td style=" padding: 5px 10px; text-align: center;">
					3
				</td>
				<td style=" padding: 5px 10px; text-align: center;">
					4
				</td>
			</tr>
</tbody></table>
</center>

<p>
	العنصر الأول في المصفوفة هو octopus ومُفهرس في الموقع 0 من المصفوفة، والعنصر الأخير هو starfish ومُفهرس في الموقع 4. تبدأ الفهرسة من 0، وهذا يتضارب مع طبيعتنا الفطرية ببدء العد من القيمة 1، لذلك نحتاج لأخذ الاحتياط وأن نتذكر هذه النقطة دائما حتى تصبح طبيعية.
</p>

<p>
	نستطيع أن نحصل على عدد العناصر في المصفوفة باستخدام الخاصية length:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_23" style="">
<span class="pln">seaCreatures</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="lit">5</span></pre>

<p>
	على الرغم من أن الفهارس الخاصة بالمصفوفة seaCreatuers تبدأ من 0 إلى 4، فإن الخاصية length سوف تُرجع العدد الفعلي للعناصر الموجودة في المصفوفة.
</p>

<p>
	إذا أردنا معرفة رقم الفهرس لعنصر معين في المصفوفة، وليكن مثلا seahorse، نستطيع أن نستخدم لذلك الوظيفة indexOf() :
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_25" style="">
<span class="pln">seaCreatures</span><span class="pun">.</span><span class="pln">indexOf</span><span class="pun">(</span><span class="str">"seahorse"</span><span class="pun">);</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="lit">3</span></pre>

<p>
	إذا لم تحتوي المصفوفة على العنصر الذي نريده، فلن نحصل على رقم فهرس لعنصر غير موجود، وفي هذه الحالة، فإن الوظيفة سترجع لنا القيمة -1 كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_27" style="">
<span class="pln">seaCreatures</span><span class="pun">.</span><span class="pln">indexOf</span><span class="pun">(</span><span class="str">"cuttlefish"</span><span class="pun">);</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">-</span><span class="lit">1</span></pre>

<p>
	بواسطة أرقام الفهارس المرتبطة بعناصر المصفوفة، فإنه لدينا القدرة على الوصول لكل عنصر بشكل منفرد بهدف العمل على هذا العنصر والتعامل معه.
</p>

<h2>
	الوصول لعناصر المصفوفة
</h2>

<p>
	يتم الوصول لعنصر في مصفوفة جافا سكريبت بواسطة الإشارة لرقم الفهرس للعنصر بين قوسين معكوفين:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_29" style="">
<span class="pln">seaCreatures</span><span class="pun">[</span><span class="lit">1</span><span class="pun">];</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

squid</span></pre>

<p>
	نعلم أن الرقم 0 سيعيد لنا دائما العنصر الأول في المصفوفة. كذلك نستطيع إيجاد العنصر الأخير في المصفوفة بواسطة إجراء عملية طرح قيمة 1 من قيمة الخاصية length للمصفوفة، والإشارة لناتج هذه العملية كرقم فهرس للعنصر الأخير كما هو موضح في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_31" style="">
<span class="kwd">const</span><span class="pln"> lastIndex </span><span class="pun">=</span><span class="pln"> seaCreatures</span><span class="pun">.</span><span class="pln">length </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">



seaCreatures</span><span class="pun">[</span><span class="pln">lastIndex</span><span class="pun">];</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

starfish</span></pre>

<p>
	محاولة الوصول لعنصر غير موجود سيعيد لنا undefined:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_33" style="">
<span class="pln">seaCreatures</span><span class="pun">[</span><span class="lit">10</span><span class="pun">];</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="kwd">undefined</span></pre>

<p>
	للوصول لعنصر مصفوفة متداخلة (مصفوفة داخل مصفوفة)، فعلينا إضافة فهرس اخر يعود للمصفوفة الداخلية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_35" style="">
<span class="pln">let nestedArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="pun">[</span><span class="pln">

        </span><span class="str">"salmon"</span><span class="pun">,</span><span class="pln">

        </span><span class="str">"halibut"</span><span class="pun">,</span><span class="pln">

    </span><span class="pun">],</span><span class="pln">

    </span><span class="pun">[</span><span class="pln">

        </span><span class="str">"coral"</span><span class="pun">,</span><span class="pln">

        </span><span class="str">"reef"</span><span class="pun">,</span><span class="pln">

    </span><span class="pun">]</span><span class="pln">

</span><span class="pun">];</span><span class="pln">



nestedArray</span><span class="pun">[</span><span class="lit">1</span><span class="pun">][</span><span class="lit">0</span><span class="pun">];</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

coral</span></pre>

<p>
	في المثال السابق، قمنا بالوصول للعنصر coral بالإشارة لرقم الفهرس الذي يحتوي المصفوفة الداخلية وهو 1، ثم أشرنا للفهرس الذي يحتوي على العنصر في المصفوفة الداخلية وهو 0.
</p>

<h2>
	إضافة عنصر لمصفوفة
</h2>

<p>
	في المتغير seaCreatuers يوجد لدينا 5 عناصر بأرقام فهراس تبدأ من 0 الى 4. إذا أردنا أن نُضيف عنصر جديد لهذه المصفوفة، فيمكننا أن نقوم بذلك بإعطاء قيمة للفهرس التالي الذي يلي اخر فهرس:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_37" style="">
<span class="pln">seaCreatures</span><span class="pun">[</span><span class="lit">5</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"whale"</span><span class="pun">;</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'octopus'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	إذا قمنا بإضافة عنصر وتجاهلنا قيمة الفهرس التالي ووضعنا بدلا منه فهرس بقيمة 7 مثلا، فإن ذلك يؤدي لإضافة عنصر غير مُعرف (undefined) للمصفوفة كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_39" style="">
<span class="pln">seaCreatures</span><span class="pun">[</span><span class="lit">7</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"pufferfish"</span><span class="pun">;</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'octopus'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	هذه المشكلة نستطيع تجنبها باستخدام الوظيفة push() والتي تقوم بإضافة العنصر الجديد في نهاية المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_41" style="">
<span class="com">// Append lobster to the end of the seaCreatures array</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="str">"lobster"</span><span class="pun">);</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'octopus'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'lobster'</span><span class="pln"> </span><span class="pun">]</span><span class="pln">
</span></pre>

<p>
	على العكس تماما من الوظيفة push()، فإن الوظيفة unshift() تقوم بإضافة العنصر في بداية المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_43" style="">
<span class="com">// Append dragonfish to the beginning of the seaCreatures array</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">unshift</span><span class="pun">(</span><span class="str">"dragonfish"</span><span class="pun">);</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'dragonfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'octopus'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'lobster'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	باستخدام الوظيفتين السابقتين، ستكون لديك المقدرة على إضافة عناصر جديدة للمصفوفة إما في بدايتها، أو نهايتها.
</p>

<h2>
	إزالة عنصر من مصفوفة
</h2>

<p>
	لإزالة عنصر معين من مصفوفة، نستخدم الوظيفة splice().
</p>

<p>
	في المصفوفة seaCreatuers قمنا بإضافة عنصر غير مُعرف وليس له قيمة، ولإزالته نقوم بالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_45" style="">
<span class="pln">seaCreatures</span><span class="pun">.</span><span class="pln">splice</span><span class="pun">(</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'dragonfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'octopus'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'lobster'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	في الوظيفة splice()، المُعامل الأول يشير لرقم الفهرس الذي سنبدأ بالإزالة من عنده (في هذه الحالة 7)، والمُعامل الثاني يشير لعدد العناصر التي نرغب بإزالتها (في حالتنا سيكون 1 حيث أننا نرغب بإزالة عنصر واحد).
</p>

<p>
	الوظيفة splice() ستؤثر على المتغير الأصلي. لذلك، إذا أردنا أن نحافظ على المصفوفة الأصلية دون تغيير، نستخدم الوظيفة slice() ونعطي القيمة الناتجة عنها لمتغير جديد.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_47" style="">
<span class="pln">let newArray </span><span class="pun">=</span><span class="pln"> slice</span><span class="pun">(</span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span></pre>

<p>
	الوظيفة pop() ستزيل العنصر الأخير من المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_49" style="">
<span class="com">// Remove the last item from the seaCreatures array</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">pop</span><span class="pun">();</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'dragonfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'octopus'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	العنصر lobster أُزيل من المصفوفة لأنه العنصر الأخير، ولإزالة العنصر الأول في المصفوفة، نستخدم الوظيفة shift():
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_51" style="">
<span class="com">// Remove the first item from the seaCreatures array</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">shift</span><span class="pun">();</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'octopus'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	باستخدام الوظيفتين pop() و  shift() نستطيع إزالة العناصر من بداية المصفوفة أو نهايتها. يُفضل استخدام الوظيفة pop() قدر الإمكان، حيث أن باقي العناصر في المصفوفة تبقى في مواقعها دون تغيير.
</p>

<h2>
	تعديل العناصر في المصفوفة
</h2>

<p>
	نستطيع تغيير أي قيمة عنصر في المصفوفة وذلك بإعطاء القيمة الجديدة للعنصر باستخدام عملية المساواة، كما نفعل تماما عند التعامل مع المتغيرات العادية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_53" style="">
<span class="com">// Assign manatee to the first item in the seaCreatures array</span><span class="pln">

seaCreatures</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"manatee"</span><span class="pun">;</span><span class="pln">



seaCreatures</span><span class="pun">;</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'manatee'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'seahorse'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pln"> </span><span class="pun">]</span><span class="pln">
</span></pre>

<p>
	طريقة أخرى لتغيير قيمة العنصر باستخدام الوظيفة splice() وذلك بإضافة مُعامل جديد. فمثلا، إذا أردنا تغيير قيمة العنصر seahorse والذي يقع في الفهرس 3، نستطيع إزالته وإضافة قيمة جديدة بدلا منه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_55" style="">
<span class="com">// Replace seahorse with sea lion using splice method</span><span class="pln">

seaCreatures</span><span class="pun">.</span><span class="pln">splice</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"sea lion"</span><span class="pun">);</span><span class="pln">



seaCreatures</span><span class="pun">();</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="pun">[</span><span class="pln"> </span><span class="str">'manatee'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'squid'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'shark'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'sea lion'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'starfish'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'whale'</span><span class="pun">,</span><span class="pln">

    </span><span class="str">'pufferfish'</span><span class="pln"> </span><span class="pun">]</span></pre>

<p>
	في المثال السابق، قمنا بإزالة العنصر seahorse من المصفوفة، ووضعنا بدلا منه القيمة sea lion في نفس الفهرس 3.
</p>

<h2>
	حلقة التكرار خلال المصفوفة
</h2>

<p>
	نستطيع المرور على عناصر المصفوفة من خلال حلقة تكرار for وذلك بالاستفادة من خاصية length. في المثال التالي، نُنشئ مصفوفة باسم shellfish ونطبع رقم كل فهرس فيها بالإضافة إلى قيمة العنصر المرتبط بالفهرس:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_57" style="">
<span class="com">// Create an array of shellfish species</span><span class="pln">

let shellfish </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="str">"oyster"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"shrimp"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"clam"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"mussel"</span><span class="pun">,</span><span class="pln">

</span><span class="pun">];</span><span class="pln">



</span><span class="com">// Loop through the length of the array</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">let i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> shellfish</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

  console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">i</span><span class="pun">,</span><span class="pln"> shellfish</span><span class="pun">[</span><span class="pln">i</span><span class="pun">]);</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

</span><span class="lit">0</span><span class="pln"> </span><span class="str">'oyster'</span><span class="pln">

</span><span class="lit">1</span><span class="pln"> </span><span class="str">'shrimp'</span><span class="pln">

</span><span class="lit">2</span><span class="pln"> </span><span class="str">'clam'</span><span class="pln">

</span><span class="lit">3</span><span class="pln"> </span><span class="str">'mussel'</span><span class="pln">
</span></pre>

<p>
	نستطيع أيضا استخدام حلقة التكرار for…of وهي خاصية جديدة في الجافا سكريبت:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9060_59" style="">
<span class="com">// Create an array of aquatic mammals</span><span class="pln">

let mammals </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="pln">

    </span><span class="str">"dolphin"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"whale"</span><span class="pun">,</span><span class="pln">

    </span><span class="str">"manatee"</span><span class="pun">,</span><span class="pln">

</span><span class="pun">];</span><span class="pln">



</span><span class="com">// Loop through each mammal</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="pln">let mammal of mammals</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">

    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">mammal</span><span class="pun">);</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="typ">Output</span><span class="pln">

dolphin

whale

manatee</span></pre>

<p>
	حلقة التكرار for…of لا تقوم باستخدام رقم الفهرس للعناصر في المصفوفة، ولكنها بشكل عام طريقة أبسط وأكثر اختصارا للمرور على المصفوفة من خلال حلقة التكرار.
</p>

<p>
	استخدام حلقات التكرار مفيد بشكل كبير في طباعة قيم عناصر المصفوفة وهو يشبه عرض العناصر من قاعدة بيانات خلال موقع الكتروني.
</p>

<h2>
	خاتمة
</h2>

<p>
	تُعتبر المصفوفات جزء أساسي ومهم في برمجة الجافا سكريبت. في هذا الدرس تعلمنا كيفية إنشاء المصفوفة، وكيفية فهرستها، وتعلمنا إجراء بعض العمليات المهمة على المصفوفات مثل إزالة العناصر والتعديل عليها. وكذلك تعلمنا طريقتين للمرور على عناصر المصفوفة من خلال حلقات التكرار والتي تهدف لإجراء عمليات على عناصر المصفوفة مثل طباعة محتوياتها وطباعة أرقام الفهارس.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/understanding-arrays-in-javascript#indexing-arrays" rel="external nofollow">Understanding Arrays in JavaScript</a> لصاحبه Tania Rascia
</p>

<p>
	حقوق الصورة البارزة محفوظة لـ <a href="https://www.freepik.com/free-vector/circular-technological-background-with-a-mesh-of-dots_1055189.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">555</guid><pubDate>Fri, 03 Nov 2017 08:05:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x633;&#x631;&#x64A;&#x639; &#x625;&#x644;&#x649; &#x644;&#x63A;&#x629; &#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A; JavaScript</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B3%D8%B1%D9%8A%D8%B9-%D8%A5%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-javascript-r550/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/59ee5446db6f7_24(1).png.af8d30f18cfa3d7617e5e3a58cf93985.png" /></p>
<p>
	وضع Netscape’s Brendan Eich أسس جافا سكريبت سنة 1995. وكان الغرض منها أن تكون لغة ترميز سهلة خاصة بالمواقع ومكملة للجافا في تطبيقات الويب المعقدة، ولكن سهولة دمج جافا سكريبت والدعم الذاتي لها مع المتصفحات جعلها أكثر شيوعًا من لغة الجافا الأصلية في واجهات الويب.<br>
	لا يقتصر استخدام جافا سكريبت مقتصرة على المتصفحات، ف Node.js مشروع قائم بذاته ويقدم إمكانية بناء تطبيقات إنترنت قائمة بذاتها.<br>
	صيغة الشفرة البرمجية الخاصة بجافا سكريبت شبيهة بطريقة كتابة لغة C، فإذا كنت قد تعاملت مع لغة البرمجة C قبل ذلك أو جافا، ستكون الكثير من الأساسيات مألوفة لك. على الرغم من ذلك، وعلى الرغم من سهولة الاسم، إلا أن النموذج الكائني في جافا سكريبت مختلف تماماً عن الموجود في الجافا.<br>
	سنتناول في هذا المقال المواضيع التالية:
</p>

<ol>
	<li>
		التعليقات.
	</li>
	<li>
		الأرقام، النصوص والعمليات.
	</li>
	<li>
		المتغيرات، المصفوفات والكائنات.
	</li>
	<li>
		جمل التحكم والمنطق.
	</li>
	<li>
		الدوال، نطاق الوصول و Closures.
	</li>
	<li>
		المشيّدات Constructors والنماذج الأولية Prototypes
	</li>
</ol>

<h2 id="التعليقات">
	التعليقات
</h2>

<p>
	لكتابة تعليق من سطر واحد نبدأ السطر بعلامتي / كما في السطر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><span class="com">// Single-line comments start with two slashes.</span></pre>

<p>
	لكتابة تعليق من أكثر من سطر، نستخدم /* و */ في إحاطة الأسطر التي نريدها كما في الأسطر التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs fsharp"><span class="com">/* Multiline comments start </span><span class="hljs-keyword"><span class="com">with</span></span><span class="com"> slash-star،
   </span><span class="hljs-keyword"><span class="com">and</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">end</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">with</span></span><span class="com"> star-slash */</span></code></pre>

<p>
	تنتهي الجمل في جافا سكريبت بفاصلة منقوطة، ولكن هذا الأمر غير ضروري، حيث يتم إضافة الفاصلة المنقوطة تلقائيا عند وجود سطر جديد وعدم وجود الفاصلة، وهذا الأمر مستثنى في بعض الحالات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs bash"><span class="hljs-keyword"><span class="pln">do</span></span><span class="pln">Stuff</span><span class="pun">();</span></code></pre>

<p>
	بدون فاصلة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs bash"><span class="hljs-keyword"><span class="pln">do</span></span><span class="pln">Stuff</span><span class="pun">()</span></code></pre>

<p>
	سنعتمد في هذا الدرس استخدام الفاصلة المنقوطة.
</p>

<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة تطوير التطبيقات باستخدام لغة JavaScript
		</p>

		<p class="banner-subtitle">
			تعلم البرمجة بلغة جافا سكريبت انطلاقًا من أبسط المفاهيم وحتى بناء تطبيقات حقيقية.
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/javascript-application-development/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة تطوير التطبيقات باستخدام لغة JavaScript" src="https://academy.hsoub.com/learn/assets/images/courses/javascript-application-development.png">
	</div>
</div>

<h2 id="الأرقام-النصوص-والعمليات">
	الأرقام، النصوص والعمليات
</h2>

<p>
	تحتوي جافا سكريبت على نوع رقمي واحد (64-bit IEEE 754 double).<br>
	الأرقام من نوع Double (الأعداد الحقيقة) تحتوي على 52 بت من الأساس العشري، بما يكفي لتخزين الأعداد الصحيحة Integers حتى 9✕10¹⁵ بدقة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-number"><span class="lit">3</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 3</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1.5</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 1.5</span></span></code></pre>

<p>
	بعض العمليات الحسابية الأساسية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 2</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">0.1</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0.2</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 0.30000000000000004</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">8</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 7</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 20</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">35</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 7</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 2.5</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">10</span></span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 0</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">30</span></span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 2</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">18.5</span></span><span class="pln"> </span><span class="pun">%</span><span class="pln"> </span><span class="hljs-number"><span class="lit">7</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 4.5</span></span></code></pre>

<p>
	العمليات الثنائية متاحة أيضا، فعند إجراءك لعملية ثنائية، فإن الأعداد العشرية Float يتم تحويله إلى أعداد طبيعية Int حتى 32 بت:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="lit">1</span><span class="pln"> </span><span class="pun">&lt;&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// </span></span><span class="com">=</span><span class="hljs-string"><span class="com"> 4</span></span></code></pre>

<p>
	ترتيب العمليات يتم بواسطة استخدام الأقواس:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pun">(</span><span class="lit">1</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln"> </span><span class="com">// </span></span><span class="com">=</span><span class="hljs-string"><span class="com"> 8</span></span></code></pre>

<p>
	توجد ثلاثة قيم أرقام غير حقيقية كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-literal"><span class="kwd">Infinity</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// ناتجة عن قسمة رقم موجب على صفر</span></span><span class="pln">
</span><span class="pun">-</span><span class="hljs-literal"><span class="kwd">Infinity</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// ناتجة عن قسمة رقم سالب على صفر</span></span><span class="pln">
</span><span class="hljs-literal"><span class="kwd">NaN</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">//تشير إلى قيمة "غير رقم" </span></span></code></pre>

<p>
	القيم المنطقية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs bash"><span class="hljs-literal"><span class="kwd">true</span></span><span class="pun">;</span><span class="pln">
</span><span class="hljs-literal"><span class="kwd">false</span></span><span class="pun">;</span></code></pre>

<p>
	يتم استخدام علامة التنصيص المنفردة أو المزدوجة لبناء النصوص:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs bash"><span class="hljs-string"><span class="str">'abc'</span></span><span class="pun">;</span><span class="pln">
</span><span class="hljs-string"><span class="str">"Hello، world"</span></span><span class="pun">;</span></code></pre>

<p>
	لعكس القيمة نستخدم علامة التعجب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="pun">!</span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">false</span></span><span class="pln">
</span><span class="pun">!</span><span class="hljs-keyword"><span class="kwd">false</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span></code></pre>

<p>
	لفحص المساواة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">false</span></span></code></pre>

<p>
	لفحص عدم المساواة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">false</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">!==</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span></code></pre>

<p>
	عمليات المقارنة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">false</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span></code></pre>

<p>
	دمج النصوص يتم بواسطة عملية + :
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-string"><span class="str">"Hello "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">"world!"</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-string"><span class="com">"Hello world!"</span></span></code></pre>

<p>
	وعملية الدمج + لا تعمل فقط مع النصوص، بل مع الأرقام أيضا والتراكيب مثل المصفوفات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs bash"><span class="hljs-string"><span class="str">"1، 2، "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">;</span><span class="pln"> </span><span class="com">// = </span><span class="hljs-string"><span class="com">"1، 2، 3"</span></span><span class="pln">
</span><span class="hljs-string"><span class="str">"Hello "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">"world"</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-string"><span class="str">"!"</span></span><span class="pun">]</span><span class="pln"> </span><span class="com">// = </span><span class="hljs-string"><span class="com">"Hello world،!"</span></span></code></pre>

<p>
	من الممكن مقارنة النصوص:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-string"><span class="str">"a"</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-string"><span class="str">"b"</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span></code></pre>

<p>
	لإجراء عملية فحص المساواة باعتبار تحويل أنواع البيانات (في حالة اختلافها) نستخدم عملية = مرتين:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-string"><span class="str">"5"</span></span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span><span class="pln">
</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span></code></pre>

<p>
	في حالة استخدام = ثلاثة مرات، لا تتم عملية التحويل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-string"><span class="str">"5"</span></span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">false</span></span><span class="pln">
</span><span class="kwd">null</span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">false</span></span></code></pre>

<p>
	لابد من الانتباه من التحويل التلقائي للنوع تجنبا لبعض الحالات غير المرغوبة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-number"><span class="lit">13</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">!</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> </span><span class="hljs-number"><span class="com">14</span></span><span class="pln">
</span><span class="hljs-string"><span class="str">"13"</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="pun">!</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> </span><span class="hljs-string"><span class="com">'13true'</span></span></code></pre>

<p>
	نستخدم charAt للوصول لمحرف Character معين في النصوص بتعيين مكانها في سلسلة المحارف:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-string"><span class="str">"This is a string"</span></span><span class="pun">.</span><span class="pln">charAt</span><span class="pun">(</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">);</span><span class="pln">  </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-string"><span class="com">'T'</span></span></code></pre>

<p>
	أو نستخدم substring للحصول على أجزاء أكبر من النصوص:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-string"><span class="str">"Hello world"</span></span><span class="pun">.</span><span class="pln">substring</span><span class="pun">(</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">);</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-string"><span class="com">"Hello"</span></span></code></pre>

<p>
	length تعتبر خاصية، لذلك لا تستخدم الأقواس في النهاية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs rsl"><span class="hljs-string"><span class="str">"Hello"</span></span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">length</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 5</span></span></code></pre>

<p>
	نستخدم null للإشارة للفارغ أو غير الموجود، بينما نستخدم undefined للإشارة لقيمة غير منشأة أو غير موجودة حاليا (مثل تعريف متغير وعدم إعطائه قيمة).<br>
	القيم false، null، undefined، NaN، 0 ،”” كلها قيم خاطئة (تستخدم كقيمة منطقية خطأ) والباقي صحيح.
</p>

<h2 id="المتغيرات-المصفوفات-والكائنات">
	المتغيرات، المصفوفات، والكائنات
</h2>

<p>
	يتم تعريف المتغيرات باستخدام كلمة var. جافا سكريبت ديناميكية النوع، حيث لا يجب عليك تحديد نوع المتغير عند تعريفه، ولإعطاء قيمة للمتغير نستخدم = كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="kwd">var</span><span class="pln"> someVar </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span></span></code></pre>

<p>
	عند عدم استخدام كلمة var لن يظهر لك خطأ، ولكن في هذه الحالة فإن المتغير يكون مستواه على نطاق الوصول العام Global scope ولن يكون على المستوى الذي تم تعريفه فقط.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pln">someOtherVar </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span></span></code></pre>

<p>
	المتغيرات التي لا تأخذ قيمة عند تعريفها تكون بقيمة undefined تلقائيا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> someThirdVar</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = undefined</span></span></code></pre>

<p>
	لتعريف أكثر من متغير في نفس السطر نفصل بين المتغيرات بفاصلة عادية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="kwd">var</span><span class="pln"> someFourthVar </span></span><span class="pun">=</span><span class="hljs-string"><span class="pln"> </span><span class="lit">2</span><span class="pun">،</span><span class="pln"> someFifthVar </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">;</span></span></code></pre>

<p>
	نستطيع اختصار كتابة العمليات الحسابية بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="pln">someVar </span><span class="pun">+=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// هذا يعادل someVar = someVar + 5; someVar is 10 now</span></span><span class="pln">
someVar </span><span class="pun">*=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// someVar = 100</span></span><span class="pln">
someVar</span><span class="pun">++;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// someVar = 101</span></span><span class="pln">
someVar</span><span class="pun">--;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// back = 100</span></span></code></pre>

<p>
	المصفوفات عبارة عن قائمة من القيم المرتبة من أي نوع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myArray </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">"Hello"</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">45</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">];</span></code></pre>

<p>
	نستطيع الوصول لمحتويات المصفوفة باستخدام الأقواس المعكوفة والفهرس.<br>
	فهرس المصفوفات يبدأ من صفر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs scss"><span class="pln">myArray</span><span class="hljs-attr_selector"><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 45</span></span></code></pre>

<p>
	المصفوفات غير ثابتة وذات حجم متغير:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs rsl"><span class="pln">myArray</span><span class="pun">.</span><span class="pln">push</span><span class="pun">(</span><span class="hljs-string"><span class="str">"World"</span></span><span class="pun">);</span><span class="pln">
myArray</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">length</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 4</span></span></code></pre>

<p>
	للتعديل أو الإضافة في موقع معين في المصفوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ini"><span class="hljs-setting"><span class="pln">myArray</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-value"><span class="hljs-string"><span class="str">"Hello"</span></span><span class="pun">;</span></span></span></code></pre>

<p>
	لتعريف قاموس (Hash):
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myObj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">key1</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Hello"</span></span><span class="pun">،</span><span class="pln"> key2</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"World"</span></span><span class="pun">};</span></code></pre>

<p>
	المفاتيح في القاموس عبارة عن نص، أو مُعرف صحيح، والقيم تأخذ أي نوع:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myObj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">myKey</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"myValue"</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-string"><span class="str">"my other key"</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">};</span></code></pre>

<p>
	للوصول إلى قيمة باستخدام مفتاح والأقواس المعكوفة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="pln">myObj</span><span class="pun">[</span><span class="hljs-string"><span class="str">"my other key"</span></span><span class="pun">];</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 4</span></span></code></pre>

<p>
	أو باستخدام صيغة النقطة والمُعِرف الذي يمثل المفتاح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="pln">myObj</span><span class="pun">.</span><span class="pln">myKey</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-string"><span class="com">"myValue"</span></span></code></pre>

<p>
	الكائنات في جافا سكريبت غير ثابتة وقابلة للتعديل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs bash"><span class="pln">myObj</span><span class="pun">.</span><span class="pln">myThirdKey </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">true</span></span><span class="pun">;</span></code></pre>

<p>
	إذا حاولت الوصول لقيمة غير موجودة في القاموس، ستكون النتيجة المرجعة undefined:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs fix"><span class="hljs-attribute"><span class="pln">myObj</span><span class="pun">.</span><span class="pln">myFourthKey</span><span class="pun">;</span><span class="pln"> </span><span class="com">// </span></span><span class="com">=</span><span class="hljs-string"><span class="com"> undefined</span></span></code></pre>

<h2 id="جمل-التحكم-والمنطق">
	جمل التحكم والمنطق
</h2>

<p>
	جملة if:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs axapta"><span class="kwd">var</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">count</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">;</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">count</span></span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">){</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// ستُنفَّذ هذه الشفرةإذا كانت قيمة المتغير تساوي 3</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="pln">count</span></span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4</span></span><span class="pun">){</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// ستُنفَّذ هذه الشفرةإذا كانت قيمة المتغير تساوي 4</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">else</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// ستُنفَّذ هذه الشفرة في حالة عدم تحقق أي شرط سابق</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	جملة while:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">while</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">){</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">// جملة تكرار غير منتهية</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	جملة do تشبه جملة while إلا أنها تُكرَّر مرة واحدة على الأقل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> input</span><span class="pun">;</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">do</span></span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    input </span><span class="pun">=</span><span class="pln"> getInput</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">while</span></span><span class="pln"> </span><span class="pun">(!</span><span class="pln">isValid</span><span class="pun">(</span><span class="pln">input</span><span class="pun">))</span></code></pre>

<p>
	جملة For تشبه الموجودة في لغة سي وجافا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs matlab"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">i</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">i</span></span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">i</span></span><span class="pun">++)</span><span class="hljs-cell"><span class="pun">{</span><span class="pln">
    </span><span class="com">// ستُنفَّذ هذه الشفرة خمس مرات</span><span class="pln">
</span><span class="pun">}</span></span></code></pre>

<p>
	توقف جملة التكرار باستخدام break مع تحديد اسم جملة التكرار التي نريد وقفها:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="pln">outer</span><span class="pun">:</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&lt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">;</span><span class="pln"> j</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> j </span><span class="pun">==</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="hljs-keyword"><span class="kwd">break</span></span><span class="pln"> outer</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	تسمح لنا جملة for/in بالمرور على خصائص ومحتويات الكائن. في المثال التالي نقوم بالمرور على محتوى قاموس وحفظ النتيجة في متغير:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> description </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">""</span></span><span class="pun">;</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> person </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">fname</span><span class="pun">:</span><span class="hljs-string"><span class="str">"Paul"</span></span><span class="pun">،</span><span class="pln"> lname</span><span class="pun">:</span><span class="hljs-string"><span class="str">"Ken"</span></span><span class="pun">،</span><span class="pln"> age</span><span class="pun">:</span><span class="hljs-number"><span class="lit">18</span></span><span class="pun">};</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> x </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> person</span><span class="pun">){</span><span class="pln">
    description </span><span class="pun">+=</span><span class="pln"> person</span><span class="pun">[</span><span class="pln">x</span><span class="pun">]</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">" "</span></span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// description = 'Paul Ken 18 '</span></span></code></pre>

<p>
	العملية المنطقية and تُمَثَلْ ب &amp;&amp; والعملية or تُمَثَلْ ب ||:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">house</span><span class="pun">.</span><span class="pln">size </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-string"><span class="str">"big"</span></span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> house</span><span class="pun">.</span><span class="pln">colour </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-string"><span class="str">"blue"</span></span><span class="pun">){</span><span class="pln">
    house</span><span class="pun">.</span><span class="pln">contains </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"bear"</span></span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">colour </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-string"><span class="str">"red"</span></span><span class="pln"> </span><span class="pun">||</span><span class="pln"> colour </span><span class="pun">==</span><span class="pln"> </span><span class="hljs-string"><span class="str">"blue"</span></span><span class="pun">){</span><span class="pln">
    </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> colour is either red </span><span class="hljs-keyword"><span class="com">or</span></span><span class="com"> blue</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	نستفيد من &amp;&amp; و || في تحديد القيم التلقائية كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> otherName </span><span class="pun">||</span><span class="pln"> </span><span class="hljs-string"><span class="str">"default"</span></span><span class="pun">;</span></code></pre>

<p>
	جملة switch تفحص المساواة باستخدام ===، استخدم break بعد كل حالة فحص وإلا سيتم تنفيذ حالة case الصحيحة التالية أيضا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs mel"><span class="pln">grade </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'B'</span></span><span class="pun">;</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">switch</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">grade</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">case</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'A'</span></span><span class="pun">:</span><span class="pln">
    console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"Great job"</span></span><span class="pun">);</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">break</span></span><span class="pun">;</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">case</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'B'</span></span><span class="pun">:</span><span class="pln">
    console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"OK job"</span></span><span class="pun">);</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">break</span></span><span class="pun">;</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">case</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'C'</span></span><span class="pun">:</span><span class="pln">
    console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"You can do better"</span></span><span class="pun">);</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">break</span></span><span class="pun">;</span><span class="pln">
  </span><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">:</span><span class="pln">
    console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"Oy vey"</span></span><span class="pun">);</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">break</span></span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<h2 id="الدوال-نطاق-الوصول-وclosures">
	الدوال، نطاق الوصول وClosures
</h2>

<p>
	تُعرَّف الدوال في جافا سكريبت باستخدام كلمة function:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">myFunction</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">thing</span><span class="pun">)</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> thing</span><span class="pun">.</span><span class="pln">toUpperCase</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
myFunction</span><span class="pun">(</span><span class="hljs-string"><span class="str">"foo"</span></span><span class="pun">);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "FOO"</span></span></code></pre>

<p>
	لابد الانتباه أن تضع القيمة المرجعة في نفس السطر الموجودة به كلمة return، إذا لم يكن كذلك، ستكون النتيجة المرجعة undefined بسبب الإضافة التلقائية للفاصلة المنقوطة عند كل سطر جديد (وقد نوهنا لهذه النقطة في البداية).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">myFunction</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-comment"><span class="com">// الفاصلة المنقوطة مضافة تلقائيا هنا</span></span><span class="pln">
    </span><span class="pun">{</span><span class="pln">thisIsAn</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">'object literal'</span></span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
myFunction</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = undefined</span></span></code></pre>

<p>
	يُتعامل مع الدوال في جافا سكريبت بوصفها كائنات، وهذا يعني أنك تستطيع تمرير الدالة معاملا لدالة أخرى، أو قيمة لمتغير.<br>
	تُستخدَم الدالة myFunction في معالجة حدث في المثال التالي، حيث سيتم تنفيذها بعد فترة زمنية محددة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">myFunction</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// ينتُج عن السطر التالي تنفيذ الدالة أعلاه بعد 5 ثوان</span></span><span class="pln">
setTimeout</span><span class="pun">(</span><span class="pln">myFunction</span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5000</span></span><span class="pun">);</span></code></pre>

<p>
	ملاحظة: الدالة setTimeout ليست جزءًا من جافا سكريبت، ولكنها مقدمة من قبل المتصفحات و Node.js.<br>
	وظيفة setInterval أيضا مقدمة من قبل المتصفحات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs delphi"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">myFunction</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="hljs-comment"><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></span><span class="pln">
</span><span class="hljs-title"><span class="pln">setInterval</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">myFunction</span><span class="pun">،</span><span class="pln"> </span><span class="lit">5000</span><span class="pun">)</span></span><span class="pun">;</span></span></code></pre>

<p>
	ليس من الشرط تحديد اسم الدالة، ونستطيع كتابة الدالة دون اسم في المكان الذي يتم تمرير قيمتها المُرجعة فيه بالطريقة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="pln">setTimeout</span><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
</span><span class="pun">},</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5000</span></span><span class="pun">);</span></code></pre>

<p>
	تمتلك جافا سكريبت نطاقاً وظيفياً، حيث لكل دالة نطاقها الخاص، بينما الكتل الأخرى لا تشاركها هذا النطاق.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pun">){</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
i</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 5 </span></span></code></pre>

<p>
	إن كتبنا الشفرة في المثال السابق داخل دالة فإن قيمة المتغير i تساوي 5 على عكس ما تتوقعه في النطاق الكتلي، بمعنى أن المتغيرات مُشاهدَة ونستطيع الوصول إليها على مستوى الدالة بغض النظر عن مكان تعريفها داخل هذه الدالة.<br>
	وهذا يشير إلى نمط متعارف عليه يمنع المتغيرات المؤقتة من الظهور في نطاق الوصول العام.<br>
	وللتوضيح على ما سبق، في المثال التالي، يبقى المتغير temporary داخل نطاق الدالة المُعرف فيها، أما المتغيرات في النطاق العام مثل permanent فنستطيع الوصول إليه باستخدام الكائن العام والمسمى في كل المتصفحات ب window وتكون صيغة الوصول للمتغير هكذا window.permanent.<br>
	الكائن ذو النطاق العام يختلف اسمه في البيئات التي لا علاقة لها بالمتصفحات مثل Node.js.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="pun">(</span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> temporary </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln">
    window</span><span class="pun">.</span><span class="pln">permanent </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">;</span><span class="pln">
</span><span class="pun">})();</span><span class="pln">
temporary</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// raises ReferenceError</span></span><span class="pln">
permanent</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 10</span></span></code></pre>

<p>
	من أقوى خصائص لغة جافا سكريبت وجود ما يسمى بclosures ، حيث إذا كانت دالة مُعرفة داخل دالة أخرى، فإن الدالة الداخلية تمتلك الوصول لكافة المتغيرات الخاصة بالدالة الخارجية حتى بعد خروجها وانتهائها.<br>
	في المثال التالي، فإن استدعاء الدالة setTimeout سيتم تنفيذها مباشرة بعد استدعاء الدالة الخارجية sayHelloInFiveSeconds والتي ستنتهي مباشرة. ومن ثم سوف يبدأ العد حتى 5 ثوان لاستدعاء الوظيفة الداخلية، وعند انتهاء المدة، وعلى الرغم من خروج وانتهاء الدالة الخارجية، إلا أنه سيتم تنفيذ الداخلية بنجاح وسيتم الوصول للمتغير prompt دون مشاكل.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">sayHelloInFiveSeconds</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">name</span><span class="pun">)</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> prompt </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Hello، "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">"!"</span></span><span class="pun">;</span><span class="pln">
    </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="pln"> </span><span class="hljs-title"><span class="pln">inner</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
        alert</span><span class="pun">(</span><span class="pln">prompt</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    setTimeout</span><span class="pun">(</span><span class="pln">inner</span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5000</span></span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="hljs-comment"><span class="com">// سيتم طباعة "مرحبا أدم" بعد 5 ثواني</span></span><span class="pln">
sayHelloInFiveSeconds</span><span class="pun">(</span><span class="hljs-string"><span class="str">"Adam"</span></span><span class="pun">);</span><span class="pln"> </span></code></pre>

<h2 id="المشيدات-constructors-والنماذج-الأولية-prototypes">
	المشيّدات Constructors والنماذج الأولية Prototypes
</h2>

<p>
	يمكن للكائنات أن تحتوي على دوال، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myObj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    myFunc</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"Hello world!"</span></span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">myFunc</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "Hello world!"</span></span></code></pre>

<p>
	عندما يتم استدعاء دوال معرَّفة في كائن، فإن هذه الدوال تستطيع الوصول للكائن التي عُرِّفت فيه باستخدام كلمة this كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="pln">myObj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    myString</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Hello world!"</span></span><span class="pun">،</span><span class="pln">
    myFunc</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">myString</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">myFunc</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "Hello world!"</span></span></code></pre>

<p>
	الدالة myFunc لا تعمل إذا لم يتم استدعاؤها في سياق الكائن الذي تتصل به، لاحظ في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myFunc </span><span class="pun">=</span><span class="pln"> myObj</span><span class="pun">.</span><span class="pln">myFunc</span><span class="pun">;</span><span class="pln">
myFunc</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = undefined</span></span></code></pre>

<p>
	نستطيع ربط دالة بكائن والوصول لمتغيرات هذا الكائن بواسطة this على الرغم من أن هذه الدالة لم تُعرَّف مع تعريف بالكائن.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myOtherFunc </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">myString</span><span class="pun">.</span><span class="pln">toUpperCase</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">myOtherFunc </span><span class="pun">=</span><span class="pln"> myOtherFunc</span><span class="pun">;</span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">myOtherFunc</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "HELLO WORLD!"</span></span></code></pre>

<p>
	نستطيع أيضا تحديد سياق الدالة لتنفيذها من خلاله وذلك عن طريق استدعاء الوظيفة باستخدام call او apply.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> anotherFunc </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">myString </span><span class="pun">+</span><span class="pln"> s</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
anotherFunc</span><span class="pun">.</span><span class="pln">call</span><span class="pun">(</span><span class="pln">myObj</span><span class="pun">،</span><span class="pln"> </span><span class="hljs-string"><span class="str">" And Hello Moon!"</span></span><span class="pun">);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "Hello World! And Hello Moon!"</span></span></code></pre>

<p>
	استخدمنا في المثال السابق الدالة call. تؤدّي الدالة apply نفس الغرض ولكننا نمرر لها مصفوفة معاملات، وهذا يفيدنا في حالة التعامل مع دالة تقبل مجموعة من المعاملات.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="pln">anotherFunc</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="pln">myObj</span><span class="pun">،</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-string"><span class="str">" And Hello Sun!"</span></span><span class="pun">]);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "Hello World! And Hello Sun!"</span></span><span class="pln">

</span><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">.</span><span class="pln">min</span><span class="pun">(</span><span class="hljs-number"><span class="lit">42</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">27</span></span><span class="pun">);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 6</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">.</span><span class="pln">min</span><span class="pun">([</span><span class="hljs-number"><span class="lit">42</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">27</span></span><span class="pun">]);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = NaN (uh-oh!)</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">.</span><span class="pln">min</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">،</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">42</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">27</span></span><span class="pun">]);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 6</span></span></code></pre>

<p>
	لاحظ أننا عند استخدام apply و call قمنا بتمرير السياق الذي نريده من خلال myObj.<br>
	إذا أردنا أن نُثبت السياق الذي نريد تنفيذ الدالة من خلاله، فإننا نستخدم bind عوضا عن ذلك.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> boundFunc </span><span class="pun">=</span><span class="pln"> anotherFunc</span><span class="pun">.</span><span class="pln">bind</span><span class="pun">(</span><span class="pln">myObj</span><span class="pun">);</span><span class="pln">
boundFunc</span><span class="pun">(</span><span class="hljs-string"><span class="str">" And Hello Saturn!"</span></span><span class="pun">);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "Hello World! And Hello Saturn!"</span></span></code></pre>

<p>
	نستطيع استخدام bind لتطبيق دالة جزئيا، انظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> product </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">(</span><span class="pln">a</span><span class="pun">،</span><span class="pln"> b</span><span class="pun">)</span></span><span class="pun">{</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> a </span><span class="pun">*</span><span class="pln"> b</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> doubler </span><span class="pun">=</span><span class="pln"> product</span><span class="pun">.</span><span class="pln">bind</span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">،</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pun">);</span><span class="pln">
doubler</span><span class="pun">(</span><span class="hljs-number"><span class="lit">8</span></span><span class="pun">);</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 16</span></span></code></pre>

<p>
	عند استدعاء دالة بواسطة الكلمة new فإن كائناً جديداً يتم إنشاؤه وسوف يكون متاحا للدالة بواسطة كلمة this. الدوال التي صُممت للاستدعاء بهذه الطريقة تسمى المشيّدات constructors.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> </span><span class="typ">MyConstructor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">myNumber </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
myNewObj </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">MyConstructor</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = {myNumber: 5}</span></span><span class="pln">
myNewObj</span><span class="pun">.</span><span class="pln">myNumber</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 5</span></span></code></pre>

<p>
	على خلاف لغات <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r662/" rel="">البرمجة </a>الكائنية الأخرى، جافا سكريبت لا تحتوي على مفهوم العيّنة Instance أو “الكائن المتولد من الفئة عند التشغيل”.<br>
	تُقدم جافا سكريبت المفاهيم الكائنية مثل التوليد والوراثة من خلال مفهوم واحد يسمى النموذج الأولي Prototype.<br>
	كل كائن في الجافا سكريبت يحتوي على نموذج أولي. عندما تقوم بمحاولة استخدام لخاصية غير موجودة في كائن معين، فإن مفسر جافا سكريبت سوف ينظر في النموذج الأولي للكائن.<br>
	تجعلك بعض تطبيقات الجافا سكريبت تصل لنموذج الكائن بواسطة الخاصية “<strong>proto</strong>“. على الرغم من أن هذه الطريقة مفيدة في شرح مفهوم النموذج الأولي، إلا أنها ليست الطريقة المعيارية لذلك، وسوف نشرح الطريقة الصحيحة لهذا الأمر لاحقا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myObj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    myString</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Hello world!"</span></span><span class="pln">
</span><span class="pun">};</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myPrototype </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    meaningOfLife</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">42</span></span><span class="pun">،</span><span class="pln">
    myFunc</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">myString</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">

myObj</span><span class="pun">.</span><span class="pln">__proto__ </span><span class="pun">=</span><span class="pln"> myPrototype</span><span class="pun">;</span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">meaningOfLife</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 42</span></span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">myFunc</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "hello world!"</span></span></code></pre>

<p>
	في حال لم تكن الخاصية موجودة في النموذج الأولي، فإن المفسر يبحث في نموذج النموذج وهكذا.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs ruby"><span class="pln">myPrototype</span><span class="pun">.</span><span class="pln">__proto_</span><span class="hljs-number"><span class="pln">_</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="hljs-symbol"><span class="pln">myBoolean</span><span class="pun">:</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pln">
</span><span class="pun">};</span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">myBoolean</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-regexp"><span class="com">//</span></span><span class="com"> = </span><span class="hljs-keyword"><span class="com">true</span></span></code></pre>

<p>
	لا يوجد نُسَخْ عند استخدام النموذج، حيث إن كل كائن يقوم بالتأشير للنموذج الخاص به، وهذا يعني أن أي تغيير على النموذج سوف ينعكس في كل مكان آخر.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs avrasm"><span class="pln">myPrototype</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">meaningOfLife</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">43</span></span><span class="hljs-comment"><span class="pun">;</span></span><span class="pln">
myObj</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">meaningOfLife</span></span><span class="hljs-comment"><span class="pun">;</span><span class="pln"> </span><span class="com">// = 43</span></span></code></pre>

<p>
	جملة for/in تسمح بالمرور على خصائص كائن، مرورا بسلسلة النماذج الأولية حتى الوصول إلى نموذج فارغ.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> x </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> myObj</span><span class="pun">){</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">myObj</span><span class="pun">[</span><span class="pln">x</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="hljs-comment"><span class="hljs-xmlDocTag"><span class="com">///</span></span><span class="com">prints:</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Hello world!</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// 42</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// [Function: myFunc]</span></span></code></pre>

<p>
	للمرور على خصائص الكائن دون النموذج، نستخدم وظيفة hasOwnProperty كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs cs"><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> x </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> myObj</span><span class="pun">){</span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">myObj</span><span class="pun">.</span><span class="pln">hasOwnProperty</span><span class="pun">(</span><span class="pln">x</span><span class="pun">)){</span><span class="pln">
        console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="pln">myObj</span><span class="pun">[</span><span class="pln">x</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="hljs-comment"><span class="hljs-xmlDocTag"><span class="com">///</span></span><span class="com">prints:</span></span><span class="pln">
</span><span class="hljs-comment"><span class="com">// Hello world!</span></span></code></pre>

<p>
	كما ذكرنا سابقا، فإن استخدام “<strong>proto</strong>” في تعريف نموذج كائن هي طريقة غير معيارية، ولا يوجد طريقة لتغيير نموذج أولي لكائن موجود.<br>
	على الرغم من ذلك، توجد طريقتان لإنشاء كائن مع نموذج مُعطى.<br>
	الأولى هي استخدام Object.create:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myObj </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Object</span></span><span class="pun">.</span><span class="pln">create</span><span class="pun">(</span><span class="pln">myPrototype</span><span class="pun">);</span><span class="pln">
myObj</span><span class="pun">.</span><span class="pln">meaningOfLife</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 43</span></span></code></pre>

<p>
	الطريقة الثانية – مضمونة أكثر - باستخدام المشيّدات.<br>
	تمتلك المشيّدات خاصية تسمى prototype تُحدَّد عند إنشاء كائن جدي باستخدام كلمة new، المثال التالي يشرح هذا الأمر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="typ">MyConstructor</span><span class="pun">.</span><span class="pln">prototype </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    myNumber</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">،</span><span class="pln">
    getMyNumber</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
        </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">myNumber</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myNewObj2 </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="typ">MyConstructor</span><span class="pun">();</span><span class="pln">
myNewObj2</span><span class="pun">.</span><span class="pln">getMyNumber</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 5</span></span><span class="pln">
myNewObj2</span><span class="pun">.</span><span class="pln">myNumber </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pln">
myNewObj2</span><span class="pun">.</span><span class="pln">getMyNumber</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 6</span></span></code></pre>

<p>
	توجد لدى أنواع البيانات مثل النصوص والأرقام مشيّدات تقوم بإنشاء كائنات تعادل الكائنات المنشأة بطريقة عادية. عدا أنها ليست متماثلة تماما!
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myNumber </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">12</span></span><span class="pun">;</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> myNumberObj </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Number</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">12</span></span><span class="pun">);</span><span class="pln">
myNumber </span><span class="pun">==</span><span class="pln"> myNumberObj</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = true</span></span><span class="pln">

</span><span class="hljs-keyword"><span class="kwd">typeof</span></span><span class="pln"> myNumber</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 'number'</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">typeof</span></span><span class="pln"> myNumberObj</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = 'object'</span></span><span class="pln">
myNumber </span><span class="pun">===</span><span class="pln"> myNumberObj</span><span class="pun">;</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = false</span></span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">){</span><span class="pln">
    </span><span class="hljs-comment"><span class="com">//لن تُنفَّذ هذه الشفرة لأن قيمة الصفر خاطئة</span></span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Number</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">)){</span><span class="pln">
   </span><span class="hljs-comment"><span class="com">//سوف تُنفَّذ هذه الشفرة لأن الرقم في الشرط عبارة عن كائن وليس نوع رقم، والكائنات دائما ذات قيمة منطقية صحيحة</span></span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	الكائنات المغلفة أو العادية تتشارك في النموذج الأولي الخاص بنوعها، فمثلا، نستطيع إضافة خاصية على النموذج الخاص بنوع string بهدف الحصول على الحرف الأول من النص، كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs javascript"><span class="hljs-built_in"><span class="typ">String</span></span><span class="pun">.</span><span class="pln">prototype</span><span class="pun">.</span><span class="pln">firstCharacter </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">{</span></span><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">charAt</span><span class="pun">(</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="hljs-string"><span class="str">"abc"</span></span><span class="pun">.</span><span class="pln">firstCharacter</span><span class="pun">();</span><span class="pln"> </span><span class="hljs-comment"><span class="com">// = "a"</span></span></code></pre>

<p>
	تُستخدَم الخاصية السابقة غالباً في ما يُعرَف بالملْء المتعدّد Polyfilling والتي تُطَبِقْ مميزات أحدث من جافا سكريبت في مجموعة قديمة من نُسخ جافا سكريبت بهدف استخدام هذه المميزات الحديثة في بيئات قديمة مثل المتصفحات المنتهية تاريخا.<br>
	ملاحظة: تنفيذ Object.create قد يكون غير متاح في بعض التطبيقات، ولكننا نستطيع استخدام الملْء المتعدّد لتعويض هذا الغياب كالتالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_975_7" style=""><code class="hljs oxygene"><span class="hljs-keyword"><span class="kwd">if</span></span><span class="pln"> </span><span class="pun">(</span><span class="typ">Object</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">create</span></span><span class="pln"> </span><span class="pun">===</span><span class="pln"> </span><span class="kwd">undefined</span><span class="pun">)</span><span class="hljs-comment"><span class="pun">{</span><span class="pln"> </span><span class="com">//في حالة كانت موجودة لا تعدل عليها</span><span class="pln">
    </span><span class="typ">Object</span><span class="pun">.</span><span class="pln">create </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">proto</span><span class="pun">){</span><span class="pln">
        </span><span class="com">// أنشئ مشيّدًا مؤقتا باستخدام النموذج الأولي المناسب </span><span class="pln">
        </span><span class="kwd">var</span><span class="pln"> </span><span class="typ">Constructor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(){}</span></span><span class="pun">;</span><span class="pln">
        </span><span class="hljs-function"><span class="hljs-keyword"><span class="typ">Constructor</span></span><span class="pun">.</span><span class="hljs-title"><span class="pln">prototype</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-title"><span class="pln">proto</span></span><span class="pun">;</span></span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="typ">Constructor</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pun">;</span></span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></code></pre>

<p>
	ترجمة – بتصرّف – للمقال <a href="https://learnxinyminutes.com/docs/javascript/" rel="external nofollow">Learn X in Y minutes Where X=javascript</a>.
</p>
]]></description><guid isPermaLink="false">550</guid><pubDate>Tue, 24 Oct 2017 06:04:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; JSON &#x641;&#x64A; JavaScript</title><link>https://academy.hsoub.com/programming/javascript/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-json-%D9%81%D9%8A-javascript-r548/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/20.png.a7696108c021bef2cb96c2d981984947.png" /></p>

<p>
	بما أنّ <strong>JSON</strong> مشتقة من لغة JavaScript البرمجية، فمن الطبيعي إذًا أن تُستخدم كتنسيق للبيانات في هذه اللغة. JSON هي اختصار لـ <strong>JavaScript Object Notation</strong> (تنويت كائنات JavaScript) وتلفظ غالبًا كما يلفظ اسم (Jason).
</p>

<p>
	يمكن استخدام JSON في:
</p>

<ul>
<li>
		تخزين البيانات.
	</li>
	<li>
		إنشاء بنى المعلومات من خلال المعلومات التي يدخلها المستخدم.
	</li>
	<li>
		نقل البيانات من الخادوم إلى العميل، ومن العميل إلى الخادوم، ومن العميل إلى العميل.
	</li>
	<li>
		ترتيب البيانات والتحقق منها.
	</li>
</ul>
<p>
	يمثّل هذا المقال مقدّمة للعمل على JSON من خلال لغة JavaScript، ويجب أن تكون مطّلعًا على هذه اللغة لتحصل على الفائدة المرجوة من المقال.
</p>

<h2 id="صيغة-json">
	صيغة JSON
</h2>

<p>
	صيغة JSON مشتقة من صيغة الكائنات في JavaScript، ولكنّها صيغة نصّية بالكامل، وهي عبارة عن أزواج من المفاتيح والقيم التي تحاط عادة بأقواس معقوفة.
</p>

<p>
	عادة ما تخزّن كائنات JSON في ملف بامتداد <code>.json</code> ولكن يمكن أن تجد هذه الكائنات ضمن سياق البرنامج.
</p>

<p>
	تكون ملفات <code>.json</code> بالصيغة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<span class="pln">    </span><span class="pun">{</span><span class="pln"> 
      </span><span class="str">"first_name"</span><span class="pln">  </span><span class="pun">:</span><span class="pln">  </span><span class="str">"Sammy"</span><span class="pun">,</span><span class="pln"> 
      </span><span class="str">"last_name"</span><span class="pln">   </span><span class="pun">:</span><span class="pln">  </span><span class="str">"Shark"</span><span class="pun">,</span><span class="pln"> 
      </span><span class="str">"online"</span><span class="pln">      </span><span class="pun">:</span><span class="pln">  </span><span class="kwd">true</span><span class="pln"> 
    </span><span class="pun">}</span></pre>

<p>
	إما إن كانت كائنات JSON موجودة في ملف بامتداد <code>.js</code> أو <code>.html</code> فستكون على اﻷغلب مسندة إلى متغير وبالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs cs"><span class="pln">    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> sammy </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
      </span><span class="hljs-string"><span class="str">"first_name"</span></span><span class="pln">  </span><span class="pun">:</span><span class="pln">  </span><span class="hljs-string"><span class="str">"Sammy"</span></span><span class="pun">,</span><span class="pln"> 
      </span><span class="hljs-string"><span class="str">"last_name"</span></span><span class="pln">   </span><span class="pun">:</span><span class="pln">  </span><span class="hljs-string"><span class="str">"Shark"</span></span><span class="pun">,</span><span class="pln"> 
      </span><span class="hljs-string"><span class="str">"online"</span></span><span class="pln">      </span><span class="pun">:</span><span class="pln">  </span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pln"> 
    </span><span class="pun">}</span></code></pre>

<p>
	إضافة إلى ذلك، يمكن أن ترى JSON على هيئة سلسلة نصية لا عنصر وذلك ضمن شيفرة JavaScript، ويمكن كتابة الصيغة في سطر واحد كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs scilab"><span class="pln">    </span><span class="kwd">var</span><span class="pln"> sammy </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'{"</span></span><span class="str">first_name</span><span class="hljs-string"><span class="str">" : "</span></span><span class="str">Sammy</span><span class="hljs-string"><span class="str">", "</span></span><span class="str">last_name</span><span class="hljs-string"><span class="str">" : "</span></span><span class="str">Shark</span><span class="hljs-string"><span class="str">", "</span></span><span class="str">location</span><span class="hljs-string"><span class="str">" : "</span></span><span class="str">Ocean</span><span class="hljs-string"><span class="str">"}'</span></span><span class="pun">;</span></code></pre>

<p>
	تحويل كائنات JSON إلى سلاسل نصّية مفيد في نقل البيانات بصورة سريعة.
</p>

<h2 id="مقارنة-json-مع-كائنات-javascript">
	مقارنة JSON مع كائنات JavaScript
</h2>

<p>
	من المهمّ جدًّا الانتباه إلى أنّ JSON قد طُوّرت لكي تستخدم من قبل أي لغة برمجية، في حين أن التعامل مع كائنات JavaScript يكون بواسطة هذه اللغة حصرًا.
</p>

<p>
	أما بالنسبة إلى الصياغة، فإن كائنات JavaScript مشابهة لـ JSON، ولكن الفرق هو أنّ المفاتيح في كائنات JavaScript ليست سلاسل نصّية ضمن علامات اقتباس، إضافة إلى أنّه يمكن استخدام الدوال كقيم في هذه الكائنات.
</p>

<p>
	لنأخذ المثال التالي لكائن JavaScript الخاص بالمستخدم Sammy Shark والمتّصل حاليًا بالإنترنت:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs javascript"><span class="pln">    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> user </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        first_name</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Sammy"</span></span><span class="pun">,</span><span class="pln">
        last_name </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Shark"</span></span><span class="pun">,</span><span class="pln">
        online    </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">true</span></span><span class="pun">,</span><span class="pln">
        full_name </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-function"><span class="hljs-keyword"><span class="kwd">function</span></span><span class="hljs-params"><span class="pun">()</span></span><span class="pln"> </span><span class="pun">{</span></span><span class="pln">
           </span><span class="hljs-keyword"><span class="kwd">return</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">first_name </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">" "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">this</span></span><span class="pun">.</span><span class="pln">last_name</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">};</span></code></pre>

<p>
	من الواضح جدًّا أن هذا الكائن مشابه جدًّا لكائن JSON، ولكن لا وجود لعلامات الاقتباس حول أيٍّ من المفاتيح (<code>first_name</code>, <code>last_name</code>, <code>online</code>, أو <code>full_name</code>)، إضافة إلى أنّ قيمة المفتاح الأخير عبارة عن دالّة.
</p>

<p>
	يمكن استخدام التنويت النقطي للوصول إلى البيانات الموجودة في كائن JavaScript السابق، فلاستدعاء قيمة الاسم الأول نستخدم الصيغة: <code>user.first_name</code> وسنحصل على سلسلة نصّية، أما لو أردنا الوصول إلى الاسم الكامل، ونظرًا لكون القيمة دالّة، فستكون صيغة الاستدعاء بالصورة التالية: <code>user.full_name()</code>.
</p>

<p>
	كائنات JavaScript موجودة فقط ضمن هذه اللغة، لذا إن كنت بحاجة للوصول إلى البيانات عن طريق لغات برمجية أخرى، فعليك حينئذ استخدام JSON لتخزين البيانات.
</p>

<h2 id="الوصول-إلى-بيانات-json">
	الوصول إلى بيانات JSON
</h2>

<p>
	يمكن الوصول إلى بيانات JSON بنفس الطريقة المتّبعة في كائنات JavaScript، ولتوضيح ذلك لاحظ المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs cs"><span class="pln">    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> sammy </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
      </span><span class="hljs-string"><span class="str">"first_name"</span></span><span class="pln">  </span><span class="pun">:</span><span class="pln">  </span><span class="hljs-string"><span class="str">"Sammy"</span></span><span class="pun">,</span><span class="pln"> 
      </span><span class="hljs-string"><span class="str">"last_name"</span></span><span class="pln">   </span><span class="pun">:</span><span class="pln">  </span><span class="hljs-string"><span class="str">"Shark"</span></span><span class="pun">,</span><span class="pln"> 
      </span><span class="hljs-string"><span class="str">"online"</span></span><span class="pln">      </span><span class="pun">:</span><span class="pln">  </span><span class="hljs-keyword"><span class="kwd">true</span></span><span class="pln"> 
    </span><span class="pun">}</span></code></pre>

<p>
	لتتمكن من الوصول إلى أيّ من القيم السابقة يمكن استخدام التنويت النقطي بالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs avrasm"><span class="pln">    sammy</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">first</span></span><span class="pln">_name
    sammy</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">last</span></span><span class="pln">_name
    sammy</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">online</span></span></code></pre>

<p>
	يأتي اسم المتغير <code>sammy</code> في البداية متبوعًا بنقطة متبوعة بالمفتاح الذي ترغب في الوصول إليه.
</p>

<p>
	فمثلًا، لإطلاق مربع تنبيه يعرض القيمة المرتبطة بالمفتاح <code>first_name</code> يمكن استدعاء دالّة <code>alert()</code> في JavaScript بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs avrasm"><span class="pln">    alert</span><span class="pun">(</span><span class="pln">sammy</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">first</span></span><span class="pln">_name</span><span class="pun">)</span><span class="hljs-comment"><span class="pun">;</span></span><span class="pln">

    </span><span class="typ">Output</span><span class="pln">

    </span><span class="typ">Sammy</span></code></pre>

<p>
	كذلك يمكن استخدام الأقواس المربعة <code>[]</code> للوصول إلى البيانات في JSON، وذلك بكتابة اسم المفتاح ضمن علامتي اقتباس محاطًا بقوسين مربعين. فيصبح المثال السابق بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs bash"><span class="pln">    alert</span><span class="pun">(</span><span class="pln">sammy</span><span class="pun">[</span><span class="hljs-string"><span class="str">"online"</span></span><span class="pun">]);</span><span class="pln">

    </span><span class="typ">Output</span><span class="pln">

    </span><span class="hljs-literal"><span class="kwd">true</span></span></code></pre>

<p>
	وفي حال استخدام المصفوفات المتشعبة Nested Arrays يجب حينئذ استدعاء رقم العنصر ضمن المصفوفة. لنأخذ المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs cs"><span class="pln">    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> user_profile </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> 
      </span><span class="hljs-string"><span class="str">"username"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"SammyShark"</span></span><span class="pun">,</span><span class="pln">
      </span><span class="hljs-string"><span class="str">"social_media"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
          </span><span class="hljs-string"><span class="str">"description"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"twitter"</span></span><span class="pun">,</span><span class="pln">
          </span><span class="hljs-string"><span class="str">"link"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"https://twitter.com/digitalocean"</span></span><span class="pln">
        </span><span class="pun">},</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
          </span><span class="hljs-string"><span class="str">"description"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"facebook"</span></span><span class="pun">,</span><span class="pln">
          </span><span class="hljs-string"><span class="str">"link"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"https://www.facebook.com/DigitalOceanCloudHosting"</span></span><span class="pln">
        </span><span class="pun">},</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
          </span><span class="hljs-string"><span class="str">"description"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"github"</span></span><span class="pun">,</span><span class="pln">
          </span><span class="hljs-string"><span class="str">"link"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"https://github.com/digitalocean"</span></span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
      </span><span class="pun">]</span><span class="pln">
    </span><span class="pun">}</span></code></pre>

<p>
	لتتمكن من الوصول إلى السلسلة النصية <code>facebook</code> يجب عليك استدعاء العنصر ضمن المصفوفة مع استخدام النقطة وبالصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs avrasm"><span class="pln">    alert</span><span class="pun">(</span><span class="pln">user_profile</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">social</span></span><span class="pln">_media</span><span class="pun">[</span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">]</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">description</span></span><span class="pun">)</span><span class="hljs-comment"><span class="pun">;</span></span><span class="pln">


    </span><span class="typ">Output</span><span class="pln">

    facebook</span></code></pre>

<p>
	لاحظ أنّنا نستخدم نقطة إضافية للوصول إلى العنصر المتشعّب ضمن المصفوفة.
</p>

<h2 id="بعض-الدوال-التي-تساعد-في-التعامل-مع-json">
	بعض الدوال التي تساعد في التعامل مع JSON
</h2>

<p>
	سنستعرض دالّتين مهمّتين في التعامل مع بيانات JSON، الأولى تعمل على تحويل البيانات إلى سلاسل نصية والأخرى تقوم بتحليلها. إن إمكانية تحويل JSON من كائن إلى سلسلة نصّية مفيد جدًّا في تحويل البيانات وتخزينها.
</p>

<h3 id="jsonstringify">
	JSON.stringify()
</h3>

<p>
	تحوّل هذه الدالة الكائن إلى سلسلة JSON نصية.
</p>

<p>
	يمكن الاستفادة من السلاسل النصّية لتحويل البيانات من العميل إلى الخادوم وذلك من خلال خزن المعلومات أو تمريرها بصورة سهلة وسريعة. فعلى سبيل المثال، يمكنك مثلًا الحصول على الإعدادات الخاصّة بالمستخدم من طرف العميل ثم إرسالها إلى الخادوم، وفي وقت لاحق يمكنك قراءة تلك المعلومات وتحليلها بواسطة دالّة <code>JSON.parse()</code> واستخدام البيانات حسب الحاجة.
</p>

<p>
	في المثال التالي نسند كائن JSON إلى المتغير <code>obj</code>، ثم نحوّله إلى سلسلة نصية من خلال تمريره إلى الدالة <code>JSON.stringify()</code> وإسناد القيمة إلى المتغيّر <code>s</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs javascript"><span class="pln">    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="hljs-string"><span class="str">"first_name"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Sammy"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"last_name"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Shark"</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">"location"</span></span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="str">"Ocean"</span></span><span class="pun">}</span><span class="pln">

    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">JSON</span></span><span class="pun">.</span><span class="pln">stringify</span><span class="pun">(</span><span class="pln">obj</span><span class="pun">)</span></code></pre>

<p>
	والآن يمكن التعامل مع المتغيّر <code>s</code> والذي يضمّ معلومات JSON على هيئة سلسلة نصّية.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs scilab"><span class="pln">    </span><span class="hljs-string"><span class="str">'{"</span></span><span class="str">first_name</span><span class="hljs-string"><span class="str">" : "</span></span><span class="str">Sammy</span><span class="hljs-string"><span class="str">", "</span></span><span class="str">last_name</span><span class="hljs-string"><span class="str">" : "</span></span><span class="str">Shark</span><span class="hljs-string"><span class="str">", "</span></span><span class="str">location</span><span class="hljs-string"><span class="str">" : "</span></span><span class="str">Ocean</span><span class="hljs-string"><span class="str">"}'</span></span></code></pre>

<h3 id="jsonparse">
	JSON.parse()
</h3>

<p>
	قلنا أنّ السلاسل النصية مفيدة في نقل المعلومات، ولكن يجب أن تتوفّر إمكانية تحويل هذه السلاسل مرّة أخرى إلى كائنات JSON سواء من طرف العميل أو الخادوم. يمكن تحويل السلال النصّية إلى كائنات باستخدام الدالة <code>eval()</code> ولكن هذه الطريقة غير آمنة، لذا سنستخدم الدالة <code>JSON.parse()</code> بدلًا عنها.
</p>

<p>
	لتحويل السلسلة النصّية في المثال السابق إلى كائن JSON نقوم بتمرير المتغيّر <code>s</code> إلى الدالّة وإسناد القيمة المستحصلة إلى متغيّر جديد:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs javascript"><span class="pln">    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> o </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">JSON</span></span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span></code></pre>

<p>
	أصبح لدينا الآن الكائن <code>o</code> وهو مطابق تمامًا للعنصر <code>obj</code>.
</p>

<p>
	لتوضيح الفكرة بشكل أكبر سنأخذ المثال التالي والذي نستخدم فيه دالة <code>JSON.parse()</code> في ملف HMTL.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5065_7" style="">
<code class="hljs xml"><span class="pln">    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">p</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">id</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"user"</span></span><span class="tag">&gt;</span></span><span class="pln">Name: Sammy Shark</span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">br</span></span><span class="tag">&gt;</span></span><span class="pln">Location: Ocean</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">p</span></span><span class="tag">&gt;</span></span><span class="pln">

    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">script</span></span><span class="tag">&gt;</span></span><span class="javascript"><span class="pln">
    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> s </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">'{"first_name" : "Sammy", "last_name" : "Shark", "location" : "Ocean"}'</span></span><span class="pun">;</span><span class="pln">

    </span><span class="hljs-keyword"><span class="kwd">var</span></span><span class="pln"> obj </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">JSON</span></span><span class="pun">.</span><span class="pln">parse</span><span class="pun">(</span><span class="pln">s</span><span class="pun">);</span><span class="pln">

    document</span><span class="pun">.</span><span class="pln">getElementById</span><span class="pun">(</span><span class="hljs-string"><span class="str">"user"</span></span><span class="pun">).</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln">
    </span><span class="hljs-string"><span class="str">"Name: "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> obj</span><span class="pun">.</span><span class="pln">first_name </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">" "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> obj</span><span class="pun">.</span><span class="pln">last_name </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">"&lt;br&gt;"</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln">
    </span><span class="hljs-string"><span class="str">"Location: "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> obj</span><span class="pun">.</span><span class="pln">location</span><span class="pun">;</span><span class="pln">
    </span></span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">script</span></span><span class="tag">&gt;</span></span><span class="pln">


    Output

    Name: Sammy Shark
    Location: Ocean</span></code></pre>

<p>
	لاحظ كيف حوّلنا السلسلة النصّية <code>s</code> إلى كائن JSON يمكن استدعاء القيم التي يتضمّنها وتصييرها على صفحة الإنترنت.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	JSON هي الصيغة الافتراضية التي تستخدم في JavaScript ويمكن تضمين هذه الصيغة في العديد من اللغات البرمجية الشائعة. ويمكنك الاطلاع على اللغات التي تدعم هذه الصيغة من خلال <a href="http://www.json.org/" rel="external nofollow">الموقع الإلكتروني الخاص بهذه الصيغة</a>.
</p>

<p>
	ونظرًا لصغر حجم JSON وسهولة نقل المعلومات بين لغات البرمجة والأنظمة المختلفة، تستخدم هذه الصيغة بصورة واسعة في الواجهات البرمجية APIs، مثل واجهة Twitter البرمجية.
</p>

<p>
	تجدر الإشارة إلى أنّك لن تنشئ ملفات <code>.json</code> بنفسك على الأغلب بل ستحصل عليها من مصادر أخرى، مثل <a href="https://academy.hsoub.com/programming/javascript/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%85%D9%84%D9%81%D8%A7%D8%AA-csv-%D8%A8%D9%88%D8%A7%D8%B3%D8%B7%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r521/" rel="">ملفات CSV</a> التي تستخدم لتخزين البيانات المجدولة، أو ملفات XML أو غيرها.
</p>

<p>
	وسواء أكتبت JSON بنفسك أو حصلت عليها من مصدر آخر، يمكن التأكد من صحّة الصيغة التي كتبتها باستخدام الأداة <a href="https://jsonlint.com/" rel="external nofollow">JSONLint</a>.
</p>

<p>
	ترجمة - وبتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-work-with-json-in-javascript" rel="external nofollow">How To Work with JSON in JavaScript</a> لصاحبته Lisa Tagliaferri.
</p>
]]></description><guid isPermaLink="false">548</guid><pubDate>Thu, 19 Oct 2017 06:19:38 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x633;&#x62A;&#x62E;&#x62F;&#x645; &#x623;&#x62F;&#x648;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x637;&#x648;&#x650;&#x651;&#x631; &#x641;&#x64A; &#x627;&#x644;&#x645;&#x62A;&#x635;&#x641;&#x62D;&#x627;&#x62A; &#x627;&#x644;&#x62D;&#x62F;&#x64A;&#x62B;&#x629;</title><link>https://academy.hsoub.com/programming/javascript/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B7%D9%88%D9%90%D9%91%D8%B1-%D9%81%D9%8A-%D8%A7%D9%84%D9%85%D8%AA%D8%B5%D9%81%D8%AD%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB%D8%A9-r541/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/59d2796ba9825_main(63).png.4a123c676c14ccd0287c102d07533f52.png" /></p>

<p>
	تملك المتصفحات الحديثة أدوات تطوير مبينة فيها للتعامل مع لغة JavaScript وتقنيات الويب الأخرى، وهذه الأدوات تتضمن سطر الأوامر (Console) الذي يشبه سطر الأوامر الخاص بأنظمة يونكس، إضافةً إلى أدواتٍ لتفحص (inspect) شجرة DOM، وأدوات للتنقيح (debugging)، وتحليل نشاط الشبكة.<br>
	يمكن استخدام سطر الأوامر (Console) لإنشاء سجل من المعلومات كجزءٍ من عملية تطوير تطبيقات JavaScript، ويسمح لك بالتفاعل مع صفحة الويب بتنفيذ تعليمات JavaScript على عناصر الصفحة. وهذا يعني أنَّ سطر الأوامر يسمح لك بكتابة وإدارة ومراقبة شيفرات JavaScript عند الحاجة.<br>
	سنشرح في هذا الدرس كيفية التعامل مع سطر الأوامر باستعمال JavaScript في المتصفحات، وسنعطي لمحة عن أدوات التطوير الأخرى المبنية في المتصفحات والتي يمكنك استعمالها في عملية تطوير تطبيقات الويب.
</p>

<h2 id="العمل-مع-سطر-الأوامر-console-في-المتصفح">
	العمل مع سطر الأوامر (Console) في المتصفح
</h2>

<p>
	أغلبية متصفحات الويب الحديثة التي تدعم لغة HTML و XHTML القياسية ستوفِّر لك وصولًا إلى سطر أوامر الذي يمكنك استخدامه (عبر لغة JavaScript) بما يشبه طريقة استخدام الطرفية (terminal) في أنظمة يونكس.<br>
	سنشرح الآن كيفية الوصول إلى سطر الأوامر في متصفحَي Firefox و Chrome.
</p>

<h3 id="متصفح-firefox">
	متصفح Firefox
</h3>

<p>
	لفتح <a href="https://developer.mozilla.org/en-US/docs/Tools/Web_Console" rel="external nofollow">Web Console</a> في متصفح Firefox، فاضغط على زر القائمة ☰ في الزاوية العليا اليمنى بجوار شريط العنوان.<br>
	ثم اضغط على زر Developer الذي يقع تحت أيقونة المفك، والذي سيفتح قائمة Web Developer، ومن ثم اضغط على خيار Web Console.
</p>

<p style="text-align: center;">
	<img alt="1-firefox-web-console-menu.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25100" data-unique="klqkxsomf" src="https://academy.hsoub.com/uploads/monthly_2017_10/1-firefox-web-console-menu.png.cc33f4a38cd04bd7f3a4863a26145185.png"></p>

<p>
	وهذا سيفتح لوحةً في أسفل نافذة المتصفح:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25101" href="https://academy.hsoub.com/uploads/monthly_2017_10/2-firefox-web-console-tray.png.498f2685781fbe0fc4d57c56a2236b04.png" rel=""><img alt="2-firefox-web-console-tray.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25101" data-unique="7vuxwt3my" src="https://academy.hsoub.com/uploads/monthly_2017_10/2-firefox-web-console-tray.thumb.png.68e6e44ff2e0a95306712c575aaedbba.png"></a>
</p>

<p>
	يمكنك أيضًا الدخول إلى سطر الأوامر عبر اختصار لوحة المفاتيح Ctrl+Shift+K على نظامَي لينكس وويندوز، أو Command+Option+K على ماك.<br>
	يمكننا التفاعل مع سطر الأوامر باستخدام JavaScript بعد أن استطعنا فتحه.
</p>

<h3 id="متصفح-chrome">
	متصفح Chrome
</h3>

<p>
	لفتح <a href="https://developers.google.com/web/tools/chrome-devtools/console/" rel="external nofollow">JavaScript Console</a> في متصفح Chrome فيمكنك النقر على القائمة في الزاوية العليا اليمنى من نافذة المتصفح (التي يُرمَز لها بثلاث نقط عمودية) ومن ثم اختيار More Tools ثم Developer Tools.
</p>

<p style="text-align: center;">
	<img alt="3-chrome-developer-tools-menu.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25102" data-unique="w8e8nfxpm" src="https://academy.hsoub.com/uploads/monthly_2017_10/3-chrome-developer-tools-menu.png.db9f7fbdade3d705a8d58dc87ded1d0b.png"></p>

<p>
	ستُفتح لوحةٌ جديدة فيها اللسان Console في الشريط العلوي الذي عليك أن تضغط عليه للوصول إلى سطر الأوامر (هذا إن لم يكن هذا اللسان مفعّلًا من البداية):
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25103" href="https://academy.hsoub.com/uploads/monthly_2017_10/4-chrome-console-tray.png.ef76fcbd2ba1c1787ffd7da4e72bdbfb.png" rel=""><img alt="4-chrome-console-tray.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25103" data-unique="fwogkup0n" src="https://academy.hsoub.com/uploads/monthly_2017_10/4-chrome-console-tray.thumb.png.f5b3e3138bf31d74ebe7d7b0ab719465.png"></a>
</p>

<p>
	يمكنك أيضًا الوصول إلى سطر الأوامر بالضغط على اختصار لوحة المفاتيح Ctrl+Shif+J في نظامَي لينكس وويندوز، أو Command+Option+J في نظام ماك، وهذا سيؤدي إلى فتح لسان Console مباشرةً.<br>
	يمكننا التفاعل مع سطر الأوامر باستخدام JavaScript بعد أن استطعنا فتحه.
</p>

<h2 id="التعامل-مع-سطر-الأوامر">
	التعامل مع سطر الأوامر
</h2>

<p>
	يمكنك كتابة شيفرات JavaScript داخل سطر الأوامر.<br>
	لنبدأ بإظهار تحذير يحتوي على السلسلة النصية <code>Hello, World!‎</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<span class="pln">alert</span><span class="pun">(</span><span class="str">"Hello, World!"</span><span class="pun">);</span></pre>

<p>
	بعد أن تضغط على زر Enter بعد كتابة سطر JavaScript السابق، فيمكن أن تشاهد نافذة التحذير الآتية في متصفحك:
</p>

<p style="text-align: center;">
	<img alt="5-javascript-alert.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25104" data-unique="bgojsnq8y" src="https://academy.hsoub.com/uploads/monthly_2017_10/5-javascript-alert.png.5a0e0c93346f42d430fc10a281db3c75.png"></p>

<p>
	ملاحظة: سيُظهِر سطر الأوامر نتيجة تنفيذ التعابير البرمجية، وسيُظهِر <code>undefined</code> إذا لم تتم إعادة (return) قيمة من التعبير المُنفَّذ.<br>
	بدلًا من عرض نوافذ تحذير التي علينا الضغط على زر OK للخروج منها، يمكننا معرفة ناتج تعابير JavaScript بطباعتها إلى سطر الأوامر عبر الدالة <code>console.log</code>.<br>
	فلو أردنا طباعة السلسلة النصية <code>Hello, World!‎</code> سنكتب التعبير البرمجي الآتي في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs rust"><span class="pln">console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"Hello, World!"</span></span><span class="pun">);</span></code></pre>

<p>
	وسيُطبَع السطر الآتي في نافذة سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs erlang-repl"><span class="hljs-variable"><span class="typ">Hello</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-variable"><span class="typ">World</span></span><span class="hljs-exclamation_mark"><span class="pun">!</span></span><span class="pun">‎</span></code></pre>

<p>
	يمكننا استخدام JavaScript لإجراء حسابات رياضية في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs rust"><span class="pln">console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-number"><span class="lit">6</span></span><span class="pun">);</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs "><span class="lit">8</span></code></pre>

<p>
	وسيستطيع المتصفح إجراء حسابات على أرقام أكبر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs rust"><span class="pln">console</span><span class="pun">.</span><span class="hljs-keyword"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-number"><span class="lit">34348.2342343403285953845</span></span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="hljs-number"><span class="lit">4310.23409128534</span></span><span class="pun">);</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs "><span class="lit">148048930.17230788</span></code></pre>

<p>
	لا تغفل عن إمكانية إجراء عمليات مُقسَّمة على أكثر من سطر عبر استعمال المتغيرات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs vbscript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Date</span></span><span class="pun">();</span><span class="pln">
console</span><span class="pun">.</span><span class="hljs-built_in"><span class="pln">log</span></span><span class="pun">(</span><span class="hljs-string"><span class="str">"Today's date is "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> d</span><span class="pun">);</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs vhdl"><span class="typ">Today</span><span class="hljs-attribute"><span class="str">'s</span></span><span class="str"> date </span><span class="hljs-keyword"><span class="str">is</span></span><span class="str"> Wed Jun </span><span class="hljs-number"><span class="str">21</span></span><span class="str"> </span><span class="hljs-number"><span class="str">2017</span></span><span class="str"> </span><span class="hljs-number"><span class="str">15</span></span><span class="str">:</span><span class="hljs-number"><span class="str">49</span></span><span class="str">:</span><span class="hljs-number"><span class="str">47</span></span><span class="str"> GMT-</span><span class="hljs-number"><span class="str">0400</span></span><span class="str"> (EDT)</span></code></pre>

<p>
	إذا أردتَ تعديل التعبير الذي كتبته في سطر الأوامر، فاضغط على زر السهم العلوي ↑ في لوحة مفاتيحك للحصول على السطر السابق، وهذا ما يسمح لك بتعديله ثم تنفيذه مجددًا.<br>
	يوفر لك سطر أوامر المتصفح القدرة على تجربة شيفرات JavaScript في الوقت الحقيقي بما يشبه واجهة سطر الأوامر في أنظمة يونكس.
</p>

<h2 id="التعامل-مع-ملف-html">
	التعامل مع ملف HTML
</h2>

<p>
	يمكنك أيضًا إجراء عمليات على ملف HTML موجود مسبقًا أو على مستند مولّد ديناميكيًا عبر سطر الأوامر؛ وهذا يسمح لنا بتجربة كيفية تعامل شيفرات JavaScript مع عناصر HTML وقواعد CSS وسكربتات JavaScript الموجودة في صفحة الويب.<br>
	أبقِ في ذهنك أنّك إذا أعدتَ تحميل الصفحة بعد تعديلها في سطر الأوامر فستعود إلى حالتها الأصلية قبل التعديل، ولذا احرص على حفظ أيّة تعديلات تريد الإبقاء عليها.<br>
	لنحفظ مستند HTML الآتي باسم <code>index.html</code> لكي نجِّرب تعديلها عبر سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs xml"><span class="hljs-doctype"><span class="dec">&lt;!DOCTYPE html&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">html</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">lang</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"en-US"</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">head</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">meta</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">charset</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"UTF-8"</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">meta</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">name</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"viewport"</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="atn">content</span></span><span class="pun">=</span><span class="hljs-value"><span class="atv">"width=device-width, initial-scale=1"</span></span><span class="tag">&gt;</span></span><span class="pln">
    </span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">title</span></span><span class="tag">&gt;</span></span><span class="pln">Today's Date</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">title</span></span><span class="tag">&gt;</span></span><span class="pln">
</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">head</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="hljs-tag"><span class="tag">&lt;</span><span class="hljs-title"><span class="tag">body</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">body</span></span><span class="tag">&gt;</span></span><span class="pln">

</span><span class="hljs-tag"><span class="tag">&lt;/</span><span class="hljs-title"><span class="tag">html</span></span><span class="tag">&gt;</span></span></code></pre>

<p>
	إذا حفظتَ مستند HTML السابق في ملفٍ ما وفتحتَه باستخدام متصفحك المفضّل فيجب أن تشاهد صفحةً فارغةً عنوانها «Today’s Date».<br>
	يمكنك الآن فتح سطر الأوامر لاستعمال JavaScript لتعديل الصفحة، وسنبدأ بكتابة شيفرة JavaScript لإضافة ترويسة في الصفحة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">new</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Date</span></span><span class="pun">();</span><span class="pln">
document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">innerHTML </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"&lt;h1&gt;Today's date is "</span></span><span class="pln"> </span><span class="pun">+</span><span class="pln"> d </span><span class="pun">+</span><span class="pln"> </span><span class="hljs-string"><span class="str">"&lt;/h1&gt;"</span></span></code></pre>

<p>
	ستحصل على الناتج الآتي في سطر الأوامر:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs xml"><span class="str">"</span><span class="hljs-tag"><span class="str">&lt;</span><span class="hljs-title"><span class="str">h1</span></span><span class="str">&gt;</span></span><span class="str">Today's date is Sat Jun 24 2017 12:16:14 GMT-0400 (EDT)</span><span class="hljs-tag"><span class="str">&lt;/</span><span class="hljs-title"><span class="str">h1</span></span><span class="str">&gt;</span></span><span class="str">"</span></code></pre>

<p>
	يجب أن تبدو الصفحة الآن كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25105" href="https://academy.hsoub.com/uploads/monthly_2017_10/6-javascript-console-plain.png.cf3394fb1aa2ccc378be6657a1e8945c.png" rel=""><img alt="6-javascript-console-plain.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25105" data-unique="2qhjck3i4" src="https://academy.hsoub.com/uploads/monthly_2017_10/6-javascript-console-plain.thumb.png.b40f39f54c93b4a98c22314156a3515c.png"></a>
</p>

<p>
	يمكنك أيضًا تعديل أنماط الصفحة، مثل لون الخلفية:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs avrasm"><span class="pln">document</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">body</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">style</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">backgroundColor</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"lightblue"</span></span><span class="hljs-comment"><span class="pun">;</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs bash"><span class="hljs-string"><span class="str">"lightblue"</span></span></code></pre>

<p>
	وكذلك الأمر مع لون النص في الصفحة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs avrasm"><span class="pln">document</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">body</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">style</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">color</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-string"><span class="str">"white"</span></span><span class="hljs-comment"><span class="pun">;</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs bash"><span class="hljs-string"><span class="str">"white"</span></span></code></pre>

<p>
	يجب أن تبدو الصفحة الآن كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25106" href="https://academy.hsoub.com/uploads/monthly_2017_10/7-javascript-console-style.png.644598e8a92b4996566652e728a56436.png" rel=""><img alt="7-javascript-console-style.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25106" data-unique="kfcv5qh38" src="https://academy.hsoub.com/uploads/monthly_2017_10/7-javascript-console-style.thumb.png.b6ae109e892bcd2f9c636fd06a373a0a.png"></a>
</p>

<p>
	يمكنك أيضًا إنشاء فقرة جديدة عبر العنصر <code>&lt;p&gt;</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> p </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">document</span></span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="hljs-string"><span class="str">"P"</span></span><span class="pun">);</span></code></pre>

<p>
	بعد إنشاء العنصر، حان الوقت لإضافة عقدة نصية (text node) التي يمكننا إضافتها إلى الفقرة الجديدة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs coffeescript"><span class="hljs-reserved"><span class="kwd">let</span></span><span class="pln"> t </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">document</span></span><span class="pun">.</span><span class="pln">createTextNode</span><span class="pun">(</span><span class="hljs-string"><span class="str">"Paragraph text."</span></span><span class="pun">);</span></code></pre>

<p>
	سنضيفها الآن إلى الفقرة المُعرَّفة عبر المتغير <code>p</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs avrasm"><span class="pln">p</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">appendChild</span></span><span class="pun">(</span><span class="pln">t</span><span class="pun">)</span><span class="hljs-comment"><span class="pun">;</span></span></code></pre>

<p>
	وأخيرًا سنضيف الفقرة المُخزَّنة في المتغير <code>p</code> والنص الموجود فيها إلى المستند:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_5003_7" style="">
<code class="hljs avrasm"><span class="pln">document</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">body</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">appendChild</span></span><span class="pun">(</span><span class="pln">p</span><span class="pun">)</span><span class="hljs-comment"><span class="pun">;</span></span></code></pre>

<p>
	إذا أكملتَ الخطوات السابقة، فيجب أن تبدو صفحة HTML السابقة كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25107" href="https://academy.hsoub.com/uploads/monthly_2017_10/8-javascript-console-with-paragraph.png.24d99121207b178ccc3186a4b6ca56d6.png" rel=""><img alt="8-javascript-console-with-paragraph.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25107" data-unique="czv44ceev" src="https://academy.hsoub.com/uploads/monthly_2017_10/8-javascript-console-with-paragraph.thumb.png.1487b18546d08a3352bce8997fd241f1.png"></a>
</p>

<p>
	يوفِّر لنا سطر الأوامر البيئة المناسبة لإجراء تجرب على صفحات HTML، لكن من المهم أن نبقي في ذهننا أنَّنا لا نعدل مستند HTML فعليًا عندما ننفذ التعليمات البرمجية في سطر الأوامر، وإنما ستذهب جميع تعديلاتنا إذا أعدنا تحديث الصفحة.
</p>

<h2 id="لمحة-عن-أدوات-التطوير-الأخرى">
	لمحة عن أدوات التطوير الأخرى
</h2>

<p>
	اعتمادًا على أدوات المطوِّر التي يوفرها متصفحك، فستقدر على استخدام أدوات أخرى لمساعدتك في عملية تطوير الويب، لنطلع على تلك الأدوات.
</p>

<h3 id="عرض-شجرة-dom">
	عرض شجرة DOM
</h3>

<p>
	في كل مرة يتم فيها تحميل صفحة الويب، فسيُنشِئ المتصفح ما يسمى شجرة DOM (اختصار للعبارة Document Object Model) للصفحة.<br>
	شجرة DOM تتألف من كائنات التي تُمثِّل عناصر HTML ضمن البنية الهرمية للعناصر. وشجرة DOM متاحة ضمن لسان <a href="https://developer.mozilla.org/en-US/docs/Tools/Page_Inspector" rel="external nofollow">Inspector</a> في متصفح Firefox أو لسان <a href="https://developers.google.com/web/tools/chrome-devtools/inspect-styles/" rel="external nofollow">Elements</a> في متصفح Chrome.<br>
	تسمح لك هذه الأدوات بعرض وتعديل عناصر DOM وتسمح لك بمعرفة ما هي وسوم HTML المسؤولة عن عرض جزء معيّن من الصفحة. ويمكن أيضًا من هذا اللسان معرفة ما هي قيمة المعرِّف ID لصورةٍ معيّنةٍ على سبيل المثال.<br>
	ستكون بنية الصفحة التي عدلناها (وقبل إعادة تحميل الصفحة) في لسان DOM كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25108" href="https://academy.hsoub.com/uploads/monthly_2017_10/9-javascript-dom-example.png.84d2d1d6a84e9ef63222f8bdbc7d797e.png" rel=""><img alt="9-javascript-dom-example.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25108" data-unique="00vui6cbg" src="https://academy.hsoub.com/uploads/monthly_2017_10/9-javascript-dom-example.thumb.png.b44a39a266b54652bbdc6211500d92e3.png"></a>
</p>

<p>
	يمكنك أيضًا رؤية ما هي قواعد CSS المطبقة في لوحة جانبية بجوار اللسان الذي يعرض بنية شجرة DOM، مما يسمح لك بمعرفة ما هي الأنماط المُطبّقة على عنصر DOM داخل مستند HTML أو عبر ملف أنماط CSS خارجي.<br>
	هذه صورةٌ تظهر أنماط العنصر body في أدوات المطوِّر في Firefox:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25109" href="https://academy.hsoub.com/uploads/monthly_2017_10/10-javascript-css-example.png.800fb887c5746908d30e8e77a6c3a84a.png" rel=""><img alt="10-javascript-css-example.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25109" data-unique="drxrru1oc" src="https://academy.hsoub.com/uploads/monthly_2017_10/10-javascript-css-example.thumb.png.63ef7c2357bec07705bac29fdc5f1be0.png"></a>
</p>

<p>
	لتعديل عقدة من عقد DOM فانقر نقرًا مزدوجًا فوق العنصر المُحدَّد وأجرِ التعديلات اللازمة، فحاول مثلًا أن تحوِّل العنصر <code>&lt;h1&gt;</code> إلى <code>&lt;h2&gt;</code>.<br>
	تذكَّر أنَّ الصفحة ستعود إلى حالتها الأصلية المحفوظة إذا أعدت تحميلها.
</p>

<h3 id="لسان-الشبكة">
	لسان الشبكة
</h3>

<p>
	يمكن في لسان الشبكة Network في أدوات المطوِّر الموجودة في متصفحك أن تراقب وتسجِّل الطلبيات الشبكية، إذ يُظهِر هذا اللسان جميع الطلبيات الشبكية التي يجريها المتصفح بما في ذلك ما طَلَبَهُ عند تحميل الصفحة، وكم استغرقت كل طلبية من الوقت، وسيوفِّر تفاصيل عن كل طلبية؛ وهذا سيساعد كثيرًا في معرفة سبل تحسين أداء الصفحة وتسريع تحميلها وتنقيح مشاكل الشبكة.<br>
	يمكنك استخدام لسان الشبكة جنبًا إلى جنب مع سطر الأوامر، أي يمكنك بدء عملية تنقيح (debug) الصفحة في سطر الأوامر ثم الانتقال إلى لسان الشبكة لرؤية النشاطات الشبكية دون إعادة تحميل الصفحة.<br>
	لتعلّم المزيد حول لسان الشبكة، فأنصحك بقراء <a href="https://developer.mozilla.org/en-US/docs/Tools/Network_Monitor" rel="external nofollow">working with Firefox’s Network Monitor</a> أو <a href="https://developers.google.com/web/tools/chrome-devtools/network-performance/" rel="external nofollow">getting started with analyzing Network performance with Chrome’s DevTools</a>.
</p>

<h3 id="التصميم-المتجاوب">
	التصميم المتجاوب
</h3>

<p>
	عندما يكون موقع الويب متجاوبًا (responsive)، فهذا يعني أنَّه صُمِّمَ وطوِّرَ لكي يظهر ويعمل بشكل مناسب على مجال واسع من الأجهزة المختلفة مثل الهواتف المحمولة والحواسيب اللوحية والحواسيب المكتبة والمحمولة.<br>
	قياس الشاشة وكثافة البكسلات ودعم اللمس هي عوامل مهمة يجب أخذها بالحسبان عند تطوير مواقع متجاوبة، ويجب عليك –كمطور ويب– أن تفكر في مبادئ التصميم المتجاوب عند إنشاء المواقع لإتاحتها للآخرين بغض النظر عن الجهاز الذي يصلون إلى موقعك عبره.<br>
	يوفر لك متصفح Firefox و Chrome أدواتٍ للتأكد من تطبيقك لمبادئ التصميم المتجاوب أثناء إنشائك وتطويرك لمواقع وتطبيقات الويب. وستتمكن بوساطة تلك الأدوات أن تحاكي مختلف الأجهزة لكي تختبر تطبيقك وتحلّل مشاكله أثناء التطوير.<br>
	اقرأ المزيد عن <a href="https://developer.mozilla.org/en-US/docs/Tools/Responsive_Design_Mode" rel="external nofollow">Responsive Design Mode</a> في متصفح Firefox أو <a href="https://developers.google.com/web/tools/chrome-devtools/device-mode/" rel="external nofollow">Device Mode</a> في Chrome لتعلم طريقة الاستفادة من تلك الأدوات لإنشاء مواقع ويب تلبي احتياجات جميع المستخدمين.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	أخذنا في هذا الدرس لمحةً عن طريقة التعامل مع سطر الأوامر الموجود في المتصفحات الحديثة، بالإضافة إلى بعض المعلومات عن أدوات التطوير التي يمكنك الاستفادة منها في عملك.<br>
	لتعلّم المزيد عن JavaScript فاقرأ كتاب <a href="http://itwadi.com/node/3002" rel="external nofollow">تعلم JavaScript</a>، وإذا كنتَ مهتمًا بمكتبة jQuery فأنصحك بالاطلاع على كتاب <a href="http://itwadi.com/jQueryEnlightenment-arabic" rel="external nofollow">تعلم jQuery</a>.
</p>

<p>
	ترجمة –وبتصرّف– للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-the-javascript-developer-console" rel="external nofollow">How To Use the JavaScript Developer Console</a> لصاحبته Lisa Tagliaferri
</p>
]]></description><guid isPermaLink="false">541</guid><pubDate>Tue, 03 Oct 2017 07:06:00 +0000</pubDate></item><item><title>&#x645;&#x627;&#x647;&#x64A; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;&#x61F; &#x623;&#x645;&#x62B;&#x644;&#x629; &#x639;&#x644;&#x649; &#x627;&#x644;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D9%85%D8%A7%D9%87%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA%D8%9F-%D8%A3%D9%85%D8%AB%D9%84%D8%A9-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D8%A7%D8%AA-r525/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/59a8480a20f64_main(10).png.116d1529e5214aba82aef609974561f5.png" /></p>

<p>
	قدّمنا في <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%D8%9F-r524/" rel="">الدرس السابق</a> جافاسكريبت وذكرنا تموضعها في الوِب بالنسبة لـHTML وCSS، كما تحدّثنا عن واجهات برمجة التطبيقات الخاصّة بالمتصفّح وتلك القادمة من طرف ثالث.
</p>

<p>
	سنبدأ في هذا الجزء من الدرس النظر في بعض التعليمات البرمجية، وأثناء ذلك، يمكنك استكشاف ما يحدث فعليًا عند تشغيل شفرة جافاسكريبت في صفحتك.
</p>

<h2 id="ما-الذي-تفعله-جافاسكريبت-على-صفحتك">
	ما الذي تفعله جافاسكريبت على صفحتك؟
</h2>

<p>
	لنلخص بإيجاز قصة ما يحدث عند تنزيل صفحة وِب في المتصفح.
</p>

<p>
	عندما يُنزّل المتصفّح الشفرة التي كتبتها، والمكوّنة من وسوم HTML، أنماط CSS وتعليمات جافاسكريبت فإنه يشغّلها داخل بيئة تنفيذ (علامة تبويب Tab في المتصفح). تشبه هذه العملية المصنع الذي يأخذ المواد الخام (الشفرة) ويُخرج المنتح (صفحة وِب).
</p>

<p style="text-align: center;">
	<img alt="01_كيف-يعمل-المتصفح.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24882" data-unique="fp5dvp3i3" src="https://academy.hsoub.com/uploads/monthly_2017_08/59a847ee15fc8_01_--.png.1e74c83cbd1a0ad4c7d8e5feee803eee.png"></p>

<p>
	يُنفّذ معالج جافاسكريبت JavaScript engine الموجود في المتصفّح تعليمات جافاسكريبت بعد أن تُجمَّع HTML وCSS وتوضعان في صفحة وِب. يضمن انتظار التجميع أنّ بنية الصفحة وتنسيقها موجودان بالفعل عند بدء تشغيل جافاسكريبت، أي أنه عند تشغيل جافاسكريبت تكون جميع تعليمات HTML وCSS موجودة ونفّذها المتصفّح.
</p>

<p>
	يعدّ هذا الأمر جيّدًا، إذ أن استخدام جافاسكريبت الشائع هو تعديل HTML و CSS ديناميكًيا لتحديث واجهة المستخدم، من خلال واجهة برمجة التطبيقات DOM التي تحدّثنا عنها في الدرس السابق؛ فإن نُزِّلت تعليمات جافاسكريبت وحاول المتصفّح تشغيلها قبل أن يكون هناك HTML و CSS فستحدث أخطاء.
</p>

<h2 id="أمان-المتصفح">
	أمان المتصفح
</h2>

<p>
	تعدّ كل علامة تبويب Tab في المتصفح دلوًا منفصلًا لتشغيل الشفرة (تسمى هذه الدلاء “بيئات التنفيذ” Execution environments من الناحية التقنية). يعني هذا أنه في معظم الحالات تُشغَّل الشفرة في كل علامة تبويب منفصلة عن الشفرات في بقية التبويبات، ولا يمكن للتعليمات البرمجية في علامة تبويب واحدة أن تؤثر مباشرة على التعليمات البرمجية في علامة تبويب أخرى - أو على موقع وِب آخر.
</p>

<p>
	هذا إجراء أمني جيد. لو لم يكن هذا هو الحال، لكان بإمكان القراصنة كتابة صفحات وِب مهمّتها سرقة المعلومات من المواقع الأخرى التي يزورها المتصفّح، وغيرها من هذه الأشياء السيئة.
</p>

<p>
	<strong>ملاحظة</strong>: هناك طرق لإرسال التعليمات البرمجية والبيانات بين مواقع وِب / علامات تبويب مختلفة بطريقة آمنة، ولكن هذه تقنيات متقدمة لن نغطيها في هذا الدرس.
</p>

<h2 id="جافاسكريبت-قيد-التشغيل">
	جافاسكريبت قيد التشغيل
</h2>

<p>
	عندما يواجه المتصفح كتلة تعليمات برمجية من جافاسكريبت، فإنه يعمل بالترتيب، من أعلى إلى أسفل. وهذا يعني أنك تحتاج إلى توخي الحذر في الترتيب الذي تضعه فيه. على سبيل المثال، في شفرة جافاسكريبت التي شاهدناها في المثال الأول:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7828_9" style="">
<span class="kwd">var</span><span class="pln"> para </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">

para</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> updateName</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> updateName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> prompt</span><span class="pun">(</span><span class="str">'Enter a new name'</span><span class="pun">);</span><span class="pln">
  para</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Player 1: '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	قمنا باختيار فقرة نصية (السطر 1)، ثم استدعينا مستمع الحدث Event listener بتطبيق التابع<code>addEventListener</code> على الفقرة النصية المُخزَّنة في المتغيّر <code>para</code> (السطر 3)؛ لذا عندما يُنقر على النص تُشغَّل كتلة التعليمات البرمجية في الدالة <code>updateName()</code>. تُسمّى كُتلة التعليمات البرمجية القابلة لإعادة الاستخدام باستدعاء اسمها “وظائف” أو “دوال” Functions. يُطلب من المستخدم اسم جديد ثم يُدرَج هذا الاسم في الفقرة لتحديث العرض.
</p>

<p>
	إذا بدّلت ترتيب أول سطرين من التعليمات البرمجية، فإن الشفرة البرمجية لن تعمل . ستحصُل بدلا من ذلك خطأ في وحدة تحكم المتصفح الخاصة بالمطورين Console: <code>-TypeError: para is undefined</code>. وهذا يعني أن الكائن <code>para</code> غير موجود بعد، لذلك لا يمكننا إضافة مستمع الحدث إليه.
</p>

<p>
	<strong>ملاحظة</strong>: هذا خطأ شائع جدًا. يجب أن تكون حذرًا أن الكائنات Objects المشار إليها في التعليمات البرمجية موجودة قبل محاولة استخدامها.
</p>

<h2 id="الفرق-بين-التعليمات-البرمجية-المفسرة-interpreted-و-المترجمة-compiled">
	الفرق بين التعليمات البرمجية المفسَّرة Interpreted و المُترجَمة Compiled
</h2>

<p>
	لابد وأنك سمعت في سياق البرمجة بمصطلحيْ التفسير Interpretation و الترجمة Compilation.
</p>

<p>
	جافاسكريبت هي لغة مفسَّرة. تُشغَّل تعليمات جافاسكريبت البرمجية من أعلى إلى أسفل وتُرجَع نتيجة تشغيل التعليمات البرمجية على الفور. لست بحاجة لتحويل التعليمات البرمجية إلى شكل مختلف قبل أن يقوم المتصفح بتشغيلها.
</p>

<p>
	من ناحية أخرى، تُحوَّل الشفرة البرمجية للغات المترجمة إلى شكل آخر قبل أن يشغّلها الحاسوب. على سبيل المثال تُجمَّع C / C ++ في لغة Assembly التي يُشغّلها الحاسوب.
</p>

<p>
	لكلّ من المنهجيْن ميزات، لكنّها خارج نطاق هذا الدرس.
</p>

<h2 id="جانب-الخادوم-server-side-و-جانب-العميل-client-side">
	جانب الخادوم Server Side و جانب العميل Client Side
</h2>

<p>
	لابد وأنك سمعت بمصطلحي من <a href="https://academy.hsoub.com/questions/1191-%D9%85%D8%A7-%D9%87%D9%88-%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%84%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%B9%D9%85%D9%8A%D9%84-client-side-%D9%88%D9%84%D8%B7%D8%B1%D9%81-%D8%A7%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-server-side-%D8%9F/" rel="">جانب الخادوم وجانب العميل</a>، خاصة في سياق تطوير الوِب:
</p>

<ul>
<li>
		<p>
			الشفرة من جانب العميل Client side هي شفرة تُشغَّل على حاسوب المستخدم. يُنزّل العميل التعليمات البرمجية التي ينفّذها المتصفّح ليعرض صفحة الوٍب. سنتحدّث في هذا الدرس عن جافاسكريبت من جانب العميل.
		</p>
	</li>
	<li>
		<p>
			من ناحية أخرى تُنفَّذ شفرة جانب الخادوم على الخادوم، ثم تُرسَل نتيجة التنفيذ إلى المتصفّح ليعرضها. مثال على لغات الوِب الشائعة من جانب الخادوم <a href="https://academy.hsoub.com/programming/php/" rel="">PHP</a> و<a href="https://academy.hsoub.com/programming/python/" rel="">بايثون</a> و<a href="https://academy.hsoub.com/programming/ruby/" rel="">روبي</a> و ASP.NET. وجافاسكريبت! يمكن أيضا استخدام جافاسكريبت كلغة من جانب الخادوم، على سبيل المثال في بيئة <a href="https://academy.hsoub.com/programming/javascript/nodejs/express/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%85%D8%AF%D9%88%D9%91%D9%86%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-nodejs-%D9%88express-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r19/" rel="">Node.js</a> الشائعة.
		</p>
	</li>
</ul>
<p>
	يُستخدم مصطلح ديناميكي Dynamic لوصف كل من جافاسكريبت من جانب العميل واللغات من جانب الخادوم. تشير كلمة ديناميكي إلى القدرة على تحديث عرض صفحة الوِب أو التطبيق لإظهار أشياء مختلفة في ظروف مختلفة، وتوليد محتوى جديد حسب الطلب.
</p>

<p>
	تُنشِئ الشفرة من جانب الخادوم ديناميكيا محتوى جديدًا على الخادوم، سحب بيانات من قاعدة بيانات على سبيل المثال؛ في حين أن جافاسكريبت من جانب العميل تُنشِئ ديناميكيا محتوى جديدًا داخل المتصفح (العميل)، على سبيل المثال إنشاء جدول HTML جديد، وإدراج البيانات المطلوبة من الخادوم في ذلك الجدول، ثم عرض الجدول في صفحة وِب للمستخدم.
</p>

<p>
	يعمل المنهجان معًا عادة. يشار إلى صفحة الوِب التي لا يوجد بها محتوى ديناميكي بأنها ثابتة Static، حيث يظهر دائما نفس المحتوى بغضّ النظر عن الزائر.
</p>

<h2 id="كيف-تضيف-جافاسكريبت-إلى-صفحتك">
	كيف تضيف جافاسكريبت إلى صفحتك؟
</h2>

<p>
	يتم تطبيق جافاسكريبت على صفحة HTML بطريقة مشابهة لـ CSS. في حين تستخدم CSS عناصر <code>&lt;link&gt;</code> لتطبيق الأنماط الخارجية وعناصر <code>&lt;style&gt;</code> لتطبيق الأنماط الداخلية على HTML، تحتاج جافاسكريبت إلى صديق واحد فقط في عالم HTML، العنصر <code>&lt;script&gt;</code>. دعونا نتعلم كيفية العمل.
</p>

<h3 id="جافاسكريبت-داخلي">
	جافاسكريبت داخلي
</h3>

<ol>
<li>
		<p>
			أنشئ مستند HTML بالمحتوى التالي
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7828_11" style="">
<span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"ar"</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"rtl"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">مثال تطبيقي لجافاسكريبت</span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">
</span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;button&gt;</span><span class="pln">انقر هنا</span><span class="tag">&lt;/button&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span><span class="pln"> </span><span class="tag">&lt;/html&gt;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			استعرض الملف في متصفح الوِب وفي محرر النصوص. سترى أن HTML أنشأت صفحة وِب بسيطة تحتوي على زر قابل للنقر.
		</p>
	</li>
	<li>
		<p>
			بعد ذلك، انتقل إلى محرر النصوص وأضف ما يلي مباشرة قبل وسم الإغلاق <code>&lt;body/&gt;</code>:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7828_13" style="">
<span class="pln">    </span><span class="tag">&lt;script&gt;</span><span class="pln">     
    </span><span class="com">// سنضع تعليمات جافاسكريبت هنا</span><span class="pln">
    </span><span class="tag">&lt;/script&gt;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			سنضيف الآن بعض جافاسكريبت داخل عنصر <code>&lt;script&gt;</code> لجعل الصفحة تفعل شيئا أكثر إثارة للاهتمام. أضف الشفرة التالية أسفل السطر <code>// سنضع تعليمات جافاسكريبت هنا</code> مباشرة:
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7828_15" style="">
<span class="kwd">function</span><span class="pln"> createParagraph</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> para </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">
  para</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'لقد نقرت على الزرّ!'</span><span class="pun">;</span><span class="pln">
  document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">para</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> buttons </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'button'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> buttons</span><span class="pun">.</span><span class="pln">length </span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  buttons</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> createParagraph</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		احفظ الملف في محرّر النصوص ثم حدّث الصفحة على المتصفح. يجب أن الآن أن تظهر فقرة جديدة أسفل الزّر عند النقر عليه.
	</li>
</ol>
<p>
	<strong>ملاحظة</strong>: إذا لم يعمل المثال الخاص بك، راجع الخطوات مرة أخرى وتحقق من أنك فعلت كل شيء بشكل صحيح. هل حفظت الملف بامتداد <code>html</code> (مثلا <code>lesson1.html</code>)؟ هل أضفت العنصر <code>&lt;script&gt;</code> بعد علامة <code>&lt;body/&gt;</code> مباشرة؟ هل أدخلت جافاسكريبت تماما كما هو موضح؟ جافاسكريبت حساسة لحالة الأحرف +(صغيرة Lowercase أو كبيرة Uppercase)، لذلك تحتاج إلى إدخال الشفرة تماما كما هو مبين، وإلا فلن تعمل.
</p>

<h3 id="جافاسكريبت-خارجي">
	جافاسكريبت خارجي
</h3>

<p>
	ماذا لو أردنا وضع جافاسكريبت لدينا في ملف خارجي؟ دعونا نستكشف هذا الآن.
</p>

<ol>
<li>
		أولا، أنشئ ملفًا جديدا في نفس المجلّد الذي يوجد به ملف HTML وسمّه <code>script.js</code>. تأكد من أنه يحتوي على امتداد اسم الملف<code>js</code>، وهذه هي الطريقة التي يُتعرَّف بها على أننا أمام ملف يحوي شفرات برمجية مكتوبة بجافاسكريبت.
	</li>
	<li>
		بعد ذلك، انسخ كل النص البرمجي من الوسم <code>&lt;script&gt;</code> في ملف HTML (تلك التعليمات الموجودة في الخطوة 4 من الفقرة السابقة) وألصقه في الملف <code>script.js</code> ثم احفظ هذا الملف.
	</li>
	<li>
		<p>
			الآن استبدل العنصر الحالي <code>&lt;script&gt;</code> بما يلي.
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7828_17" style="">
<span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"script.js"</span><span class="tag">&gt;&lt;/script&gt;</span></pre>

		<p>
			يصبح محتوى الملف HTML على النحو التالي:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7828_19" style="">
<span class="pln">    </span><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html</span><span class="pln"> </span><span class="atn">lang</span><span class="pun">=</span><span class="atv">"ar"</span><span class="pln"> </span><span class="atn">dir</span><span class="pun">=</span><span class="atv">"rtl"</span><span class="tag">&gt;</span><span class="pln">
    </span><span class="tag">&lt;head&gt;</span><span class="pln">
        </span><span class="tag">&lt;title&gt;</span><span class="pln">مثال تطبيقي لجافاسكريبت</span><span class="tag">&lt;/title&gt;</span><span class="pln">
    </span><span class="tag">&lt;/head&gt;</span><span class="pln">
    </span><span class="tag">&lt;body&gt;</span><span class="pln">
        </span><span class="tag">&lt;button&gt;</span><span class="pln">انقر هنا</span><span class="tag">&lt;/button&gt;</span><span class="pln">
        </span><span class="tag">&lt;script</span><span class="pln"> </span><span class="atn">src</span><span class="pun">=</span><span class="atv">"script.js"</span><span class="tag">&gt;&lt;/script&gt;</span><span class="pln">
    </span><span class="tag">&lt;/body&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			احفظ الملفّ ثم حدّث صفحة الوِب في المتصفح. ويجب أن تحصُل على نفس النتيجة تمامًا! ولكن الآن لدينا جافاسكريبت في ملف خارجي.
		</p>
	</li>
</ol>
<p>
	يعدّ هذا عموما أمرا جيّدًا من حيث تنظيم التعليمات البرمجية الخاصة بك، وجعلها قابلة لإعادة الاستخدام عبر ملفات HTML متعددة. بالإضافة إلى HTML تصبح أسهل للقراءة دون وجود قطع ضخمة من السكربت ملقاة فيها.
</p>

<h2 id="شفرات-جافاسكريبت-المضمنة-في-وسوم-html">
	شفرات جافاسكريبت المضمنة في وسوم HTML
</h2>

<p>
	تُكتَب شفرة جافاسكريبت أحيانا داخل HTML على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7828_23" style="">
<span class="pln">function createParagraph() {
  var para = document.createElement('p');
  para.textContent = 'You clicked the button!';
  document.body.appendChild(para);
}</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_7828_25" style="">
<span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">onclick</span><span class="pun">=</span><span class="atv">"</span><span class="pln">createParagraph</span><span class="pun">()</span><span class="atv">"</span><span class="tag">&gt;</span><span class="pln">Click me!</span><span class="tag">&lt;/button&gt;</span></pre>

<p>
	<a href="https://jsfiddle.net/jyvngt9u/" rel="external nofollow">استعرض المثال على Jsfiddle</a>
</p>

<p>
	لهذا العرض التوضيحي نفس الوظائف التي عرضناها في الحالتيْن أعلاه، إلا أن عنصر <code>&lt;button&gt;</code> يتضمن خاصيّة <code>onclick</code> مضمنة لتشغيل وظيفة الدالة عند الضغط على زر.
</p>

<p>
	رجاءً لا تضمّن شفرات جافاسكريبت في وسوم HTML فهذه الطريقة من الممارسات السيئة (خلط HTML مع جافاسكريبت)، كما أنها غير فعالة لأن عليك أن تدرج الخاصيّة <code>onclick="createParagraph()"</code> على كل زر تريد تطبيق جافاسكريبت عليه.
</p>

<p>
	أما باستخدام شفرة جافاسكريبت منفصلة عن HTML فيمكنك تحديد كافة الأزرار باستخدام تعليمة واحدة.
</p>

<p>
	الشفرة التي استخدمناها أعلاه لهذا الغرض تبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7828_27" style="">
<span class="kwd">var</span><span class="pln"> buttons </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'button'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> buttons</span><span class="pun">.</span><span class="pln">length </span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  buttons</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> createParagraph</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	قد يبدو هذا الأمر أطول قليلا من الخاصيّة <code>onclick</code>، ولكنه سيعمل على جميع الأزرار بغض النظر عن عدد الأزرار الموجودة في الصفحة وعدد العناصر التي أُضيفت أو أزيلت، فلا يلزم تغيير جافاسكريبت.
</p>

<p>
	ملاحظة: جرب تعديل ملف HTML وإضافة بضعة أزرار أخرى في الملف. عند إعادة التحميل، يجب أن تجد أن جميع الأزرار عند النقر عليها سوف تُظهر فقرة. هذا رائع أليس كذلك؟
</p>

<h2 id="التعليقات-comments">
	التعليقات Comments
</h2>

<p>
	كما هو الحال مع HTML و CSS، يمكنك كتابة تعليقات في شفرة جافاسكريبت وسيتجاهلها المتصفح. تُستخدم التعليقات لتقديم توضيحات لزملائك المطورين عن كيفية عمل الشفرة، كذلك تمثل مرجعًا لك عن التعليمات البرمجية التي كتبتها عندما تعود مثلًا بعد 6 أشهر لتتذكر مالذي فعلته.
</p>

<p>
	التعليقات مفيدة جدًا، ويجب عليك استخدامها في كثير من الأحيان، وخاصة بالنسبة للتطبيقات الكبيرة.<br>
	هناك نوعان من التعليقات:
</p>

<ul>
<li>
		<p>
			تعليقات من سطر واحد، وتُكتَب بعد عموديْن مائليْن؛ مثلا:
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7828_29" style="">
<span class="com">// هذا تعليق</span></pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تعليق متعدّد الأسطر. يُكتَب بين المحارف <code>/ *</code> و <code>* /</code> على النحو التالي:
		</p>

		<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7828_31" style="">
<span class="com">/*
  هذا
  تعليق
  هو الآخر
*/</span></pre>

		<p>
			 
		</p>
	</li>
</ul>
<p>
	تطبيق التعليقات على تعليمات جافاسكريبت السابقة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7828_33" style="">
<span class="com">// دالة تنشئ فقرة جديدة وتضيفها إلى نهاية متن الصفحة</span><span class="pln">
</span><span class="kwd">function</span><span class="pln"> createParagraph</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> para </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">createElement</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">
  para</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'You clicked the button!'</span><span class="pun">;</span><span class="pln">
  document</span><span class="pun">.</span><span class="pln">body</span><span class="pun">.</span><span class="pln">appendChild</span><span class="pun">(</span><span class="pln">para</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">/*
  1. نحصُل على مراجع بجميع الأزرار الموجودة في الصفحة ونضعها في مصفوفة
  2. نمرّ على جميع الأزرار ونضيف إلى كلّ منها مستمعًا لحدث النقر

تُنفَّذ الدالة ()createParagraph عندما ينقر على زرّ في الصفحة.

*/</span><span class="pln">

</span><span class="kwd">var</span><span class="pln"> buttons </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelectorAll</span><span class="pun">(</span><span class="str">'button'</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="kwd">var</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> buttons</span><span class="pun">.</span><span class="pln">length </span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  buttons</span><span class="pun">[</span><span class="pln">i</span><span class="pun">].</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> createParagraph</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كانت هذه خطوتك الأولى في عالم جافاسكريبت. لقد بدأنا بالمفاهيم النظرية فقط لجعلك تفهم لماذا تُستخدم جافاسكربت وما الأشياء التي يمكنك القيام بها باستخدام هذه اللغة. تعرّفت في هذا المقال على بضعة أمثلة من التعليمات البرمجية وتعلّمت كيفية تتفاهم لغةُ جافاسكريبت مع بقية التعليمات البرمجية على موقع الوِب.
</p>

<p>
	قد تبدو الآن جافاسكريبت شاقة بعض الشيء، ولكن لا تقلق - في هذه السلسلة من الدروس سوف نأخذك في خطوات بسيطة تمكّنك من المضي قدمًا في عالم جافاسكربت.
</p>

<p>
	ترجمة - بتصرف - للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript" rel="external nofollow">What is JavaScript?</a> الذي اشترك في كتابته <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript%24history" rel="external nofollow">مساهمو موزيللا</a>.
</p>
]]></description><guid isPermaLink="false">525</guid><pubDate>Fri, 01 Sep 2017 17:00:16 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x64A; &#x62C;&#x627;&#x641;&#x627; &#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A; &#x61F;</title><link>https://academy.hsoub.com/programming/javascript/%D9%85%D8%A7-%D9%87%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%D8%9F-r524/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/59a50de8908bd_main(4).png.758c348c6b3752ffa8202d338700e759.png" /></p>

<p>
	سنتعرّف في هذا الدّرس على لغة البرمجة جافاسكربت من منظور عامّ وسنجيب على تساؤلاتك ماهي جافاسكربت؟ وما الذي تقوم بعمله في صفحات الوِب؟ و نتأكد من أن مفهوم جافاسكريبت قد أصبح واضحًا لديك.
</p>

<p>
	<strong>ملحوظة:</strong> يتوجَّه هذا الدرس، والدروس التي تليه - إلى من لديهم معرفة سابقة بأساسيّات التطوير للوِب: <a href="https://academy.hsoub.com/programming/html5/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D8%A3%D9%88%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D9%84%D9%83-r242/" rel="">HTML وCSS</a>.
</p>

<h2 id="التعريف-العام-لجافاسكريبت">
	التعريف العام لجافاسكريبت
</h2>

<p>
	تُعرَّف جافاسكريبت بأنّها لغة برمجة تسمح لك بتنفيذ أشياء معقدة على صفحات الوِب، تعدّ صفحات الوِب الحديثة أكثر من مجرد موقع يُظهر لك معلومات ثابتة تتصفحها، فهي - مثلًا - تعرض تحديثات المحتوى المباشرة، أو تعرض الخرائط التفاعلية، أو الرسومات المتحركة ثنائية أو ثلاثية الأبعاد، أو تمرّر ملفات الفيديو المصورة، وما إلى ذلك.
</p>

<p>
	تمثّل جافاسكريبت الطبقة الثالثة من طبقات تقنيات الوِب القياسية. الطبقتان الأوليان هما HTML وCSS.
</p>

<p style="text-align: center;">
	<img alt="01_طبقات-الوب.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24747" data-unique="x1g8wylh2" src="https://academy.hsoub.com/uploads/monthly_2017_08/59a50d3e84104_01_-.png.c9726f42a2a14d5d158638d4f05ac2c4.png"></p>

<ul>
<li>
		<p>
			<a href="https://academy.hsoub.com/programming/html5/" rel="">HTML</a> هي لغة توصيف Markup نستخدمها لإنشاء محتوى الوِب وإضفاء معنى عليه، مثل تعريف الفقرات، العناوين وجداول البيانات أو تضمين الصور ومقاطع الفيديو في الصفحة.
		</p>
	</li>
	<li>
		<p>
			<a href="https://academy.hsoub.com/programming/css/" rel="">CSS</a> هي لغة تعرّف قواعد الأنماط Style rules التي نستخدمها لتطبيق التصميم على المحتوى الذي تصفه HTML، على سبيل المثال، تعيين ألوان وخطوط الخلفية، ووضع محتوى ما في أعمدة متعددة.
		</p>
	</li>
	<li>
		<p>
			Javascript هي لغة برمجة تمكّنك من إنشاء محتوى حيوي وديناميكي، التحكم في الوسائط المتعددة، وتحريك الصور وأمورا وكل شيء آخر. حسنًا، ليس كل شيء، ولكن من المدهش ما يمكنك تحقيقه مع بضعة أسطر من شفرة جافاسكريبت.
		</p>
	</li>
</ul>
<p>
	سنأخذ مثالًا يوضح كيفية بناء هذه الطبقات الثلاث فوق بعضها بشكل لطيف. لنأخذ تسمية نص بسيط كمثال.<br>
	سنضع علامة عليه باستخدام HTML لإعطائه هيكلًا وغرضًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4456_7" style="">
<span class="pun">&lt;</span><span class="pln">p</span><span class="pun">&gt;</span><span class="typ">Player</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Chris</span><span class="pun">&lt;/</span><span class="pln">p</span><span class="pun">&gt;</span></pre>

<p>
	النتيجة حتى الآن.
</p>

<p style="text-align: center;">
	<img alt="02_نص-بسيط.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24748" data-unique="hmafm35my" src="https://academy.hsoub.com/uploads/monthly_2017_08/59a50d3f38cc2_02_-.png.7c9994953518aff20d92e2e568db5714.png"></p>

<p>
	سنضيف تحسينات على الشكل باستخدام CSS:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4456_9" style="">
<span class="pln">p </span><span class="pun">{</span><span class="pln">
  font</span><span class="pun">-</span><span class="pln">family</span><span class="pun">:</span><span class="pln"> </span><span class="str">'helvetica neue'</span><span class="pun">,</span><span class="pln"> helvetica</span><span class="pun">,</span><span class="pln"> sans</span><span class="pun">-</span><span class="pln">serif</span><span class="pun">;</span><span class="pln">
  letter</span><span class="pun">-</span><span class="pln">spacing</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pun">;</span><span class="pln">
  text</span><span class="pun">-</span><span class="pln">transform</span><span class="pun">:</span><span class="pln"> uppercase</span><span class="pun">;</span><span class="pln">
  text</span><span class="pun">-</span><span class="pln">align</span><span class="pun">:</span><span class="pln"> center</span><span class="pun">;</span><span class="pln">
  border</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> solid rgba</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">200</span><span class="pun">,</span><span class="lit">0.6</span><span class="pun">);</span><span class="pln">
  background</span><span class="pun">:</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">200</span><span class="pun">,</span><span class="lit">0.3</span><span class="pun">);</span><span class="pln">
  color</span><span class="pun">:</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">200</span><span class="pun">,</span><span class="lit">0.6</span><span class="pun">);</span><span class="pln">
  box</span><span class="pun">-</span><span class="pln">shadow</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">1px</span><span class="pln"> </span><span class="lit">2px</span><span class="pln"> rgba</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">0</span><span class="pun">,</span><span class="lit">200</span><span class="pun">,</span><span class="lit">0.4</span><span class="pun">);</span><span class="pln">
  border</span><span class="pun">-</span><span class="pln">radius</span><span class="pun">:</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  padding</span><span class="pun">:</span><span class="pln"> </span><span class="lit">3px</span><span class="pln"> </span><span class="lit">10px</span><span class="pun">;</span><span class="pln">
  display</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">inline</span><span class="pun">-</span><span class="pln">block</span><span class="pun">;</span><span class="pln">
  cursor</span><span class="pun">:</span><span class="pln">pointer</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أصبحت النتيجة الآن كالتالي.
</p>

<p style="text-align: center;">
	<img alt="03_نص-بسيط-منسق.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24749" data-unique="297esooor" src="https://academy.hsoub.com/uploads/monthly_2017_08/59a50d400b3cc_03_--.png.70f2c1ef6db3b88318a639c15b6d8bfe.png"></p>

<p>
	وأخيرًا، نضيف بضعة تعليمات جافاسكريبت لتنفيذ السلوك الديناميكي.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4456_11" style="">
<span class="kwd">var</span><span class="pln"> para </span><span class="pun">=</span><span class="pln"> document</span><span class="pun">.</span><span class="pln">querySelector</span><span class="pun">(</span><span class="str">'p'</span><span class="pun">);</span><span class="pln">

para</span><span class="pun">.</span><span class="pln">addEventListener</span><span class="pun">(</span><span class="str">'click'</span><span class="pun">,</span><span class="pln"> updateName</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">function</span><span class="pln"> updateName</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">var</span><span class="pln"> name </span><span class="pun">=</span><span class="pln"> prompt</span><span class="pun">(</span><span class="str">'Enter a new name'</span><span class="pun">);</span><span class="pln">
  para</span><span class="pun">.</span><span class="pln">textContent </span><span class="pun">=</span><span class="pln"> </span><span class="str">'Player 1: '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	غرضنا الآن ليس شرح التعليمات السابقة (سنفعل ذلك لاحقا) ولكن توضيح ما يمكن أن تضيفه جافاسكريبت لـHTML وCSS.
</p>

<p>
	عند النقر على النص تظهر نافذة تطلُب إدخال اسم ثم عند إدخال الاسم في النافذة المنبثقة والنقر على زر OK تأخذ النص وتطبعه أمام الجملة <code>Player 1</code>.
</p>

<p>
	<a href="https://jsfiddle.net/xj4qxf9s/" rel="external nofollow">استعرض المثال على Jsfiddle</a>.
</p>

<p>
	<a href="https://github.com/mdn/learning-area/blob/master/javascript/introduction-to-js-1/what-is-js/javascript-label.html" rel="external nofollow">الشفرة المصدرية الكاملة للمثال</a>.
</p>

<p>
	<a href="https://mdn.github.io/learning-area/javascript/introduction-to-js-1/what-is-js/javascript-label.html" rel="external nofollow">التشغيل المباشر</a>.
</p>

<p>
	يمكن لجافاسكريبت أن تفعل أكثر من ذلك بكثير؛ دعونا نستكشف مزيدًا من التفاصيل.
</p>

<h2 id="مالذي-يمكن-لجافاسكريبت-فعله-حقا">
	مالذي يمكن لجافاسكريبت فعله حقا؟
</h2>

<p>
	تتكون لغة جافاسكريبت الأساسية من بعض ميزات البرمجة الشائعة التي تسمح لك بفعل أشياء مثل:
</p>

<ul>
<li>
		<p>
			تخزين قيم مفيدة داخل متغيرات Variables. في المثال السابق على سبيل المثال، نطلب من المستخدم ادخال اسم جديد ثم يُخزَّن هذا الاسم في متغير يسمى <code>name</code>.
		</p>
	</li>
	<li>
		<p>
			العمليات على أجزاء من النص (المعروفة باسم سلاسل المحارف Strings في البرمجة). في المثال أعلاه، نأخذ سلسلة المحارف <code>Player 1:</code> ونضمها إلى متغير الاسم المذكور أعلاه لإنشاء الجملة الكاملة، على سبيل المثال <code>Player 1: Chris</code>.
		</p>
	</li>
	<li>
		<p>
			تشغيل التعليمات البرمجية ردًا على أحداث معينة تحدث على صفحة وِب. في المثال أعلاه استخدمنا الحدث <code>click</code> الذي يخبرنا أن المستخدم نقر على النصّ ثم نشغّل الشفرة التي تعمل على تحديث النص.
		</p>
	</li>
	<li>
		<p>
			والكثير!
		</p>
	</li>
</ul>
<p>
	ولكن ما هو أكثر إثارة هو وظيفة بُنيت على لبّ لغة جافاسكريبت الأساسي. تسمى APIs وهي اختصار لـ Application Programming Interface واجهات برمجة التطبيقات. تتيح لك واجهات برمجة التطبيقات (APIs) المزيد من القوة لاستخدامها في شفرة جافاسكريبت.
</p>

<p>
	تُعرّف واجهات برمجة التطبيقات (APIs) على أنها مجموعات جاهزة من الشفرات البرمجيّة تسمح لمطور البرامج بتنفيذ برامج سيكون من الصعب أو المستحيل تنفيذها من دون استخدام واجهة برمجة التطبيقات.
</p>

<p>
	لأوضح لك الفكرة، تخيل أنك تريد عمل رف خشبي للكتب، سيكون الأمر أسهل بكثير لو توافرت لك الألواح الخشبية والمسامير بالمقاسات المناسبة وما عليك سوى تجميعها معًا لعمل رف الكتب.<br>
	في حين سيكون الأمر أصعب بكثير لو توجّب عليك أنت العثور على الخشب المناسب وتقطيعه إلى الحجم والشكل الصحيح وإيجاد قياس المسامير المناسب ومن ثم تجميعها معًا لعمل رف الكتب. هذا ما تسهل عمله واجهات برمجة التطبيقات.
</p>

<p>
	تنقسم واجهات برمجة التطبيقات (APIs) عمومًا إلى فئتين.
</p>

<p style="text-align: center;">
	<img alt="04_واجهة-برمجة-التطبيقات.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24750" data-unique="ro3ilwdwn" src="https://academy.hsoub.com/uploads/monthly_2017_08/59a50d415f308_04_--.png.6ecc5dd5052b3300cd8462335a1e3155.png"></p>

<ol>
<li>
		<p>
			واجهات برمجة التطبيقات الخاصّة بالمتصفّح Browser APIs: تُدمَج واجهات برمجة تطبيقات في المتصفّح لإعطائه القدرة على عرض البيانات من بيئة الحاسوب المحيطة به، أو القيام بأشياء معقدة مفيدة. فمثلا:
		</p>

		<ul>
<li>
				<p>
					تسمح لك واجهة برمجة تطبيقات DOM وهي اختصار لـ Document Object Model بمعالجة HTML و CSS، إنشاء، إزالة وتغيير HTML ، تطبيق أنماط Styles جديدة ديناميكيًّا على صفحتك، وما إلى ذلك.<br>
					في كل مرة تُعرَض فيها نافذة منبثقة تظهر على صفحة، أو يُعرَض محتوى جديد -كما رأينا أعلاه في مثالنا السابق- فواجهة DOM هي المسؤولة عن ذلك.
				</p>
			</li>
			<li>
				<p>
					تستعيد واجهة برمجة التطبيقات Geolocation <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> معلومات الموقع الجغرافي، ممّا يفسّر كيف يمكن لخرائط جوجل <a href="https://academy.hsoub.com/programming/javascript/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D9%80%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%AE%D8%B1%D8%A7%D8%A6%D8%B7-google-maps-%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-%D8%A7%D9%84%D9%80%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r181/" rel="">Google Maps</a> أن تعثُر على موقعك الجغرافي وترسمه على الخريطة.
				</p>
			</li>
			<li>
				<p>
					تسمح لك واجهات برمجة تطبيقات اللوحة <a href="https://academy.hsoub.com/programming/javascript/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%B9%D9%86%D8%B5%D8%B1-canvas-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-r207/" rel="">Canvas</a> و <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-webgl-%D8%AA%D8%B9%D8%B1%D9%8A%D9%81-r481/" rel="">WebGL</a> بإنشاء رسومات متحركة ثنائية الأبعاد وثلاثية الأبعاد. يقوم الأشخاص بأشياء مدهشة باستخدام تقنيات الوِب هذه.
				</p>
			</li>
			<li>
				<p>
					تسمح لك واجهات برمجة التطبيقات الصوتية والمرئية مثل HTMLMediaElement و WebRTC بالقيام بأشياء مثيرة للاهتمام حقًا مع الوسائط المتعددة، مثل تشغيل الصوت والفيديو مباشرة في صفحة وِب أو التقاط الفيديو من كاميرا الوِب الخاصة بك وعرضها على جهاز كمبيوتر شخص آخر (جرب العرض التوضيحي <a href="http://chrisdavidmills.github.io/snapshot/" rel="external nofollow">snapshot</a>)
				</p>

				<p>
					<strong>ملاحظة</strong>: لن تعمل العديد من العروض التوضيحية المذكورة أعلاه في متصفح أقدم. عند التجربة، من الأفضل استخدام متصفح حديث مثل فايرفوكس أو كروم أو Edge أو Opera لتشغيل الشفرة.
				</p>
			</li>
		</ul>
</li>
	<li>
		<p>
			واجهة برمجة التطبيقات الخاصّة بطرف ثالث Third party APIs. لا تُضمَّن هذه الواجهات في المتصفح مبدئيًّا. وعليك عمومًا الحصول على التعليمات البرمجية والمعلومات من مكان ما على الوِب. فمثلا:
		</p>

		<ul>
<li>
				<p>
					تتيح لك واجهة برمجة تطبيقات تويتر <a href="https://dev.twitter.com/docs" rel="external nofollow">Twitter <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> إجراء أشياء مثل عرض أحدث التغريدات على موقعك الإلكتروني.
				</p>
			</li>
			<li>
				<p>
					تسمح لك واجهة برمجة التطبيقات لخرائط غوغل <a href="https://developers.google.com/maps/" rel="external nofollow">Google Maps <abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a> بتضمين الخرائط المخصصة في موقعك على الوِب، وغير ذلك من الوظائف.
				</p>

				<p>
					<strong>ملاحظة</strong>: واجهات برمجة التطبيقات هذه متقدمة، ولن يتم تغطية أي منها في هذه الدّروس، ولكن الروابط الواردة أعلاه توفّر وثائق شاملة إذا كنت مهتمًا بمعرفة المزيد.
				</p>
			</li>
		</ul>
</li>
</ol>
<p>
	يوجد الكثير لتعلّمه، لا تفقد حماسك. دراسة جافاسكريبت لمدة 24 ساعة لن تعطيك القدرة على بناء فيسبوك، خرائط غوغل أو إنستغرام. هناك الكثير من الأساسيات التي يجب تغطيتها أولًا.
</p>

<p>
	وهذا هو السبب في أنك هنا. سنكمل في الدرس السابق حديثنا عن جافاسكريبت وستكون فرصة على للنظر الفعلي في شفرات برمجية.
</p>

<p>
	ترجمة - بتصرف - للمقال <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript" rel="external nofollow">What is JavaScript?</a> الذي اشترك في كتابته <a href="https://developer.mozilla.org/en-US/docs/Learn/JavaScript/First_steps/What_is_JavaScript%24history" rel="external nofollow">مساهمو موزيللا</a>.
</p>
]]></description><guid isPermaLink="false">524</guid><pubDate>Tue, 29 Aug 2017 15:07:00 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x644;&#x64A;&#x644; &#x645;&#x644;&#x641;&#x627;&#x62A; CSV &#x628;&#x648;&#x627;&#x633;&#x637;&#x629; &#x62C;&#x627;&#x641;&#x627;&#x633;&#x643;&#x631;&#x64A;&#x628;&#x62A;</title><link>https://academy.hsoub.com/programming/javascript/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%85%D9%84%D9%81%D8%A7%D8%AA-csv-%D8%A8%D9%88%D8%A7%D8%B3%D8%B7%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-r521/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/59981450ebf6d_main(13).png.7f58ab237ec5131e0b0c57dc0365fd49.png" /></p>

<p>
	يشيع استخدام صيغة Comma-separated values) CSV؛ قيم معزولة بفاصلة) لتخزين بيانات مُجدوَلة مثل تلك المصدَّرة من قاعدة بيانات أو ورقة حسابات. تمكن قراءة المستندات باستخدام واجهة <code>FileReader</code> البرمجية <a href="https://academy.hsoub.com/programming/html5/" rel="">HTML</a>، دون الحاجة للتخاطب مع أي خادوم Server أو سند خلفي Backend.<br>
	سنرى في هذا الدّرس كيفيّة قراءة ملفات CSV في صفحة وِب باستخدام JavaScript وذلك بالاعتماد على محلّل Parser يتخاطب مع واجهة <code>FileReader</code>، هذا المحلّل هو Papa Parse.<br>
	يتطلّب هذا الدرس معرفة جيّدة بجافاسكريبت ومكتبة <a href="https://academy.hsoub.com/programming/javascript/jquery/" rel="">jQuery</a>.
</p>

<h2 id="لماذا-نستخدم-papa-parse">
	لماذا نستخدم Papa Parse
</h2>

<p>
	يدعم محلّل <a href="http://papaparse.com/" rel="external nofollow">Papa Parse</a> المتصفحات الحديثة وبه الكثير من الميزات:
</p>

<ol>
<li>
		مفتوح المصدر، مجاني وتُضاف إليه ميزات جديدة باستمرار؛
	</li>
	<li>
		سريع، يمكنه تحليل ملايين البيانات ويدعم التشعّب التعدّدي Multi-threading؛
	</li>
	<li>
		لا يعتمد على مكتبات خارجية؛
	</li>
	<li>
		يدعم <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-encoding%D8%8C-%D8%A7%D9%84%D8%AA%D8%B9%D9%85%D9%8A%D8%A9-encryption%D8%8C-%D8%A7%D9%84%D8%AA%D8%AC%D8%B2%D8%A6%D8%A9-hashing-%D9%88%D8%A7%D9%84%D8%AA%D8%B4%D9%88%D9%8A%D8%B4-obfuscation%D8%9F-r308" rel="">ترميزات Encoding</a> مختلفة؛
	</li>
	<li>
		يمكنه تخطّي التعليقات
	</li>
	<li>
		يتجنّب انهيار المتصفّح باستخدام التدفقات Streams للحصول على البيانات الخام.
	</li>
</ol>
<p>
	نهدف في هذا الدرس إلى قراءة البيانات من ملفّ CSV يحمّله الزائر عن طريق المتصفّح، نحلّل هذه البيانات ثم نعرضها في جدول HTML. يمكنك بعد ذلك استخدام التخزين المحلّي Local storage لديمومة البيانات أو إرسالها إلى خادوم لتخزينها في قاعدة بيانات.
</p>

<p>
	توجد الشفرة الكاملة لهذا الدرس في الملف المرفق. سنشرح في الفقرات الموالية أهم الخطوات.
</p>

<h2 id="تهيئة-استمارة-html">
	تهيئة استمارة HTML
</h2>

<p>
	الخطوة الأولى هي كتابة شفرة HTML المسؤولة عن الاستمارة Form التي سيُحمّل المستخدم عن طريقها ملف CSV.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4564_7" style="">
<span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-inline"</span><span class="tag">&gt;</span><span class="pln">
</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-group"</span><span class="tag">&gt;</span><span class="pln">
  </span><span class="tag">&lt;label</span><span class="pln"> </span><span class="atn">for</span><span class="pun">=</span><span class="atv">"files"</span><span class="tag">&gt;</span><span class="pln">Upload a CSV formatted file:</span><span class="tag">&lt;/label&gt;</span><span class="pln">
  </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"file"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"files"</span><span class="pln">  </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-control"</span><span class="pln"> </span><span class="atn">accept</span><span class="pun">=</span><span class="atv">".csv"</span><span class="pln"> </span><span class="atn">required</span><span class="pln"> </span><span class="tag">/&gt;</span><span class="pln">
</span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;div</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"form-group"</span><span class="tag">&gt;</span><span class="pln">
 </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">id</span><span class="pun">=</span><span class="atv">"submit"</span><span class="pln"> </span><span class="atn">class</span><span class="pun">=</span><span class="atv">"btn btn-primary"</span><span class="tag">&gt;</span><span class="pln">Submit</span><span class="tag">&lt;/button&gt;</span><span class="pln">
 </span><span class="tag">&lt;/div&gt;</span><span class="pln">
</span><span class="tag">&lt;/form&gt;</span></pre>

<p>
	جعلنا حقل الإدخال Input مطلوبًا كما يظهر في الشفرة أعلاه <code>required</code>، كما أنه لا يقبل سوى الملفات بصيغة CSV:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4564_9" style="">
<span class="pln">accept=".csv"</span></pre>

<h2 id="استقبال-البيانات-وتحليلها">
	استقبال البيانات وتحليلها
</h2>

<p>
	يُحدَّد ملف CSV في حقل الإدخال عندما ينقر المستخدم على الزّر “إرسال”. <a href="http://papaparse.com/docs#jquery" rel="external nofollow">نستخدم jQuey</a> - عند النقر على زرّ الإرسال - لتحليل الملف الذي حمّله المستخدم:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4564_11" style="">
<span class="pln">$</span><span class="pun">(</span><span class="str">'#submit'</span><span class="pun">).</span><span class="pln">on</span><span class="pun">(</span><span class="str">"click"</span><span class="pun">,</span><span class="kwd">function</span><span class="pun">(</span><span class="pln">e</span><span class="pun">){</span><span class="pln">
    e</span><span class="pun">.</span><span class="pln">preventDefault</span><span class="pun">();</span><span class="pln">

    $</span><span class="pun">(</span><span class="str">'#files'</span><span class="pun">).</span><span class="pln">parse</span><span class="pun">({</span><span class="pln">
        config</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            delimiter</span><span class="pun">:</span><span class="pln"> </span><span class="str">"auto"</span><span class="pun">,</span><span class="pln">
            complete</span><span class="pun">:</span><span class="pln"> buildTable</span><span class="pun">,</span><span class="pln">
        </span><span class="pun">},</span><span class="pln">
        before</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">file</span><span class="pun">,</span><span class="pln"> inputElem</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//console.log("Parsing file...", file);</span><span class="pln">
        </span><span class="pun">},</span><span class="pln">
        error</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">(</span><span class="pln">err</span><span class="pun">,</span><span class="pln"> file</span><span class="pun">)</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//console.log("ERROR:", err, file);</span><span class="pln">
        </span><span class="pun">},</span><span class="pln">
        complete</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">function</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
            </span><span class="com">//console.log("Done with all files");</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">});</span><span class="pln">
</span><span class="pun">});</span></pre>

<p>
	الشفرة كما يظهر بسيطة. نبدأ أولا بضبط بعض المعطيات Parameters التي يحتاجها Papa parse باستخدام الكائن <code>config</code>.
</p>

<p>
	يتوفّر Papa parse أيضا على توابع لدورة حياة الملف يمكن استخدامها إن اقتضت الضرورة:
</p>

<ul>
<li>
		<code>before</code>: دالة تُنفَّذ قبل بدء تحليل الملف.
	</li>
	<li>
		<code>error</code>: دالة تُنفَّذ عند وجود خطأ في تحليل الملف.
	</li>
	<li>
		<code>complete</code>: دالة تُنفَّذ بعد اكتمال تحليل الملف. لا تتلقّى هذه الدالة أية بيانات، وبالتالي يجب استخدام الدالة في المعطى <code>complete</code> إن كنت تريد معالجة البيانات التي تحصّل عليها المحلّل، وهو ما سنفعله.
	</li>
</ul>
<p>
	تتضمّن معطيات الكائن <code>config</code> المذكور أعلاه:
</p>

<ul>
<li>
		المحرف المستخدَم للفصل بين القيم <code>delimiter</code> الذي ضبطناه على القيمة <code>auto</code> لكي يستكشف المحلّل تلقائيًا المحرف المستخدم.
	</li>
	<li>
		دالة تُنفَّذ بعد اكتمال تحليل الملف يحدّدها المعطى <code>complete</code> في الكائن <code>config</code>. أعطينا القيمة <code>buildTable</code> لهذا المعطى، وهو اسم دالة سنعرّفها لاحقا.
	</li>
</ul>
<p>
	تستقبل الدالة <code>buildTable</code> نتيجة تحليل الملف في أول معطى (<code>results</code>)، وهو كائن يأخذ الهيكلة التاليّة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4564_13" style="">
<span class="pun">{</span><span class="pln">
    data</span><span class="pun">:</span><span class="pln">   </span><span class="com">// مصفوفة بالبيانات بعد التحليل</span><span class="pln">
    errors</span><span class="pun">:</span><span class="pln"> </span><span class="com">// مصفوفة بالأخطاء التي قد تكون حصلت أثناء تحليل الملف</span><span class="pln">
    meta</span><span class="pun">:</span><span class="pln">   </span><span class="com">// كائن يتضمّن معلومات إضافية</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تستقبل الدالة <code>buildTable</code> الكائن <code>results</code> وتستخدم البيانات <code>results.data</code> لإنشاء جدول تعرضه في صفحة الوب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4564_15" style="">
<span class="kwd">function</span><span class="pln"> buildTable</span><span class="pun">(</span><span class="pln">results</span><span class="pun">){</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> markup </span><span class="pun">=</span><span class="pln"> </span><span class="str">"&lt;table class='table'&gt;"</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">var</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> results</span><span class="pun">.</span><span class="pln">data</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">for</span><span class="pun">(</span><span class="pln">i</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln">i</span><span class="pun">&lt;</span><span class="pln">data</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln">i</span><span class="pun">++){</span><span class="pln">
        markup</span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;tr&gt;"</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">var</span><span class="pln"> row </span><span class="pun">=</span><span class="pln"> data</span><span class="pun">[</span><span class="pln">i</span><span class="pun">];</span><span class="pln">
        </span><span class="kwd">var</span><span class="pln"> cells </span><span class="pun">=</span><span class="pln"> row</span><span class="pun">.</span><span class="pln">join</span><span class="pun">(</span><span class="str">","</span><span class="pun">).</span><span class="pln">split</span><span class="pun">(</span><span class="str">","</span><span class="pun">);</span><span class="pln">

        </span><span class="kwd">for</span><span class="pun">(</span><span class="pln">j</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln">j</span><span class="pun">&lt;</span><span class="pln">cells</span><span class="pun">.</span><span class="pln">length</span><span class="pun">;</span><span class="pln">j</span><span class="pun">++){</span><span class="pln">
            markup</span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;td&gt;"</span><span class="pun">;</span><span class="pln">
            markup</span><span class="pun">+=</span><span class="pln"> cells</span><span class="pun">[</span><span class="pln">j</span><span class="pun">];</span><span class="pln">
            markup</span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;/th&gt;"</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
        markup</span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;/tr&gt;"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    markup</span><span class="pun">+=</span><span class="pln"> </span><span class="str">"&lt;/table&gt;"</span><span class="pun">;</span><span class="pln">
    $</span><span class="pun">(</span><span class="str">"#app"</span><span class="pun">).</span><span class="pln">html</span><span class="pun">(</span><span class="pln">markup</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ترجمة - بتصرف - للمقال <a href="https://coderexample.com/reading-csv-file-using-javascript/" rel="external nofollow">Reading csv file using javascript</a> لصاحبه Arkaprava Majumder. 
</p>

<p>
	لتحميل الملف المرفق<a data-fileid="24588" href="https://academy.hsoub.com/applications/core/interface/file/attachment.php?id=24588" rel=""> انقر هنا</a>.
</p>

<p>
	 
</p>
]]></description><guid isPermaLink="false">521</guid><pubDate>Tue, 22 Aug 2017 11:05:17 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x62F;&#x627;&#x644;&#x62A;&#x64A;&#x646; min &#x648; max &#x645;&#x646; &#x627;&#x644;&#x643;&#x627;&#x626;&#x646; Math &#x641;&#x64A; JavaScript</title><link>https://academy.hsoub.com/programming/javascript/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%AF%D8%A7%D9%84%D8%AA%D9%8A%D9%86-min-%D9%88-max-%D9%85%D9%86-%D8%A7%D9%84%D9%83%D8%A7%D8%A6%D9%86-math-%D9%81%D9%8A-javascript-r505/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_06/594c2d94e0916_main2(2).png.a5862b50fecf1badd75a8197b07eb462.png" /></p>

<p>
	يوفّر الكائن <code>Math</code> في جافا سكريبت الكثير من الدوال والقيم منتشرة الاستخدام في الحساب والرياضيات. مثلا، إن أردنا الحصول على قيمة الثابت <code>π</code> (باي) الذي هو النسبة بين محيط دائرة وقطرها فيمكننا ذلك باستخدام القيمة <code>Math.PI</code>.
</p>

<p style="text-align: center;">
	<img alt="main2 (2).png" class="ipsImage ipsImage_thumbnailed" data-fileid="23776" data-unique="7fdjprt12" src="https://academy.hsoub.com/uploads/monthly_2017_06/594c2d9c13ef4_main2(2).png.c90af8e74f3875a4623b761c3c3aee31.png"></p>

<p>
	من أكثر دوال <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D9%8A%D8%A8%D8%AA-%D9%83%D8%A7%D8%A6%D9%86%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%88%D8%AC%D9%87-object-oriented-javascript-r179/" rel="">الكائن</a> <code>Math</code> شيوعا الدالة <code>Math.max</code> (والدالة المقابلة لها <code>Math.min</code>)؛ فمن الشائع أن تواجه مجموعةً من الأرقام وعليك معرفة أكبر أو أصغر رقم فيها، وصحيحٌ أنَّ بإمكانك استخدام معامل رياضي في JavaScript لمعرفة الإجابة، أو عبر استعمال سلسلة من عبارات <code>if</code> الشرطية، لكن هاتين الدالتين أكثر مرونةً وكفاءة.
</p>

<p>
	الدالتان <code>Math.max</code> و<code>Math.min</code>، على النقيض من الدوال التي تكتبها بنفسك في JavaScript، مبنيتان في أساس لغة JavaScript وهما جزءٌ من الكائن الساكن (static object) الخاص بالدوال الرياضية <code>Math</code>، وهو ما يعني أن بالإمكان استعمال دوال هذا الكائن في أيّ مكان من التطبيق أو المشروع دون تهيئة كائن خاص بها.
</p>

<p>
	تقبل هاتان الدالتان مجموعةً من الأرقام وسائط لها، إذ تُعيد الدالة <code>Math.max</code> أكبر رقم في المجموعة. جرّب مثلًا التعليمة البرمجية الآتية في console في المتصفح:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<span class="typ">Math</span><span class="pun">.</span><span class="pln">max</span><span class="pun">(</span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">22</span><span class="pun">);</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">22</span></pre>

<p>
	<strong>ملاحظة:</strong> إذا وضعت أي نوعٍ غير رقمي من القيم فستكون النتيجة هي <code>NaN</code> والذي يعني Not A Number (أي أن المدخلات أو المخرجات ليس رقمية).<br>
	لاحظ أنَّ بإمكاننا تمرير متغيرات أو خاصيات (properties) تابعة لأحد الكائنات (object) إلى الدالة <code>Math.max</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs avrasm"><span class="kwd">let</span><span class="pln"> orbitalPeriod </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Object</span><span class="pun">()</span><span class="hljs-comment"><span class="pun">;</span></span><span class="pln">
orbitalPeriod</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="typ">Mercury</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">87.97</span></span><span class="pun">,</span><span class="pln">
orbitalPeriod</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="typ">Venus</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">224.70</span></span><span class="pun">,</span><span class="pln">
orbitalPeriod</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="typ">Mars</span></span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-number"><span class="lit">686.98</span></span><span class="hljs-comment"><span class="pun">;</span></span><span class="pln">
</span><span class="typ">Math</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">max</span></span><span class="pun">(</span><span class="pln">orbitalPeriod</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="typ">Mercury</span></span><span class="pun">,</span><span class="pln"> orbitalPeriod</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="typ">Venus</span></span><span class="pun">,</span><span class="pln"> orbitalPeriod</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="typ">Mars</span></span><span class="pun">)</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">686.98</span></span></code></pre>

<p>
	أحد الأمور الذي لا تستطيع الدالة <code>Math.max</code> فعلها هو العثور على أكبر قيمة في المصفوفة، وهو ما دعا في الماضي إلى استخدام حلقات التكرار ومقارنة كل القيم في ما بينها (عبر إحدى الخوارزميات المعروفة) وتخزين أكبر قيمة؛ إلا أن الأمر تغيّر مع ظهور المتصفحات الحديثة التي تدعم معيار <a href="https://academy.hsoub.com/programming/javascript/%D9%85%D8%A7-%D8%A7%D9%84%D8%AC%D8%AF%D9%8A%D8%AF-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%82%D8%A7%D8%AF%D9%85-%D9%85%D9%86-%D8%AC%D8%A7%D9%81%D8%A7%D8%B3%D9%83%D8%B1%D8%A8%D8%AA-ecmascript-6-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r12/" rel="">EmacScript 6</a>، والتي تمكّن من استعمال معامل باسم spread، وهو عبارة عن ثلاثة نقاط <code>...</code> توضع أمام المصفوفة أثناء تمريرها للدالة، مما يختصر العملية كثيرًا:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs r"><span class="kwd">let</span><span class="pln"> orbitalPeriods </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">87.97</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">224.70</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">686.98</span></span><span class="pun">];</span><span class="pln">
longestOrbit </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Math</span><span class="pun">.</span><span class="pln">max</span><span class="pun">(</span><span class="hljs-keyword"><span class="pun">...</span></span><span class="pln"> orbitalPeriods</span><span class="pun">);</span></code></pre>

<p>
	يُعرَف التأثير الذي يُحدثه المعامل Spread على المصفوفة باسم التوزيع Expension. يُكافئ تمرير مصفوفة موّزّعة تمرير جميع عناصرها على هيئة مجموعة أرقام؛ أي أن الكتابتين أدناه متكافئتان:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs r"><span class="typ">Math</span><span class="pun">.</span><span class="pln">max</span><span class="pun">(</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">11</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">22</span></span><span class="pun">);</span><span class="pln">
</span><span class="typ">Math</span><span class="pun">.</span><span class="pln">max</span><span class="pun">(</span><span class="hljs-keyword"><span class="pun">...</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">5</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">11</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">22</span></span><span class="pun">]);</span></code></pre>

<p>
	تُستعمل الدالة <code>Math.max</code> أيضًا للاختيار بين رقمين (إما/أو)، فلو كنّا نحتاج إلى قياس عرض الشاشة فسنستعمل:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> screenWidth </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">.</span><span class="pln">max</span><span class="pun">(</span><span class="pln">screen</span><span class="pun">.</span><span class="pln">width</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">);</span></code></pre>

<p>
	يجب أن تكون قيمة المتغير <code>screenWidth</code> النهائية رقميةً: فإما أن تساوي عرض الشاشة، أو إذا لم نستطع الحصول على تلك القيمة أو كانت غير رقمية، فالناتج 0.
</p>

<h2 id="الحصول-على-أصغر-رقم-في-المجموعة">
	الحصول على أصغر رقم في المجموعة
</h2>

<p>
	الدالة <code>Math.min</code> تعمل عكس عمل الدالة <code>Math.max</code>، فبتمرير مجموعة من القيم إليها ستُعيد الدالة <code>Math.min</code> أصغرها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs javascript"><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">.</span><span class="pln">min</span><span class="pun">(</span><span class="hljs-number"><span class="lit">0.139</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0.15</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">1</span></span><span class="pun">);</span><span class="pln">
</span><span class="pun">&gt;</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0.139</span></span></code></pre>

<p>
	تُستعمَل الدالة <code>Math.min</code> عادةً لتعريف ما هي الحدود أو الشروط الدنيا، فلو كانت لدينا كرةٌ تتحرك داخل مستطيل، وكان الجانب الأيمن للمستطيل موجودًا على بعد 500 بكسل من إطار العرض، ولا نريد أن تخرج الكرة من المستطيل عند ارتطام جانبها الأيمن (<code>ball.rigth</code>) بحافة المستطيل (<code>500</code>)، فسنكتب:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs javascript"><span class="hljs-keyword"><span class="kwd">let</span></span><span class="pln"> collide </span><span class="pun">=</span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">.</span><span class="pln">min</span><span class="pun">(</span><span class="pln">ball</span><span class="pun">.</span><span class="pln">right</span><span class="pun">,</span><span class="hljs-number"><span class="lit">500</span></span><span class="pun">);</span></code></pre>

<p>
	أحببتُ أن أنوِّه إلى إمكانية «توزيع» القيم الموجودة في مصفوفة داخل الدالة <code>Math.min</code>، فلو كانت لدينا مصفوفةٌ باسم <code>bugSizes</code> وأردنا معرفة أدنى قيمة فيها، فيمكننا كتابة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs r"><span class="typ">Math</span><span class="pun">.</span><span class="pln">min</span><span class="pun">(</span><span class="hljs-keyword"><span class="pun">...</span></span><span class="pln"> bigSizes</span><span class="pun">)</span></code></pre>

<p>
	يمكننا بشكلٍ بديلٍ استخدام <code>apply</code> للحصول على نفس النتيجة، وهذه الطريقة مدعومةٌ دعمًا أفضل في المتصفحات:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_598_7" style="">
<code class="hljs javascript"><span class="hljs-built_in"><span class="typ">Math</span></span><span class="pun">.</span><span class="pln">min</span><span class="pun">.</span><span class="pln">apply</span><span class="pun">(</span><span class="hljs-literal"><span class="kwd">null</span></span><span class="pun">,</span><span class="pln"> bigSizes</span><span class="pun">);</span></code></pre>

<p>
	يمكن استعمال <code>apply</code> مع الدالة <code>Math.max</code> أيضًا.
</p>

<p>
	ترجمة – بتصرّف – للمقال <a href="thenewcode.com/1183/To-the-Max-Using-Mathmin-and-max" rel="">To the Max: Using Math.min and .max</a> لصاحبه Dudley Storey. 
</p>
]]></description><guid isPermaLink="false">505</guid><pubDate>Thu, 22 Jun 2017 20:51:22 +0000</pubDate></item></channel></rss>
