<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://blog.kiki.my.id/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.kiki.my.id/" rel="alternate" type="text/html" /><updated>2026-10-11T04:34:51+00:00</updated><id>https://blog.kiki.my.id/feed.xml</id><title type="html">Miftakhuddin’s Blog</title><subtitle>Small community, Don&apos;t be serious.</subtitle><entry><title type="html">jQuery Effects dan Animasi: Buat Halaman Web Lebih Hidup</title><link href="https://blog.kiki.my.id/jquery-effects-dan-animasi/" rel="alternate" type="text/html" title="jQuery Effects dan Animasi: Buat Halaman Web Lebih Hidup" /><published>2026-10-11T00:00:00+00:00</published><updated>2026-10-11T00:00:00+00:00</updated><id>https://blog.kiki.my.id/jquery-effects-dan-animasi</id><content type="html" xml:base="https://blog.kiki.my.id/jquery-effects-dan-animasi/"><![CDATA[<p>Salah satu alasan jQuery begitu populer di masa jayanya adalah <strong>kemudahan membuat animasi dan efek</strong>. Dengan beberapa baris kode jQuery, kamu bisa membuat elemen muncul perlahan, slide ke atas/bawah, atau animasi custom yang kompleks — tanpa perlu memahami detail CSS animation secara mendalam.</p>

<hr />

<h2 id="show-hide-dan-toggle">Show, Hide, dan Toggle</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Langsung (tanpa animasi)</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">show</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">hide</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">toggle</span><span class="p">();</span>

<span class="c1">// Dengan durasi</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">show</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>          <span class="c1">// 300 milidetik</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">hide</span><span class="p">(</span><span class="dl">"</span><span class="s2">slow</span><span class="dl">"</span><span class="p">);</span>       <span class="c1">// ~600ms</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">show</span><span class="p">(</span><span class="dl">"</span><span class="s2">fast</span><span class="dl">"</span><span class="p">);</span>       <span class="c1">// ~200ms</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">toggle</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>

<span class="c1">// Dengan callback — dijalankan setelah animasi selesai</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">hide</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sudah tersembunyi!</span><span class="dl">"</span><span class="p">);</span>
  <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="fade-effects">Fade Effects</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Fade in dan out (ubah opacity)</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeIn</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeIn</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeOut</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeOut</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span>  <span class="c1">// hapus setelah fade selesai</span>
<span class="p">});</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeToggle</span><span class="p">(</span><span class="mi">400</span><span class="p">);</span>

<span class="c1">// FadeTo — fade ke opacity tertentu</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeTo</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">);</span>   <span class="c1">// fade ke 50% opacity dalam 500ms</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeTo</span><span class="p">(</span><span class="dl">"</span><span class="s2">slow</span><span class="dl">"</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="slide-effects">Slide Effects</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Slide up (collapse) dan slide down (expand)</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#panel</span><span class="dl">"</span><span class="p">).</span><span class="nf">slideDown</span><span class="p">();</span>        <span class="c1">// tampilkan dengan slide dari atas</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#panel</span><span class="dl">"</span><span class="p">).</span><span class="nf">slideDown</span><span class="p">(</span><span class="mi">400</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#panel</span><span class="dl">"</span><span class="p">).</span><span class="nf">slideUp</span><span class="p">();</span>          <span class="c1">// sembunyikan dengan slide ke atas</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#panel</span><span class="dl">"</span><span class="p">).</span><span class="nf">slideToggle</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>   <span class="c1">// toggle antara slideDown dan slideUp</span>

<span class="c1">// Contoh praktis: accordion</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.accordion-header</span><span class="dl">"</span><span class="p">).</span><span class="nf">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">content</span> <span class="o">=</span> <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">next</span><span class="p">(</span><span class="dl">"</span><span class="s2">.accordion-content</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">content</span><span class="p">.</span><span class="nf">slideToggle</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>

  <span class="c1">// Tutup yang lain</span>
  <span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.accordion-content</span><span class="dl">"</span><span class="p">).</span><span class="nf">not</span><span class="p">(</span><span class="nx">content</span><span class="p">).</span><span class="nf">slideUp</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="animate--animasi-custom">.animate() — Animasi Custom</h2>

<p><code class="language-plaintext highlighter-rouge">animate()</code> memungkinkan animasi pada hampir semua properti CSS numerik:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Format: .animate(properti, durasi, easing, callback)</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">animate</span><span class="p">({</span>
  <span class="na">width</span><span class="p">:</span> <span class="dl">"</span><span class="s2">300px</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">height</span><span class="p">:</span> <span class="dl">"</span><span class="s2">200px</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">opacity</span><span class="p">:</span> <span class="mf">0.8</span><span class="p">,</span>
  <span class="na">marginLeft</span><span class="p">:</span> <span class="dl">"</span><span class="s2">50px</span><span class="dl">"</span>
<span class="p">},</span> <span class="mi">600</span><span class="p">);</span>

<span class="c1">// Dengan easing dan callback</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">animate</span><span class="p">({</span>
  <span class="na">left</span><span class="p">:</span> <span class="dl">"</span><span class="s2">+=100px</span><span class="dl">"</span><span class="p">,</span>   <span class="c1">// += berarti relatif dari posisi saat ini</span>
  <span class="na">top</span><span class="p">:</span>  <span class="dl">"</span><span class="s2">-=50px</span><span class="dl">"</span>
<span class="p">},</span> <span class="p">{</span>
  <span class="na">duration</span><span class="p">:</span> <span class="mi">800</span><span class="p">,</span>
  <span class="na">easing</span><span class="p">:</span> <span class="dl">"</span><span class="s2">swing</span><span class="dl">"</span><span class="p">,</span>   <span class="c1">// "linear" atau "swing" (bawaan jQuery)</span>
  <span class="na">complete</span><span class="p">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Animasi selesai!</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">});</span>

<span class="c1">// Animasi berurutan (queue)</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">animate</span><span class="p">({</span> <span class="na">left</span><span class="p">:</span> <span class="dl">"</span><span class="s2">200px</span><span class="dl">"</span> <span class="p">},</span> <span class="mi">500</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">animate</span><span class="p">({</span> <span class="na">top</span><span class="p">:</span> <span class="dl">"</span><span class="s2">100px</span><span class="dl">"</span> <span class="p">},</span> <span class="mi">500</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">animate</span><span class="p">({</span> <span class="na">opacity</span><span class="p">:</span> <span class="mi">0</span> <span class="p">},</span> <span class="mi">300</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span>
  <span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="mengontrol-animasi">Mengontrol Animasi</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Hentikan animasi yang sedang berjalan</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">stop</span><span class="p">();</span>              <span class="c1">// hentikan, tetap di posisi saat ini</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">stop</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>          <span class="c1">// hentikan dan kosongkan antrian animasi</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">stop</span><span class="p">(</span><span class="kc">true</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>    <span class="c1">// hentikan dan lompat ke akhir animasi</span>

<span class="c1">// Contoh: stop sebelum hover animasi baru agar tidak menumpuk</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.card</span><span class="dl">"</span><span class="p">).</span><span class="nf">hover</span><span class="p">(</span>
  <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">stop</span><span class="p">(</span><span class="kc">true</span><span class="p">).</span><span class="nf">animate</span><span class="p">({</span> <span class="na">marginTop</span><span class="p">:</span> <span class="dl">"</span><span class="s2">-5px</span><span class="dl">"</span> <span class="p">},</span> <span class="mi">200</span><span class="p">);</span>
  <span class="p">},</span>
  <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">stop</span><span class="p">(</span><span class="kc">true</span><span class="p">).</span><span class="nf">animate</span><span class="p">({</span> <span class="na">marginTop</span><span class="p">:</span> <span class="dl">"</span><span class="s2">0px</span><span class="dl">"</span> <span class="p">},</span> <span class="mi">200</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">);</span>

<span class="c1">// Delay sebelum animasi</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">delay</span><span class="p">(</span><span class="mi">1000</span><span class="p">).</span><span class="nf">fadeOut</span><span class="p">(</span><span class="mi">500</span><span class="p">);</span>

<span class="c1">// Cek apakah sedang animasi</span>
<span class="k">if </span><span class="p">(</span><span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">is</span><span class="p">(</span><span class="dl">"</span><span class="s2">:animated</span><span class="dl">"</span><span class="p">))</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sedang animasi</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="easing-dengan-jquery-ui">Easing dengan jQuery UI</h2>

<p>jQuery bawaan hanya punya <code class="language-plaintext highlighter-rouge">linear</code> dan <code class="language-plaintext highlighter-rouge">swing</code>. Untuk easing yang lebih kaya, gunakan <strong>jQuery UI</strong> atau plugin <strong>jQuery Easing</strong>:</p>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"https://cdnjs.cloudflare.com/ajax/libs/jquery-easing/1.4.1/jquery.easing.min.js"</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Dengan plugin easing</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#box</span><span class="dl">"</span><span class="p">).</span><span class="nf">animate</span><span class="p">(</span>
  <span class="p">{</span> <span class="na">left</span><span class="p">:</span> <span class="dl">"</span><span class="s2">300px</span><span class="dl">"</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">duration</span><span class="p">:</span> <span class="mi">600</span><span class="p">,</span> <span class="na">easing</span><span class="p">:</span> <span class="dl">"</span><span class="s2">easeOutBounce</span><span class="dl">"</span> <span class="p">}</span>
<span class="p">);</span>

<span class="c1">// Pilihan easing: easeInQuad, easeOutBounce, easeInOutElastic, dll.</span>
</code></pre></div></div>

<hr />

<h2 id="contoh-praktis-loading-spinner">Contoh Praktis: Loading Spinner</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">tampilkanLoading</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">body</span><span class="dl">"</span><span class="p">).</span><span class="nf">append</span><span class="p">(</span><span class="dl">'</span><span class="s1">&lt;div id="overlay"&gt;&lt;div class="spinner"&gt;&lt;/div&gt;&lt;/div&gt;</span><span class="dl">'</span><span class="p">);</span>
  <span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#overlay</span><span class="dl">"</span><span class="p">).</span><span class="nf">hide</span><span class="p">().</span><span class="nf">fadeIn</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nf">sembunyikanLoading</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#overlay</span><span class="dl">"</span><span class="p">).</span><span class="nf">fadeOut</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span>
  <span class="p">});</span>
<span class="p">}</span>

<span class="c1">// Penggunaan</span>
<span class="nf">tampilkanLoading</span><span class="p">();</span>
<span class="nx">$</span><span class="p">.</span><span class="nf">ajax</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/data</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">done</span><span class="p">(</span><span class="nx">data</span> <span class="o">=&gt;</span> <span class="nf">renderData</span><span class="p">(</span><span class="nx">data</span><span class="p">))</span>
  <span class="p">.</span><span class="nf">always</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nf">sembunyikanLoading</span><span class="p">());</span>
</code></pre></div></div>

<hr />

<h2 id="contoh-praktis-smooth-scroll-ke-anchor">Contoh Praktis: Smooth Scroll ke Anchor</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">a[href^='#']</span><span class="dl">"</span><span class="p">).</span><span class="nf">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>

  <span class="kd">const</span> <span class="nx">target</span> <span class="o">=</span> <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nf">getAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">href</span><span class="dl">"</span><span class="p">));</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">target</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>

  <span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">html, body</span><span class="dl">"</span><span class="p">).</span><span class="nf">animate</span><span class="p">({</span>
    <span class="na">scrollTop</span><span class="p">:</span> <span class="nx">target</span><span class="p">.</span><span class="nf">offset</span><span class="p">().</span><span class="nx">top</span> <span class="o">-</span> <span class="mi">80</span>  <span class="c1">// offset untuk navbar fixed</span>
  <span class="p">},</span> <span class="mi">700</span><span class="p">,</span> <span class="dl">"</span><span class="s2">swing</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="contoh-praktis-notification-toast">Contoh Praktis: Notification Toast</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">tampilkanNotif</span><span class="p">(</span><span class="nx">pesan</span><span class="p">,</span> <span class="nx">tipe</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">info</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">warna</span> <span class="o">=</span> <span class="p">{</span> <span class="na">sukses</span><span class="p">:</span> <span class="dl">"</span><span class="s2">#28a745</span><span class="dl">"</span><span class="p">,</span> <span class="na">error</span><span class="p">:</span> <span class="dl">"</span><span class="s2">#dc3545</span><span class="dl">"</span><span class="p">,</span> <span class="na">info</span><span class="p">:</span> <span class="dl">"</span><span class="s2">#17a2b8</span><span class="dl">"</span> <span class="p">};</span>

  <span class="kd">const</span> <span class="nx">toast</span> <span class="o">=</span> <span class="nf">$</span><span class="p">(</span><span class="s2">`
    &lt;div class="toast" style="
      background: </span><span class="p">${</span><span class="nx">warna</span><span class="p">[</span><span class="nx">tipe</span><span class="p">]}</span><span class="s2">;
      color: white;
      padding: 12px 20px;
      border-radius: 4px;
      margin-bottom: 10px;
    "&gt;</span><span class="p">${</span><span class="nx">pesan</span><span class="p">}</span><span class="s2">&lt;/div&gt;
  `</span><span class="p">);</span>

  <span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#toast-container</span><span class="dl">"</span><span class="p">).</span><span class="nf">append</span><span class="p">(</span><span class="nx">toast</span><span class="p">);</span>
  <span class="nx">toast</span><span class="p">.</span><span class="nf">hide</span><span class="p">().</span><span class="nf">slideDown</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>

  <span class="nf">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
    <span class="nx">toast</span><span class="p">.</span><span class="nf">slideUp</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span> <span class="p">});</span>
  <span class="p">},</span> <span class="mi">3000</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// Penggunaan</span>
<span class="nf">tampilkanNotif</span><span class="p">(</span><span class="dl">"</span><span class="s2">Data berhasil disimpan!</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">sukses</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">tampilkanNotif</span><span class="p">(</span><span class="dl">"</span><span class="s2">Terjadi kesalahan!</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">error</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="jquery-effects-vs-css-transitions">jQuery Effects vs CSS Transitions</h2>

<table>
  <thead>
    <tr>
      <th>Aspek</th>
      <th>jQuery Effects</th>
      <th>CSS Transitions/Animations</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Kemudahan</td>
      <td>Sangat mudah</td>
      <td>Butuh pengetahuan CSS</td>
    </tr>
    <tr>
      <td>Performa</td>
      <td>Lebih lambat (JS thread)</td>
      <td>Lebih cepat (GPU)</td>
    </tr>
    <tr>
      <td>Kontrol via JS</td>
      <td>Penuh</td>
      <td>Terbatas</td>
    </tr>
    <tr>
      <td>Callback</td>
      <td>Mudah</td>
      <td>Butuh <code class="language-plaintext highlighter-rouge">animationend</code> event</td>
    </tr>
    <tr>
      <td>Rekomendasi</td>
      <td>Proyek legacy</td>
      <td>Proyek baru</td>
    </tr>
  </tbody>
</table>

<p>Untuk proyek modern, <strong>CSS transitions/animations lebih direkomendasikan</strong> karena berjalan di GPU dan lebih performant. jQuery effects cocok untuk proyek yang sudah menggunakan jQuery.</p>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>jQuery menyediakan cara yang sangat mudah untuk menambahkan animasi dan efek ke halaman web. Dengan <code class="language-plaintext highlighter-rouge">fadeIn</code>, <code class="language-plaintext highlighter-rouge">slideToggle</code>, dan <code class="language-plaintext highlighter-rouge">animate()</code>, kamu bisa membuat UI yang responsif dan menarik tanpa banyak kode.</p>

<p>Di artikel berikutnya, kita bahas <strong>jQuery AJAX</strong> — cara mengambil dan mengirim data ke server menggunakan jQuery yang sangat disederhanakan.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[Salah satu alasan jQuery begitu populer di masa jayanya adalah kemudahan membuat animasi dan efek. Dengan beberapa baris kode jQuery, kamu bisa membuat elemen muncul perlahan, slide ke atas/bawah, atau animasi custom yang kompleks — tanpa perlu memahami detail CSS animation secara mendalam.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Pengenalan jQuery: Library JavaScript yang Menyederhanakan Segalanya</title><link href="https://blog.kiki.my.id/pengenalan-jquery-dasar/" rel="alternate" type="text/html" title="Pengenalan jQuery: Library JavaScript yang Menyederhanakan Segalanya" /><published>2026-10-10T00:00:00+00:00</published><updated>2026-10-10T00:00:00+00:00</updated><id>https://blog.kiki.my.id/pengenalan-jquery-dasar</id><content type="html" xml:base="https://blog.kiki.my.id/pengenalan-jquery-dasar/"><![CDATA[<p>Di era sebelum JavaScript modern (ES6+), menulis kode yang kompatibel di semua browser adalah mimpi buruk. <strong>jQuery</strong> lahir pada 2006 oleh John Resig untuk memecahkan masalah ini dengan motto: <strong>“Write less, do more.”</strong> Meski kini JavaScript native sudah sangat powerful, jQuery masih dipakai di lebih dari 75% website di dunia — termasuk WordPress — sehingga memahaminya tetap sangat relevan.</p>

<hr />

<h2 id="instalasi-jquery">Instalasi jQuery</h2>

<h3 id="via-cdn-paling-mudah">Via CDN (Paling Mudah)</h3>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- Letakkan sebelum &lt;/body&gt; atau di &lt;head&gt; dengan defer --&gt;</span>
<span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"https://code.jquery.com/jquery-3.7.1.min.js"</span>
        <span class="na">integrity=</span><span class="s">"sha256-/JqT3SQfawRcv/BIHPThkBvs0OEvtFFmqPF/lYI/Cxo="</span>
        <span class="na">crossorigin=</span><span class="s">"anonymous"</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<h3 id="via-npm-untuk-project-modern">Via npm (Untuk Project Modern)</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>npm <span class="nb">install </span>jquery
</code></pre></div></div>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">import</span> <span class="nx">$</span> <span class="k">from</span> <span class="dl">"</span><span class="s2">jquery</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<hr />

<h2 id="sintaks-dasar-jquery">Sintaks Dasar jQuery</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Format umum: $(selector).action()</span>

<span class="c1">// $ adalah alias untuk jQuery</span>
<span class="nf">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nf">ready</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="c1">// Kode di sini berjalan setelah DOM siap</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">DOM siap!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// Shorthand yang sama</span>
<span class="nf">$</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">DOM siap!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="selektor-jquery-vs-javascript-native">Selektor jQuery vs JavaScript Native</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// JavaScript native</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#judul</span><span class="dl">"</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">.kartu</span><span class="dl">"</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">navbar</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// jQuery — lebih ringkas, return jQuery object</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#judul</span><span class="dl">"</span><span class="p">);</span>           <span class="c1">// by ID</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.kartu</span><span class="dl">"</span><span class="p">);</span>           <span class="c1">// by class</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">p</span><span class="dl">"</span><span class="p">);</span>               <span class="c1">// by tag</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">input[type=text]</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// by attribute</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">ul &gt; li</span><span class="dl">"</span><span class="p">);</span>          <span class="c1">// CSS selector</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.kartu:first</span><span class="dl">"</span><span class="p">);</span>     <span class="c1">// pseudo-class</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.kartu:last</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.kartu:even</span><span class="dl">"</span><span class="p">);</span>      <span class="c1">// indeks genap</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.kartu:odd</span><span class="dl">"</span><span class="p">);</span>       <span class="c1">// indeks ganjil</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.kartu:eq(2)</span><span class="dl">"</span><span class="p">);</span>     <span class="c1">// indeks ke-2</span>
</code></pre></div></div>

<p>jQuery selector <strong>selalu mengembalikan jQuery object</strong> — kumpulan elemen yang bisa dimanipulasi sekaligus.</p>

<hr />

<h2 id="manipulasi-konten">Manipulasi Konten</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Baca konten</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#judul</span><span class="dl">"</span><span class="p">).</span><span class="nf">text</span><span class="p">();</span>        <span class="c1">// baca teks (tanpa HTML)</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#konten</span><span class="dl">"</span><span class="p">).</span><span class="nf">html</span><span class="p">();</span>       <span class="c1">// baca HTML inner</span>

<span class="c1">// Tulis konten</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#judul</span><span class="dl">"</span><span class="p">).</span><span class="nf">text</span><span class="p">(</span><span class="dl">"</span><span class="s2">Judul Baru</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#konten</span><span class="dl">"</span><span class="p">).</span><span class="nf">html</span><span class="p">(</span><span class="dl">"</span><span class="s2">&lt;strong&gt;Teks tebal&lt;/strong&gt;</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Value pada input</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#email</span><span class="dl">"</span><span class="p">).</span><span class="nf">val</span><span class="p">();</span>            <span class="c1">// baca nilai input</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#email</span><span class="dl">"</span><span class="p">).</span><span class="nf">val</span><span class="p">(</span><span class="dl">"</span><span class="s2">budi@contoh.com</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// set nilai</span>

<span class="c1">// Method chaining — bisa di-chain!</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#judul</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">text</span><span class="p">(</span><span class="dl">"</span><span class="s2">Judul Baru</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">addClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">highlighted</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">css</span><span class="p">(</span><span class="dl">"</span><span class="s2">color</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">blue</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="manipulasi-css-dan-class">Manipulasi CSS dan Class</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// CSS</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">).</span><span class="nf">css</span><span class="p">(</span><span class="dl">"</span><span class="s2">background-color</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">red</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">).</span><span class="nf">css</span><span class="p">({</span>
  <span class="dl">"</span><span class="s2">background-color</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">red</span><span class="dl">"</span><span class="p">,</span>
  <span class="dl">"</span><span class="s2">font-size</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">20px</span><span class="dl">"</span><span class="p">,</span>
  <span class="dl">"</span><span class="s2">padding</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">10px</span><span class="dl">"</span>
<span class="p">});</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">).</span><span class="nf">css</span><span class="p">(</span><span class="dl">"</span><span class="s2">color</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// baca nilai CSS</span>

<span class="c1">// Class</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">).</span><span class="nf">addClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">).</span><span class="nf">removeClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">).</span><span class="nf">toggleClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">).</span><span class="nf">hasClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>          <span class="c1">// true/false</span>

<span class="c1">// Show/hide</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.modal</span><span class="dl">"</span><span class="p">).</span><span class="nf">show</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.modal</span><span class="dl">"</span><span class="p">).</span><span class="nf">hide</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.modal</span><span class="dl">"</span><span class="p">).</span><span class="nf">toggle</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.modal</span><span class="dl">"</span><span class="p">).</span><span class="nf">show</span><span class="p">(</span><span class="mi">300</span><span class="p">);</span>  <span class="c1">// animasi 300ms</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.modal</span><span class="dl">"</span><span class="p">).</span><span class="nf">hide</span><span class="p">(</span><span class="dl">"</span><span class="s2">slow</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="atribut-dan-data">Atribut dan Data</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Atribut HTML</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">img</span><span class="dl">"</span><span class="p">).</span><span class="nf">attr</span><span class="p">(</span><span class="dl">"</span><span class="s2">src</span><span class="dl">"</span><span class="p">);</span>                      <span class="c1">// baca</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">img</span><span class="dl">"</span><span class="p">).</span><span class="nf">attr</span><span class="p">(</span><span class="dl">"</span><span class="s2">src</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">/images/baru.jpg</span><span class="dl">"</span><span class="p">);</span>  <span class="c1">// tulis</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">img</span><span class="dl">"</span><span class="p">).</span><span class="nf">attr</span><span class="p">({</span> <span class="na">src</span><span class="p">:</span> <span class="dl">"</span><span class="s2">/images/baru.jpg</span><span class="dl">"</span><span class="p">,</span> <span class="na">alt</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Gambar baru</span><span class="dl">"</span> <span class="p">});</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">img</span><span class="dl">"</span><span class="p">).</span><span class="nf">removeAttr</span><span class="p">(</span><span class="dl">"</span><span class="s2">alt</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Data attribute (data-*)</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.card</span><span class="dl">"</span><span class="p">).</span><span class="nf">data</span><span class="p">(</span><span class="dl">"</span><span class="s2">id</span><span class="dl">"</span><span class="p">);</span>              <span class="c1">// baca data-id</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.card</span><span class="dl">"</span><span class="p">).</span><span class="nf">data</span><span class="p">(</span><span class="dl">"</span><span class="s2">id</span><span class="dl">"</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>         <span class="c1">// tulis</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.card</span><span class="dl">"</span><span class="p">).</span><span class="nf">removeData</span><span class="p">(</span><span class="dl">"</span><span class="s2">id</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="traversal-dom-dengan-jquery">Traversal DOM dengan jQuery</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Naik</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">parent</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">parents</span><span class="p">(</span><span class="dl">"</span><span class="s2">.container</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">closest</span><span class="p">(</span><span class="dl">"</span><span class="s2">.wrapper</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Turun</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.list</span><span class="dl">"</span><span class="p">).</span><span class="nf">children</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.list</span><span class="dl">"</span><span class="p">).</span><span class="nf">children</span><span class="p">(</span><span class="dl">"</span><span class="s2">li.aktif</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.list</span><span class="dl">"</span><span class="p">).</span><span class="nf">find</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>    <span class="c1">// semua keturunan, bukan hanya children</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.list</span><span class="dl">"</span><span class="p">).</span><span class="nf">find</span><span class="p">(</span><span class="dl">"</span><span class="s2">span</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Saudara</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">next</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">prev</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">siblings</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">siblings</span><span class="p">(</span><span class="dl">"</span><span class="s2">.highlight</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Filter</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">first</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">last</span><span class="p">();</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">eq</span><span class="p">(</span><span class="mi">2</span><span class="p">);</span>         <span class="c1">// elemen indeks ke-2</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">filter</span><span class="p">(</span><span class="dl">"</span><span class="s2">.aktif</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">not</span><span class="p">(</span><span class="dl">"</span><span class="s2">.disabled</span><span class="dl">"</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="tambah-dan-hapus-elemen">Tambah dan Hapus Elemen</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Tambah elemen</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">&lt;li&gt;Item Baru&lt;/li&gt;</span><span class="dl">"</span><span class="p">).</span><span class="nf">appendTo</span><span class="p">(</span><span class="dl">"</span><span class="s2">#daftar</span><span class="dl">"</span><span class="p">);</span>   <span class="c1">// ke akhir</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">&lt;li&gt;Item Awal&lt;/li&gt;</span><span class="dl">"</span><span class="p">).</span><span class="nf">prependTo</span><span class="p">(</span><span class="dl">"</span><span class="s2">#daftar</span><span class="dl">"</span><span class="p">);</span>  <span class="c1">// ke awal</span>

<span class="c1">// Atau dari sisi parent</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#daftar</span><span class="dl">"</span><span class="p">).</span><span class="nf">append</span><span class="p">(</span><span class="dl">"</span><span class="s2">&lt;li&gt;Item Akhir&lt;/li&gt;</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#daftar</span><span class="dl">"</span><span class="p">).</span><span class="nf">prepend</span><span class="p">(</span><span class="dl">"</span><span class="s2">&lt;li&gt;Item Awal&lt;/li&gt;</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#item-2</span><span class="dl">"</span><span class="p">).</span><span class="nf">before</span><span class="p">(</span><span class="dl">"</span><span class="s2">&lt;li&gt;Sebelum Item 2&lt;/li&gt;</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#item-2</span><span class="dl">"</span><span class="p">).</span><span class="nf">after</span><span class="p">(</span><span class="dl">"</span><span class="s2">&lt;li&gt;Sesudah Item 2&lt;/li&gt;</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Hapus elemen</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.hapus</span><span class="dl">"</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span>          <span class="c1">// hapus termasuk event listener</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.bersihkan</span><span class="dl">"</span><span class="p">).</span><span class="nf">empty</span><span class="p">();</span>       <span class="c1">// hapus semua children</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">).</span><span class="nf">detach</span><span class="p">();</span>           <span class="c1">// hapus tapi simpan di memori (bisa dipasang kembali)</span>
</code></pre></div></div>

<hr />

<h2 id="event-handling-dengan-jquery">Event Handling dengan jQuery</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// .on() — cara modern</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#tombol</span><span class="dl">"</span><span class="p">).</span><span class="nf">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">alert</span><span class="p">(</span><span class="dl">"</span><span class="s2">Tombol diklik!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// Shorthand untuk event umum</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.btn</span><span class="dl">"</span><span class="p">).</span><span class="nf">click</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="cm">/* ... */</span> <span class="p">});</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">form</span><span class="dl">"</span><span class="p">).</span><span class="nf">submit</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>
  <span class="cm">/* ... */</span>
<span class="p">});</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">#nama</span><span class="dl">"</span><span class="p">).</span><span class="nf">keyup</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">val</span><span class="p">());</span>  <span class="c1">// $(this) = elemen yang trigger event</span>
<span class="p">});</span>

<span class="c1">// Multiple events sekaligus</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.input</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">focus</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">addClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">fokus</span><span class="dl">"</span><span class="p">);</span> <span class="p">})</span>
  <span class="p">.</span><span class="nf">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">blur</span><span class="dl">"</span><span class="p">,</span>  <span class="kd">function</span><span class="p">()</span> <span class="p">{</span> <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">removeClass</span><span class="p">(</span><span class="dl">"</span><span class="s2">fokus</span><span class="dl">"</span><span class="p">);</span> <span class="p">});</span>

<span class="c1">// Event delegation — untuk elemen dinamis</span>
<span class="nf">$</span><span class="p">(</span><span class="nb">document</span><span class="p">).</span><span class="nf">on</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">.btn-hapus</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">closest</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">remove</span><span class="p">();</span>
<span class="p">});</span>

<span class="c1">// Hapus event listener</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.btn</span><span class="dl">"</span><span class="p">).</span><span class="nf">off</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">.btn</span><span class="dl">"</span><span class="p">).</span><span class="nf">off</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">handlerFunction</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="iterasi-dengan-jquery">Iterasi dengan jQuery</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// .each() — iterasi semua elemen yang cocok</span>
<span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">each</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nx">element</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">index</span><span class="p">,</span> <span class="nf">$</span><span class="p">(</span><span class="nx">element</span><span class="p">).</span><span class="nf">text</span><span class="p">());</span>
  <span class="c1">// atau: console.log(index, $(this).text());</span>
<span class="p">});</span>

<span class="c1">// .map() — transformasi ke array baru</span>
<span class="kd">const</span> <span class="nx">texts</span> <span class="o">=</span> <span class="nf">$</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">).</span><span class="nf">map</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nf">$</span><span class="p">(</span><span class="k">this</span><span class="p">).</span><span class="nf">text</span><span class="p">();</span>
<span class="p">}).</span><span class="nf">get</span><span class="p">();</span>  <span class="c1">// .get() konversi jQuery object ke array biasa</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>jQuery menyederhanakan banyak hal yang verbose di JavaScript native — selektor, manipulasi DOM, event handling, dan AJAX — menjadi API yang ringkas dan konsisten. Meski untuk project baru kamu disarankan pakai JavaScript modern, memahami jQuery tetap penting karena banyak sekali proyek legacy yang masih menggunakannya.</p>

<p>Di artikel berikutnya, kita bahas <strong>jQuery Effects dan Animasi</strong> — cara membuat transisi dan animasi yang menarik dengan mudah.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[Di era sebelum JavaScript modern (ES6+), menulis kode yang kompatibel di semua browser adalah mimpi buruk. jQuery lahir pada 2006 oleh John Resig untuk memecahkan masalah ini dengan motto: “Write less, do more.” Meski kini JavaScript native sudah sangat powerful, jQuery masih dipakai di lebih dari 75% website di dunia — termasuk WordPress — sehingga memahaminya tetap sangat relevan.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">JavaScript Fetch API dan AJAX: Ambil Data dari Server Tanpa Reload</title><link href="https://blog.kiki.my.id/javascript-fetch-api-dan-ajax/" rel="alternate" type="text/html" title="JavaScript Fetch API dan AJAX: Ambil Data dari Server Tanpa Reload" /><published>2026-10-09T00:00:00+00:00</published><updated>2026-10-09T00:00:00+00:00</updated><id>https://blog.kiki.my.id/javascript-fetch-api-dan-ajax</id><content type="html" xml:base="https://blog.kiki.my.id/javascript-fetch-api-dan-ajax/"><![CDATA[<p><strong>AJAX (Asynchronous JavaScript and XML)</strong> adalah teknik yang memungkinkan halaman web berkomunikasi dengan server di latar belakang — tanpa perlu reload halaman. Dulu dilakukan dengan <code class="language-plaintext highlighter-rouge">XMLHttpRequest</code> yang verbose, kini digantikan dengan <strong>Fetch API</strong> yang jauh lebih bersih dan modern.</p>

<hr />

<h2 id="async-javascript-callback-promise-asyncawait">Async JavaScript: Callback, Promise, Async/Await</h2>

<p>Sebelum Fetch API, pahami dulu konsep asynchronous di JavaScript:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Sinkron — berjalan berurutan, memblokir</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Mulai</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="nf">ambilDataDariServer</span><span class="p">();</span>  <span class="c1">// blok sampai selesai</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Selesai</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Asinkron — tidak memblokir, berjalan di background</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Mulai</span><span class="dl">"</span><span class="p">);</span>
<span class="nf">ambilDataDariServer</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">{</span>  <span class="c1">// callback — dijalankan setelah selesai</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Data:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">data</span><span class="p">);</span>
<span class="p">});</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Ini jalan duluan!</span><span class="dl">"</span><span class="p">);</span>
<span class="c1">// Output: "Mulai" → "Ini jalan duluan!" → "Data: ..."</span>
</code></pre></div></div>

<h3 id="promise">Promise</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Promise: representasi nilai yang akan tersedia di masa depan</span>
<span class="kd">const</span> <span class="nx">janji</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Promise</span><span class="p">((</span><span class="nx">resolve</span><span class="p">,</span> <span class="nx">reject</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">berhasil</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">berhasil</span><span class="p">)</span> <span class="nf">resolve</span><span class="p">(</span><span class="dl">"</span><span class="s2">Data berhasil!</span><span class="dl">"</span><span class="p">);</span>
  <span class="k">else</span> <span class="nf">reject</span><span class="p">(</span><span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Gagal!</span><span class="dl">"</span><span class="p">));</span>
<span class="p">});</span>

<span class="nx">janji</span>
  <span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">data</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">data</span><span class="p">))</span>    <span class="c1">// berhasil</span>
  <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">err</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nx">err</span><span class="p">))</span>   <span class="c1">// gagal</span>
  <span class="p">.</span><span class="k">finally</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Selesai</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// selalu dijalankan</span>
</code></pre></div></div>

<h3 id="asyncawait--cara-paling-bersih">Async/Await — Cara Paling Bersih</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nf">ambilData</span><span class="p">()</span> <span class="p">{</span>
  <span class="k">try</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://api.contoh.com/data</span><span class="dl">"</span><span class="p">);</span>
    <span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
    <span class="k">return</span> <span class="nx">data</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Gagal ambil data:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">error</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="fetch-api--dasar">Fetch API — Dasar</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// GET request</span>
<span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">https://jsonplaceholder.typicode.com/posts/1</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">response</span> <span class="o">=&gt;</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">())</span>
  <span class="p">.</span><span class="nf">then</span><span class="p">(</span><span class="nx">data</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">data</span><span class="p">))</span>
  <span class="p">.</span><span class="k">catch</span><span class="p">(</span><span class="nx">error</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nx">error</span><span class="p">));</span>

<span class="c1">// Dengan async/await (lebih bersih)</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nf">getPost</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`https://jsonplaceholder.typicode.com/posts/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>

  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">response</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="s2">`HTTP error! status: </span><span class="p">${</span><span class="nx">response</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
  <span class="k">return</span> <span class="nx">data</span><span class="p">;</span>
<span class="p">}</span>

<span class="nf">getPost</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nf">then</span><span class="p">(</span><span class="nx">post</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">post</span><span class="p">));</span>
</code></pre></div></div>

<hr />

<h2 id="fetch-dengan-berbagai-method-http">Fetch dengan Berbagai Method HTTP</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">BASE_URL</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">https://jsonplaceholder.typicode.com</span><span class="dl">"</span><span class="p">;</span>

<span class="c1">// GET — ambil data</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nf">getUsers</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">BASE_URL</span><span class="p">}</span><span class="s2">/users`</span><span class="p">);</span>
  <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="p">}</span>

<span class="c1">// POST — kirim data baru</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nf">createPost</span><span class="p">(</span><span class="nx">postData</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">BASE_URL</span><span class="p">}</span><span class="s2">/posts`</span><span class="p">,</span> <span class="p">{</span>
    <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">POST</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">headers</span><span class="p">:</span> <span class="p">{</span>
      <span class="dl">"</span><span class="s2">Content-Type</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span><span class="p">,</span>
      <span class="dl">"</span><span class="s2">Authorization</span><span class="dl">"</span><span class="p">:</span> <span class="s2">`Bearer </span><span class="p">${</span><span class="nx">token</span><span class="p">}</span><span class="s2">`</span>
    <span class="p">},</span>
    <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">postData</span><span class="p">)</span>
  <span class="p">});</span>
  <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="p">}</span>

<span class="c1">// PUT — update penuh</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nf">updatePost</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">data</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">BASE_URL</span><span class="p">}</span><span class="s2">/posts/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="p">{</span>
    <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">PUT</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">headers</span><span class="p">:</span> <span class="p">{</span> <span class="dl">"</span><span class="s2">Content-Type</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span> <span class="p">},</span>
    <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span>
  <span class="p">});</span>
  <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="p">}</span>

<span class="c1">// PATCH — update sebagian</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nf">patchPost</span><span class="p">(</span><span class="nx">id</span><span class="p">,</span> <span class="nx">changes</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">BASE_URL</span><span class="p">}</span><span class="s2">/posts/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="p">{</span>
    <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">PATCH</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">headers</span><span class="p">:</span> <span class="p">{</span> <span class="dl">"</span><span class="s2">Content-Type</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span> <span class="p">},</span>
    <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">changes</span><span class="p">)</span>
  <span class="p">});</span>
  <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
<span class="p">}</span>

<span class="c1">// DELETE — hapus data</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nf">deletePost</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">res</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">BASE_URL</span><span class="p">}</span><span class="s2">/posts/</span><span class="p">${</span><span class="nx">id</span><span class="p">}</span><span class="s2">`</span><span class="p">,</span> <span class="p">{</span>
    <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">DELETE</span><span class="dl">"</span>
  <span class="p">});</span>
  <span class="k">return</span> <span class="nx">res</span><span class="p">.</span><span class="nx">ok</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="membuat-wrapper-api-yang-reusable">Membuat Wrapper API yang Reusable</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">api</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">baseURL</span><span class="p">:</span> <span class="dl">"</span><span class="s2">https://api.kiki.my.id</span><span class="dl">"</span><span class="p">,</span>

  <span class="k">async</span> <span class="nf">request</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="nx">options</span> <span class="o">=</span> <span class="p">{})</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">url</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="k">this</span><span class="p">.</span><span class="nx">baseURL</span><span class="p">}${</span><span class="nx">endpoint</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
    <span class="kd">const</span> <span class="nx">headers</span> <span class="o">=</span> <span class="p">{</span>
      <span class="dl">"</span><span class="s2">Content-Type</span><span class="dl">"</span><span class="p">:</span> <span class="dl">"</span><span class="s2">application/json</span><span class="dl">"</span><span class="p">,</span>
      <span class="p">...</span><span class="nx">options</span><span class="p">.</span><span class="nx">headers</span>
    <span class="p">};</span>

    <span class="kd">const</span> <span class="nx">token</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nf">getItem</span><span class="p">(</span><span class="dl">"</span><span class="s2">token</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">if </span><span class="p">(</span><span class="nx">token</span><span class="p">)</span> <span class="nx">headers</span><span class="p">[</span><span class="dl">"</span><span class="s2">Authorization</span><span class="dl">"</span><span class="p">]</span> <span class="o">=</span> <span class="s2">`Bearer </span><span class="p">${</span><span class="nx">token</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>

    <span class="kd">const</span> <span class="nx">response</span> <span class="o">=</span> <span class="k">await</span> <span class="nf">fetch</span><span class="p">(</span><span class="nx">url</span><span class="p">,</span> <span class="p">{</span> <span class="p">...</span><span class="nx">options</span><span class="p">,</span> <span class="nx">headers</span> <span class="p">});</span>

    <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">response</span><span class="p">.</span><span class="nx">ok</span><span class="p">)</span> <span class="p">{</span>
      <span class="kd">const</span> <span class="nx">error</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">().</span><span class="k">catch</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">({}));</span>
      <span class="k">throw</span> <span class="k">new</span> <span class="nc">Error</span><span class="p">(</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span> <span class="o">||</span> <span class="s2">`HTTP </span><span class="p">${</span><span class="nx">response</span><span class="p">.</span><span class="nx">status</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">if </span><span class="p">(</span><span class="nx">response</span><span class="p">.</span><span class="nx">status</span> <span class="o">===</span> <span class="mi">204</span><span class="p">)</span> <span class="k">return</span> <span class="kc">null</span><span class="p">;</span>
    <span class="k">return</span> <span class="nx">response</span><span class="p">.</span><span class="nf">json</span><span class="p">();</span>
  <span class="p">},</span>

  <span class="nf">get</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">)</span>         <span class="p">{</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">);</span> <span class="p">},</span>
  <span class="nf">post</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="nx">data</span><span class="p">)</span>  <span class="p">{</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="p">{</span> <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">POST</span><span class="dl">"</span><span class="p">,</span> <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">});</span> <span class="p">},</span>
  <span class="nf">put</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="nx">data</span><span class="p">)</span>   <span class="p">{</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="p">{</span> <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">PUT</span><span class="dl">"</span><span class="p">,</span> <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">});</span> <span class="p">},</span>
  <span class="nf">patch</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="nx">data</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="p">{</span> <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">PATCH</span><span class="dl">"</span><span class="p">,</span> <span class="na">body</span><span class="p">:</span> <span class="nx">JSON</span><span class="p">.</span><span class="nf">stringify</span><span class="p">(</span><span class="nx">data</span><span class="p">)</span> <span class="p">});</span> <span class="p">},</span>
  <span class="k">delete</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">)</span>      <span class="p">{</span> <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nf">request</span><span class="p">(</span><span class="nx">endpoint</span><span class="p">,</span> <span class="p">{</span> <span class="na">method</span><span class="p">:</span> <span class="dl">"</span><span class="s2">DELETE</span><span class="dl">"</span> <span class="p">});</span> <span class="p">}</span>
<span class="p">};</span>

<span class="c1">// Penggunaan</span>
<span class="kd">const</span> <span class="nx">posts</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">api</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">"</span><span class="s2">/posts</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">newPost</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">api</span><span class="p">.</span><span class="nf">post</span><span class="p">(</span><span class="dl">"</span><span class="s2">/posts</span><span class="dl">"</span><span class="p">,</span> <span class="p">{</span> <span class="na">title</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Judul</span><span class="dl">"</span><span class="p">,</span> <span class="na">body</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Isi...</span><span class="dl">"</span> <span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="contoh-praktis-tampilkan-data-dari-api">Contoh Praktis: Tampilkan Data dari API</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"loading"</span> <span class="na">style=</span><span class="s">"display:none"</span><span class="nt">&gt;</span>Memuat data...<span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"error"</span> <span class="na">style=</span><span class="s">"display:none"</span><span class="nt">&gt;&lt;/div&gt;</span>
<span class="nt">&lt;ul</span> <span class="na">id=</span><span class="s">"daftar-user"</span><span class="nt">&gt;&lt;/ul&gt;</span>
</code></pre></div></div>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="kd">function</span> <span class="nf">tampilkanUsers</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">loading</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#loading</span><span class="dl">"</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">errorEl</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#error</span><span class="dl">"</span><span class="p">);</span>
  <span class="kd">const</span> <span class="nx">daftar</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#daftar-user</span><span class="dl">"</span><span class="p">);</span>

  <span class="nx">loading</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">block</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">errorEl</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">none</span><span class="dl">"</span><span class="p">;</span>

  <span class="k">try</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">users</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">api</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">"</span><span class="s2">/users</span><span class="dl">"</span><span class="p">);</span>

    <span class="nx">daftar</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="nx">users</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">user</span> <span class="o">=&gt;</span> <span class="s2">`
      &lt;li&gt;
        &lt;strong&gt;</span><span class="p">${</span><span class="nx">user</span><span class="p">.</span><span class="nx">nama</span><span class="p">}</span><span class="s2">&lt;/strong&gt; — </span><span class="p">${</span><span class="nx">user</span><span class="p">.</span><span class="nx">email</span><span class="p">}</span><span class="s2">
      &lt;/li&gt;
    `</span><span class="p">).</span><span class="nf">join</span><span class="p">(</span><span class="dl">""</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">catch </span><span class="p">(</span><span class="nx">error</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">errorEl</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`Error: </span><span class="p">${</span><span class="nx">error</span><span class="p">.</span><span class="nx">message</span><span class="p">}</span><span class="s2">`</span><span class="p">;</span>
    <span class="nx">errorEl</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">block</span><span class="dl">"</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">finally</span> <span class="p">{</span>
    <span class="nx">loading</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">none</span><span class="dl">"</span><span class="p">;</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">DOMContentLoaded</span><span class="dl">"</span><span class="p">,</span> <span class="nx">tampilkanUsers</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="promiseall--beberapa-request-paralel">Promise.all — Beberapa Request Paralel</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Jalankan beberapa fetch SECARA BERSAMAAN</span>
<span class="k">async</span> <span class="kd">function</span> <span class="nf">loadDashboard</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="p">[</span><span class="nx">users</span><span class="p">,</span> <span class="nx">posts</span><span class="p">,</span> <span class="nx">stats</span><span class="p">]</span> <span class="o">=</span> <span class="k">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nf">all</span><span class="p">([</span>
    <span class="nx">api</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">"</span><span class="s2">/users</span><span class="dl">"</span><span class="p">),</span>
    <span class="nx">api</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">"</span><span class="s2">/posts</span><span class="dl">"</span><span class="p">),</span>
    <span class="nx">api</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="dl">"</span><span class="s2">/stats</span><span class="dl">"</span><span class="p">)</span>
  <span class="p">]);</span>

  <span class="nf">renderUsers</span><span class="p">(</span><span class="nx">users</span><span class="p">);</span>
  <span class="nf">renderPosts</span><span class="p">(</span><span class="nx">posts</span><span class="p">);</span>
  <span class="nf">renderStats</span><span class="p">(</span><span class="nx">stats</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// Promise.allSettled — jalan semua, tidak peduli yang gagal</span>
<span class="kd">const</span> <span class="nx">results</span> <span class="o">=</span> <span class="k">await</span> <span class="nb">Promise</span><span class="p">.</span><span class="nf">allSettled</span><span class="p">([</span>
  <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/a</span><span class="dl">"</span><span class="p">),</span>
  <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/b</span><span class="dl">"</span><span class="p">),</span>
  <span class="nf">fetch</span><span class="p">(</span><span class="dl">"</span><span class="s2">/api/c</span><span class="dl">"</span><span class="p">)</span>
<span class="p">]);</span>

<span class="nx">results</span><span class="p">.</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">result</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">result</span><span class="p">.</span><span class="nx">status</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">fulfilled</span><span class="dl">"</span><span class="p">)</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">result</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
  <span class="k">else</span> <span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="nx">result</span><span class="p">.</span><span class="nx">reason</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Fetch API dengan async/await adalah cara standar modern untuk berkomunikasi dengan server dari JavaScript. Dengan membuat wrapper API yang reusable, kode AJAX kamu menjadi bersih, konsisten, dan mudah di-maintain.</p>

<p>Di artikel berikutnya, kita masuk ke dunia <strong>jQuery</strong> — library JavaScript yang menyederhanakan manipulasi DOM dan AJAX.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[AJAX (Asynchronous JavaScript and XML) adalah teknik yang memungkinkan halaman web berkomunikasi dengan server di latar belakang — tanpa perlu reload halaman. Dulu dilakukan dengan XMLHttpRequest yang verbose, kini digantikan dengan Fetch API yang jauh lebih bersih dan modern.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">JavaScript Event Handling: Respons terhadap Interaksi Pengguna</title><link href="https://blog.kiki.my.id/javascript-event-handling/" rel="alternate" type="text/html" title="JavaScript Event Handling: Respons terhadap Interaksi Pengguna" /><published>2026-10-08T00:00:00+00:00</published><updated>2026-10-08T00:00:00+00:00</updated><id>https://blog.kiki.my.id/javascript-event-handling</id><content type="html" xml:base="https://blog.kiki.my.id/javascript-event-handling/"><![CDATA[<p><strong>Event</strong> adalah sinyal yang dikirim browser ketika sesuatu terjadi — pengguna klik tombol, mengetik di input, menggerakkan mouse, menekan tombol keyboard, halaman selesai dimuat, dan ratusan event lainnya. <strong>Event Handling</strong> adalah cara JavaScript merespons event-event tersebut dan menjalankan kode yang sesuai.</p>

<hr />

<h2 id="addeventlistener--cara-modern-menangani-event">addEventListener — Cara Modern Menangani Event</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">tombol</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#tombol-kirim</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// addEventListener(namaEvent, callbackFunction)</span>
<span class="nx">tombol</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Tombol diklik!</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">event</span><span class="p">);</span>  <span class="c1">// objek Event berisi detail event</span>
<span class="p">});</span>

<span class="c1">// Dengan arrow function</span>
<span class="nx">tombol</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Diklik!</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">);</span>  <span class="c1">// e.target = elemen yang di-klik</span>
<span class="p">});</span>

<span class="c1">// Hapus event listener</span>
<span class="kd">function</span> <span class="nf">handleClick</span><span class="p">()</span> <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">klik</span><span class="dl">"</span><span class="p">);</span> <span class="p">}</span>
<span class="nx">tombol</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">handleClick</span><span class="p">);</span>
<span class="nx">tombol</span><span class="p">.</span><span class="nf">removeEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">handleClick</span><span class="p">);</span>  <span class="c1">// harus referensi fungsi yang sama</span>
</code></pre></div></div>

<hr />

<h2 id="jenis-jenis-event-yang-umum">Jenis-Jenis Event yang Umum</h2>

<h3 id="mouse-events">Mouse Events</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">box</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">box</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span>      <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">klik</span><span class="dl">"</span><span class="p">));</span>
<span class="nx">box</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">dblclick</span><span class="dl">"</span><span class="p">,</span>   <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">double klik</span><span class="dl">"</span><span class="p">));</span>
<span class="nx">box</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouseenter</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouse masuk</span><span class="dl">"</span><span class="p">));</span>
<span class="nx">box</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouseleave</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">mouse keluar</span><span class="dl">"</span><span class="p">));</span>
<span class="nx">box</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">mousemove</span><span class="dl">"</span><span class="p">,</span>  <span class="nx">e</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Posisi: </span><span class="p">${</span><span class="nx">e</span><span class="p">.</span><span class="nx">clientX</span><span class="p">}</span><span class="s2">, </span><span class="p">${</span><span class="nx">e</span><span class="p">.</span><span class="nx">clientY</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">});</span>
<span class="nx">box</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">contextmenu</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>  <span class="c1">// cegah menu kanan bawaan browser</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">klik kanan</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<h3 id="keyboard-events">Keyboard Events</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">keydown</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Tombol ditekan: </span><span class="p">${</span><span class="nx">e</span><span class="p">.</span><span class="nx">key</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Kode: </span><span class="p">${</span><span class="nx">e</span><span class="p">.</span><span class="nx">code</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>

  <span class="c1">// Cek kombinasi tombol</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">ctrlKey</span> <span class="o">&amp;&amp;</span> <span class="nx">e</span><span class="p">.</span><span class="nx">key</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">s</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>  <span class="c1">// cegah save browser</span>
    <span class="nf">simpanData</span><span class="p">();</span>
  <span class="p">}</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">key</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">Escape</span><span class="dl">"</span><span class="p">)</span> <span class="nf">tutupModal</span><span class="p">();</span>
<span class="p">});</span>

<span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">keyup</span><span class="dl">"</span><span class="p">,</span>   <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">tombol dilepas</span><span class="dl">"</span><span class="p">));</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">keypress</span><span class="dl">"</span><span class="p">,</span><span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">karakter diketik</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// deprecated</span>
</code></pre></div></div>

<h3 id="form-events">Form Events</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">form</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">form</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">input</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">input</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">form</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">submit</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>                   <span class="c1">// PENTING: cegah reload</span>
  <span class="kd">const</span> <span class="nx">data</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">FormData</span><span class="p">(</span><span class="nx">form</span><span class="p">);</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nb">Object</span><span class="p">.</span><span class="nf">fromEntries</span><span class="p">(</span><span class="nx">data</span><span class="p">));</span>
<span class="p">});</span>

<span class="nx">input</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">input</span><span class="dl">"</span><span class="p">,</span>  <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">nilai berubah:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">));</span>
<span class="nx">input</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">change</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">blur setelah berubah</span><span class="dl">"</span><span class="p">));</span>
<span class="nx">input</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">focus</span><span class="dl">"</span><span class="p">,</span>  <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">input difokus</span><span class="dl">"</span><span class="p">));</span>
<span class="nx">input</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">blur</span><span class="dl">"</span><span class="p">,</span>   <span class="nx">e</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">focus hilang</span><span class="dl">"</span><span class="p">));</span>
</code></pre></div></div>

<h3 id="window-dan-document-events">Window dan Document Events</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Halaman selesai dimuat sepenuhnya (termasuk gambar)</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">load</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">semua resource dimuat</span><span class="dl">"</span><span class="p">));</span>

<span class="c1">// DOM siap, gambar belum tentu (lebih cepat dari load)</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">DOMContentLoaded</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">DOM siap</span><span class="dl">"</span><span class="p">);</span>
  <span class="nf">initApp</span><span class="p">();</span>
<span class="p">});</span>

<span class="c1">// Scroll</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">scroll</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">scrollY</span> <span class="o">=</span> <span class="nb">window</span><span class="p">.</span><span class="nx">scrollY</span><span class="p">;</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">scrollY</span> <span class="o">&gt;</span> <span class="mi">300</span><span class="p">)</span> <span class="nx">navbar</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">sticky</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// Resize</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">resize</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Lebar: </span><span class="p">${</span><span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">}</span><span class="s2">, Tinggi: </span><span class="p">${</span><span class="nb">window</span><span class="p">.</span><span class="nx">innerHeight</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// Sebelum meninggalkan halaman</span>
<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">beforeunload</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>
  <span class="nx">e</span><span class="p">.</span><span class="nx">returnValue</span> <span class="o">=</span> <span class="dl">""</span><span class="p">;</span>  <span class="c1">// trigger dialog "tinggalkan halaman?"</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="objek-event">Objek Event</h2>

<p>Setiap event listener menerima objek <strong>Event</strong> yang berisi informasi detail:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">a</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>    <span class="c1">// cegah perilaku default (navigasi link)</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">stopPropagation</span><span class="p">();</span>   <span class="c1">// hentikan event bubble ke parent</span>

  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">type</span><span class="p">);</span>       <span class="c1">// "click"</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">);</span>     <span class="c1">// elemen yang memicu event</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">currentTarget</span><span class="p">);</span> <span class="c1">// elemen yang punya listener</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">timeStamp</span><span class="p">);</span>  <span class="c1">// waktu event terjadi</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="event-bubbling-dan-capturing">Event Bubbling dan Capturing</h2>

<p>Event di DOM berjalan dalam dua fase:</p>
<ol>
  <li><strong>Capturing</strong> (atas ke bawah): dari document ke target</li>
  <li><strong>Bubbling</strong> (bawah ke atas): dari target kembali ke document</li>
</ol>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"luar"</span><span class="nt">&gt;</span>
  <span class="nt">&lt;div</span> <span class="na">id=</span><span class="s">"dalam"</span><span class="nt">&gt;</span>
    <span class="nt">&lt;button</span> <span class="na">id=</span><span class="s">"tombol"</span><span class="nt">&gt;</span>Klik<span class="nt">&lt;/button&gt;</span>
  <span class="nt">&lt;/div&gt;</span>
<span class="nt">&lt;/div&gt;</span>
</code></pre></div></div>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Secara default: bubbling (dari dalam ke luar)</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#tombol</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">tombol</span><span class="dl">"</span><span class="p">));</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#dalam</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">dalam</span><span class="dl">"</span><span class="p">));</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#luar</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">luar</span><span class="dl">"</span><span class="p">));</span>
<span class="c1">// Output saat klik tombol: "tombol" → "dalam" → "luar"</span>

<span class="c1">// Hentikan bubbling</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#dalam</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">stopPropagation</span><span class="p">();</span>  <span class="c1">// event tidak naik ke #luar</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">dalam — event berhenti di sini</span><span class="dl">"</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// Capturing — parameter ketiga: true</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#luar</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">luar (capturing)</span><span class="dl">"</span><span class="p">);</span>
<span class="p">},</span> <span class="kc">true</span><span class="p">);</span>
<span class="c1">// Output: "luar" → "dalam" → "tombol"</span>
</code></pre></div></div>

<hr />

<h2 id="event-delegation--satu-listener-untuk-banyak-elemen">Event Delegation — Satu Listener untuk Banyak Elemen</h2>

<p>Daripada menambahkan listener ke setiap elemen, pasang satu listener di parent dan manfaatkan bubbling:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// KURANG EFISIEN — listener di setiap item</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">.btn-hapus</span><span class="dl">"</span><span class="p">).</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">btn</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">btn</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="nx">hapusItem</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// LEBIH BAIK — event delegation</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#daftar</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
  <span class="c1">// Cek apakah yang diklik adalah tombol hapus</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nf">matches</span><span class="p">(</span><span class="dl">"</span><span class="s2">.btn-hapus</span><span class="dl">"</span><span class="p">))</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">li</span> <span class="o">=</span> <span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nf">closest</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
    <span class="nx">li</span><span class="p">.</span><span class="nf">remove</span><span class="p">();</span>
  <span class="p">}</span>

  <span class="c1">// Cek tombol edit</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nf">matches</span><span class="p">(</span><span class="dl">"</span><span class="s2">.btn-edit</span><span class="dl">"</span><span class="p">))</span> <span class="p">{</span>
    <span class="kd">const</span> <span class="nx">id</span> <span class="o">=</span> <span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
    <span class="nf">editItem</span><span class="p">(</span><span class="nx">id</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">});</span>
</code></pre></div></div>

<p>Keuntungan: bekerja untuk elemen yang <strong>ditambahkan secara dinamis</strong> setelah listener dipasang.</p>

<hr />

<h2 id="debounce-dan-throttle">Debounce dan Throttle</h2>

<p>Event seperti <code class="language-plaintext highlighter-rouge">scroll</code>, <code class="language-plaintext highlighter-rouge">resize</code>, dan <code class="language-plaintext highlighter-rouge">input</code> bisa trigger ratusan kali per detik. Debounce dan throttle membatasi frekuensi eksekusi:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Debounce — tunggu N ms setelah event terakhir</span>
<span class="kd">function</span> <span class="nf">debounce</span><span class="p">(</span><span class="nx">fn</span><span class="p">,</span> <span class="nx">delay</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">let</span> <span class="nx">timer</span><span class="p">;</span>
  <span class="k">return</span> <span class="kd">function</span><span class="p">(...</span><span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
    <span class="nf">clearTimeout</span><span class="p">(</span><span class="nx">timer</span><span class="p">);</span>
    <span class="nx">timer</span> <span class="o">=</span> <span class="nf">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nx">fn</span><span class="p">.</span><span class="nf">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">args</span><span class="p">),</span> <span class="nx">delay</span><span class="p">);</span>
  <span class="p">};</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">cariProduk</span> <span class="o">=</span> <span class="nf">debounce</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Mencari:</span><span class="dl">"</span><span class="p">,</span> <span class="nx">e</span><span class="p">.</span><span class="nx">target</span><span class="p">.</span><span class="nx">value</span><span class="p">);</span>
  <span class="c1">// panggil API di sini</span>
<span class="p">},</span> <span class="mi">400</span><span class="p">);</span>

<span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#search</span><span class="dl">"</span><span class="p">).</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">input</span><span class="dl">"</span><span class="p">,</span> <span class="nx">cariProduk</span><span class="p">);</span>

<span class="c1">// Throttle — eksekusi maksimal sekali per N ms</span>
<span class="kd">function</span> <span class="nf">throttle</span><span class="p">(</span><span class="nx">fn</span><span class="p">,</span> <span class="nx">limit</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">let</span> <span class="nx">inThrottle</span><span class="p">;</span>
  <span class="k">return</span> <span class="kd">function</span><span class="p">(...</span><span class="nx">args</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">inThrottle</span><span class="p">)</span> <span class="p">{</span>
      <span class="nx">fn</span><span class="p">.</span><span class="nf">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">args</span><span class="p">);</span>
      <span class="nx">inThrottle</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
      <span class="nf">setTimeout</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="nx">inThrottle</span> <span class="o">=</span> <span class="kc">false</span><span class="p">,</span> <span class="nx">limit</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">};</span>
<span class="p">}</span>

<span class="nb">window</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">scroll</span><span class="dl">"</span><span class="p">,</span> <span class="nf">throttle</span><span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Scroll position:</span><span class="dl">"</span><span class="p">,</span> <span class="nb">window</span><span class="p">.</span><span class="nx">scrollY</span><span class="p">);</span>
<span class="p">},</span> <span class="mi">200</span><span class="p">));</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Event handling adalah fondasi dari semua interaktivitas di web. Dengan <code class="language-plaintext highlighter-rouge">addEventListener</code>, memahami bubbling, dan teknik event delegation, kamu bisa membangun UI yang responsif dan efisien.</p>

<p>Di artikel berikutnya, kita masuk ke <strong>AJAX dan Fetch API</strong> — cara JavaScript berkomunikasi dengan server tanpa reload halaman.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[Event adalah sinyal yang dikirim browser ketika sesuatu terjadi — pengguna klik tombol, mengetik di input, menggerakkan mouse, menekan tombol keyboard, halaman selesai dimuat, dan ratusan event lainnya. Event Handling adalah cara JavaScript merespons event-event tersebut dan menjalankan kode yang sesuai.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">JavaScript DOM Manipulation: Cara Berinteraksi dengan Elemen HTML</title><link href="https://blog.kiki.my.id/javascript-dom-manipulation/" rel="alternate" type="text/html" title="JavaScript DOM Manipulation: Cara Berinteraksi dengan Elemen HTML" /><published>2026-10-07T00:00:00+00:00</published><updated>2026-10-07T00:00:00+00:00</updated><id>https://blog.kiki.my.id/javascript-dom-manipulation</id><content type="html" xml:base="https://blog.kiki.my.id/javascript-dom-manipulation/"><![CDATA[<p><strong>DOM (Document Object Model)</strong> adalah representasi halaman HTML sebagai pohon objek JavaScript. Ketika browser memuat halaman web, ia membuat DOM — dan JavaScript bisa membaca, mengubah, menambah, atau menghapus elemen DOM secara dinamis tanpa perlu reload halaman. Inilah yang membuat halaman web menjadi interaktif.</p>

<hr />

<h2 id="struktur-dom">Struktur DOM</h2>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html&gt;</span>
  <span class="nt">&lt;head&gt;</span>
    <span class="nt">&lt;title&gt;</span>Halaman Saya<span class="nt">&lt;/title&gt;</span>
  <span class="nt">&lt;/head&gt;</span>
  <span class="nt">&lt;body&gt;</span>
    <span class="nt">&lt;h1</span> <span class="na">id=</span><span class="s">"judul"</span><span class="nt">&gt;</span>Selamat Datang<span class="nt">&lt;/h1&gt;</span>
    <span class="nt">&lt;p</span> <span class="na">class=</span><span class="s">"teks"</span><span class="nt">&gt;</span>Ini paragraf pertama.<span class="nt">&lt;/p&gt;</span>
    <span class="nt">&lt;ul&gt;</span>
      <span class="nt">&lt;li&gt;</span>Item 1<span class="nt">&lt;/li&gt;</span>
      <span class="nt">&lt;li&gt;</span>Item 2<span class="nt">&lt;/li&gt;</span>
    <span class="nt">&lt;/ul&gt;</span>
  <span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>document
  └── html
        ├── head
        │     └── title
        └── body
              ├── h1 #judul
              ├── p .teks
              └── ul
                    ├── li
                    └── li
</code></pre></div></div>

<hr />

<h2 id="memilih-elemen-selector">Memilih Elemen (Selector)</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// querySelector — pilih elemen pertama yang cocok (CSS selector)</span>
<span class="kd">const</span> <span class="nx">judul</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#judul</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">teks</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.teks</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">btn</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">button</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">input</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">input[type='email']</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// querySelectorAll — pilih SEMUA elemen yang cocok (NodeList)</span>
<span class="kd">const</span> <span class="nx">semuaLi</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">ul li</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">semuaCard</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelectorAll</span><span class="p">(</span><span class="dl">"</span><span class="s2">.card</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Cara lama (masih berlaku)</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">judul</span><span class="dl">"</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">getElementsByClassName</span><span class="p">(</span><span class="dl">"</span><span class="s2">teks</span><span class="dl">"</span><span class="p">);</span>  <span class="c1">// HTMLCollection</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">getElementsByTagName</span><span class="p">(</span><span class="dl">"</span><span class="s2">p</span><span class="dl">"</span><span class="p">);</span>       <span class="c1">// HTMLCollection</span>

<span class="c1">// Iterasi querySelectorAll</span>
<span class="nx">semuaLi</span><span class="p">.</span><span class="nf">forEach</span><span class="p">(</span><span class="nx">li</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">li</span><span class="p">.</span><span class="nx">textContent</span><span class="p">);</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="membaca-dan-mengubah-konten">Membaca dan Mengubah Konten</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">el</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#judul</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Membaca konten</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">el</span><span class="p">.</span><span class="nx">textContent</span><span class="p">);</span>   <span class="c1">// teks murni (tanpa tag HTML)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">el</span><span class="p">.</span><span class="nx">innerHTML</span><span class="p">);</span>      <span class="c1">// termasuk tag HTML di dalamnya</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">el</span><span class="p">.</span><span class="nx">outerHTML</span><span class="p">);</span>      <span class="c1">// termasuk tag elemennya sendiri</span>

<span class="c1">// Mengubah konten</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Judul Baru</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Judul &lt;strong&gt;Baru&lt;/strong&gt;</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// hati-hati XSS!</span>

<span class="c1">// Cara aman menambah konten (tanpa risiko XSS)</span>
<span class="kd">const</span> <span class="nx">p</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">p</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">p</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">&lt;script&gt;alert('xss')&lt;/script&gt;</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// ditampilkan literal, aman</span>
</code></pre></div></div>

<hr />

<h2 id="mengubah-style-dan-class">Mengubah Style dan Class</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">box</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.box</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Mengubah style langsung (inline style)</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">backgroundColor</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">red</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">fontSize</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">20px</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">none</span><span class="dl">"</span><span class="p">;</span>      <span class="c1">// sembunyikan</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">display</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">block</span><span class="dl">"</span><span class="p">;</span>     <span class="c1">// tampilkan kembali</span>

<span class="c1">// Lebih baik: manipulasi via class</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>          <span class="c1">// tambah class</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">remove</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>       <span class="c1">// hapus class</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">toggle</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>       <span class="c1">// tambah jika tidak ada, hapus jika ada</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">contains</span><span class="p">(</span><span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">);</span>     <span class="c1">// cek apakah punya class</span>

<span class="c1">// Set class sekaligus (mengganti semua class)</span>
<span class="nx">box</span><span class="p">.</span><span class="nx">className</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">card aktif highlighted</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<hr />

<h2 id="mengubah-atribut">Mengubah Atribut</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">img</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">img</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">link</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">a</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Baca atribut</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">img</span><span class="p">.</span><span class="nf">getAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">src</span><span class="dl">"</span><span class="p">));</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">img</span><span class="p">.</span><span class="nx">alt</span><span class="p">);</span>  <span class="c1">// properti HTML standar bisa diakses langsung</span>

<span class="c1">// Ubah atribut</span>
<span class="nx">img</span><span class="p">.</span><span class="nf">setAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">src</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">/assets/images/baru.jpg</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">img</span><span class="p">.</span><span class="nf">setAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">alt</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">Deskripsi gambar baru</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">link</span><span class="p">.</span><span class="nx">href</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">https://kiki.my.id</span><span class="dl">"</span><span class="p">;</span>

<span class="c1">// Hapus atribut</span>
<span class="nx">img</span><span class="p">.</span><span class="nf">removeAttribute</span><span class="p">(</span><span class="dl">"</span><span class="s2">alt</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Data attribute</span>
<span class="kd">const</span> <span class="nx">card</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">[data-id]</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">card</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">id</span><span class="p">);</span>       <span class="c1">// nilai data-id</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">card</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">kategori</span><span class="p">);</span> <span class="c1">// nilai data-kategori</span>
<span class="nx">card</span><span class="p">.</span><span class="nx">dataset</span><span class="p">.</span><span class="nx">status</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">aktif</span><span class="dl">"</span><span class="p">;</span>      <span class="c1">// set data-status="aktif"</span>
</code></pre></div></div>

<hr />

<h2 id="membuat-dan-menambah-elemen-baru">Membuat dan Menambah Elemen Baru</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Buat elemen baru</span>
<span class="kd">const</span> <span class="nx">li</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">li</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Item Baru</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">li</span><span class="p">.</span><span class="nx">classList</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="dl">"</span><span class="s2">item-list</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Tambahkan ke DOM</span>
<span class="kd">const</span> <span class="nx">ul</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">ul</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">ul</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">li</span><span class="p">);</span>                    <span class="c1">// tambah di akhir</span>
<span class="nx">ul</span><span class="p">.</span><span class="nf">prepend</span><span class="p">(</span><span class="nx">li</span><span class="p">);</span>                        <span class="c1">// tambah di awal</span>
<span class="nx">ul</span><span class="p">.</span><span class="nf">insertBefore</span><span class="p">(</span><span class="nx">li</span><span class="p">,</span> <span class="nx">ul</span><span class="p">.</span><span class="nx">children</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>   <span class="c1">// sisipkan sebelum elemen indeks 1</span>

<span class="c1">// insertAdjacentHTML — cara cepat</span>
<span class="nx">ul</span><span class="p">.</span><span class="nf">insertAdjacentHTML</span><span class="p">(</span><span class="dl">"</span><span class="s2">beforeend</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">&lt;li class='item-list'&gt;Item dari HTML&lt;/li&gt;</span><span class="dl">"</span><span class="p">);</span>
<span class="c1">// Posisi: "beforebegin", "afterbegin", "beforeend", "afterend"</span>

<span class="c1">// Cara modern: append dengan teks atau node</span>
<span class="nx">ul</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="dl">"</span><span class="s2">teks biasa</span><span class="dl">"</span><span class="p">,</span> <span class="nx">li</span><span class="p">,</span> <span class="nb">document</span><span class="p">.</span><span class="nf">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">));</span>
</code></pre></div></div>

<hr />

<h2 id="menghapus-elemen">Menghapus Elemen</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">el</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.hapus-saya</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Cara modern</span>
<span class="nx">el</span><span class="p">.</span><span class="nf">remove</span><span class="p">();</span>

<span class="c1">// Cara lama (via parent)</span>
<span class="nx">el</span><span class="p">.</span><span class="nx">parentNode</span><span class="p">.</span><span class="nf">removeChild</span><span class="p">(</span><span class="nx">el</span><span class="p">);</span>

<span class="c1">// Hapus semua child</span>
<span class="kd">const</span> <span class="nx">container</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#container</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">container</span><span class="p">.</span><span class="nx">innerHTML</span> <span class="o">=</span> <span class="dl">""</span><span class="p">;</span>  <span class="c1">// cepat tapi tidak optimal</span>
<span class="k">while </span><span class="p">(</span><span class="nx">container</span><span class="p">.</span><span class="nx">firstChild</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">container</span><span class="p">.</span><span class="nf">removeChild</span><span class="p">(</span><span class="nx">container</span><span class="p">.</span><span class="nx">firstChild</span><span class="p">);</span>  <span class="c1">// lebih bersih</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="traversal-dom--navigasi-antar-elemen">Traversal DOM — Navigasi Antar Elemen</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">item</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.item</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Naik ke parent</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">parentElement</span><span class="p">;</span>
<span class="nx">item</span><span class="p">.</span><span class="nf">closest</span><span class="p">(</span><span class="dl">"</span><span class="s2">.container</span><span class="dl">"</span><span class="p">);</span>  <span class="c1">// cari ancestor terdekat yang cocok selector</span>

<span class="c1">// Turun ke children</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">children</span><span class="p">;</span>               <span class="c1">// semua child elements (HTMLCollection)</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">firstElementChild</span><span class="p">;</span>      <span class="c1">// child pertama</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">lastElementChild</span><span class="p">;</span>       <span class="c1">// child terakhir</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">childNodes</span><span class="p">;</span>             <span class="c1">// semua child nodes (termasuk teks dan komentar)</span>

<span class="c1">// Saudara (sibling)</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">nextElementSibling</span><span class="p">;</span>     <span class="c1">// elemen berikutnya</span>
<span class="nx">item</span><span class="p">.</span><span class="nx">previousElementSibling</span><span class="p">;</span> <span class="c1">// elemen sebelumnya</span>
</code></pre></div></div>

<hr />

<h2 id="contoh-praktis-dynamic-list">Contoh Praktis: Dynamic List</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">form</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#form-tambah</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">input</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#input-item</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">daftar</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">#daftar</span><span class="dl">"</span><span class="p">);</span>

<span class="nx">form</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">submit</span><span class="dl">"</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">e</span><span class="p">.</span><span class="nf">preventDefault</span><span class="p">();</span>  <span class="c1">// cegah reload halaman</span>

  <span class="kd">const</span> <span class="nx">teks</span> <span class="o">=</span> <span class="nx">input</span><span class="p">.</span><span class="nx">value</span><span class="p">.</span><span class="nf">trim</span><span class="p">();</span>
  <span class="k">if </span><span class="p">(</span><span class="o">!</span><span class="nx">teks</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>

  <span class="kd">const</span> <span class="nx">li</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">li</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">li</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="nx">teks</span><span class="p">;</span>

  <span class="c1">// Tombol hapus</span>
  <span class="kd">const</span> <span class="nx">btnHapus</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nf">createElement</span><span class="p">(</span><span class="dl">"</span><span class="s2">button</span><span class="dl">"</span><span class="p">);</span>
  <span class="nx">btnHapus</span><span class="p">.</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">×</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">btnHapus</span><span class="p">.</span><span class="nf">addEventListener</span><span class="p">(</span><span class="dl">"</span><span class="s2">click</span><span class="dl">"</span><span class="p">,</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">li</span><span class="p">.</span><span class="nf">remove</span><span class="p">());</span>
  <span class="nx">li</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">btnHapus</span><span class="p">);</span>

  <span class="nx">daftar</span><span class="p">.</span><span class="nf">appendChild</span><span class="p">(</span><span class="nx">li</span><span class="p">);</span>
  <span class="nx">input</span><span class="p">.</span><span class="nx">value</span> <span class="o">=</span> <span class="dl">""</span><span class="p">;</span>     <span class="c1">// kosongkan input</span>
  <span class="nx">input</span><span class="p">.</span><span class="nf">focus</span><span class="p">();</span>        <span class="c1">// fokus kembali ke input</span>
<span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Manipulasi DOM adalah keterampilan inti untuk membangun halaman web yang interaktif. Dengan <code class="language-plaintext highlighter-rouge">querySelector</code>, <code class="language-plaintext highlighter-rouge">createElement</code>, manipulasi class dan atribut, kamu bisa membuat halaman yang responsif terhadap aksi pengguna.</p>

<p>Di artikel berikutnya, kita bahas <strong>Event Handling</strong> — cara merespons klik, input, scroll, dan semua interaksi pengguna dengan JavaScript.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[DOM (Document Object Model) adalah representasi halaman HTML sebagai pohon objek JavaScript. Ketika browser memuat halaman web, ia membuat DOM — dan JavaScript bisa membaca, mengubah, menambah, atau menghapus elemen DOM secara dinamis tanpa perlu reload halaman. Inilah yang membuat halaman web menjadi interaktif.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">JavaScript: Array dan Object — Struktur Data Utama</title><link href="https://blog.kiki.my.id/javascript-array-dan-object/" rel="alternate" type="text/html" title="JavaScript: Array dan Object — Struktur Data Utama" /><published>2026-10-06T00:00:00+00:00</published><updated>2026-10-06T00:00:00+00:00</updated><id>https://blog.kiki.my.id/javascript-array-dan-object</id><content type="html" xml:base="https://blog.kiki.my.id/javascript-array-dan-object/"><![CDATA[<p>Hampir semua program nyata bekerja dengan kumpulan data — daftar produk, data pengguna, konfigurasi aplikasi. Di JavaScript, dua struktur data utama untuk menyimpan kumpulan informasi adalah <strong>Array</strong> (daftar terurut) dan <strong>Object</strong> (kumpulan key-value). Menguasai keduanya adalah kunci untuk bekerja dengan data di JavaScript.</p>

<hr />

<h2 id="array">Array</h2>

<p>Array adalah daftar nilai yang terurut. Setiap elemen punya indeks dimulai dari 0.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Membuat array</span>
<span class="kd">const</span> <span class="nx">buah</span> <span class="o">=</span> <span class="p">[</span><span class="dl">"</span><span class="s2">apel</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">mangga</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">jeruk</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">pisang</span><span class="dl">"</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">angka</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
<span class="kd">const</span> <span class="nx">campur</span> <span class="o">=</span> <span class="p">[</span><span class="dl">"</span><span class="s2">teks</span><span class="dl">"</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="kc">true</span><span class="p">,</span> <span class="kc">null</span><span class="p">,</span> <span class="p">{</span> <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span> <span class="p">}];</span>
<span class="kd">const</span> <span class="nx">kosong</span> <span class="o">=</span> <span class="p">[];</span>

<span class="c1">// Akses elemen</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">buah</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>   <span class="c1">// "apel"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">buah</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>   <span class="c1">// "jeruk"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">buah</span><span class="p">[</span><span class="nx">buah</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]);</span>  <span class="c1">// "pisang" (elemen terakhir)</span>
</code></pre></div></div>

<h3 id="method-array-yang-penting">Method Array yang Penting</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">arr</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>

<span class="c1">// Menambah dan menghapus</span>
<span class="nx">arr</span><span class="p">.</span><span class="nf">push</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span>         <span class="c1">// tambah di akhir → [1,2,3,4,5,6]</span>
<span class="nx">arr</span><span class="p">.</span><span class="nf">pop</span><span class="p">();</span>           <span class="c1">// hapus dari akhir → kembalikan 6</span>
<span class="nx">arr</span><span class="p">.</span><span class="nf">unshift</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>      <span class="c1">// tambah di awal → [0,1,2,3,4,5]</span>
<span class="nx">arr</span><span class="p">.</span><span class="nf">shift</span><span class="p">();</span>         <span class="c1">// hapus dari awal → kembalikan 0</span>
<span class="nx">arr</span><span class="p">.</span><span class="nf">splice</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>    <span class="c1">// hapus 2 elemen mulai indeks 1 → [1,4,5]</span>

<span class="c1">// Mencari</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">arr</span><span class="p">.</span><span class="nf">indexOf</span><span class="p">(</span><span class="mi">4</span><span class="p">));</span>        <span class="c1">// 1 (indeks dari nilai 4)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">arr</span><span class="p">.</span><span class="nf">includes</span><span class="p">(</span><span class="mi">5</span><span class="p">));</span>       <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">arr</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">));</span>  <span class="c1">// 4 (elemen pertama yang cocok)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">arr</span><span class="p">.</span><span class="nf">findIndex</span><span class="p">(</span><span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">&gt;</span> <span class="mi">3</span><span class="p">));</span> <span class="c1">// indeks dari elemen yang cocok</span>

<span class="c1">// Transformasi — selalu return array BARU</span>
<span class="kd">const</span> <span class="nx">double</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">].</span><span class="nf">map</span><span class="p">(</span><span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">*</span> <span class="mi">2</span><span class="p">);</span>      <span class="c1">// [2, 4, 6]</span>
<span class="kd">const</span> <span class="nx">genap</span>  <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">].</span><span class="nf">filter</span><span class="p">(</span><span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// [2, 4]</span>
<span class="kd">const</span> <span class="nx">total</span>  <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">].</span><span class="nf">reduce</span><span class="p">((</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">acc</span> <span class="o">+</span> <span class="nx">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> <span class="c1">// 10</span>
<span class="kd">const</span> <span class="nx">flat</span>   <span class="o">=</span> <span class="p">[[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">],[</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">]].</span><span class="nf">flat</span><span class="p">();</span>          <span class="c1">// [1, 2, 3, 4]</span>

<span class="c1">// Sortir dan balik</span>
<span class="p">[</span><span class="mi">3</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">5</span><span class="p">].</span><span class="nf">sort</span><span class="p">((</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">);</span>  <span class="c1">// [1, 1, 3, 4, 5]</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">].</span><span class="nf">reverse</span><span class="p">();</span>                   <span class="c1">// [3, 2, 1]</span>

<span class="c1">// Utilitas</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">].</span><span class="nf">join</span><span class="p">(</span><span class="dl">"</span><span class="s2"> - </span><span class="dl">"</span><span class="p">);</span>   <span class="c1">// "1 - 2 - 3"</span>
<span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">].</span><span class="nf">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>   <span class="c1">// [2, 3] (copy sebagian)</span>
<span class="p">[...</span><span class="nx">arr1</span><span class="p">,</span> <span class="p">...</span><span class="nx">arr2</span><span class="p">];</span>    <span class="c1">// gabung dua array (spread)</span>
</code></pre></div></div>

<h3 id="destructuring-array">Destructuring Array</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">koordinat</span> <span class="o">=</span> <span class="p">[</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">];</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">]</span> <span class="o">=</span> <span class="nx">koordinat</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">y</span><span class="p">,</span> <span class="nx">z</span><span class="p">);</span>  <span class="c1">// 10 20 30</span>

<span class="c1">// Skip elemen</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">pertama</span><span class="p">,</span> <span class="p">,</span> <span class="nx">ketiga</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">pertama</span><span class="p">,</span> <span class="nx">ketiga</span><span class="p">);</span>  <span class="c1">// 1 3</span>

<span class="c1">// Rest</span>
<span class="kd">const</span> <span class="p">[</span><span class="nx">kepala</span><span class="p">,</span> <span class="p">...</span><span class="nx">ekor</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">kepala</span><span class="p">);</span>  <span class="c1">// 1</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">ekor</span><span class="p">);</span>    <span class="c1">// [2, 3, 4, 5]</span>
</code></pre></div></div>

<hr />

<h2 id="object">Object</h2>

<p>Object menyimpan data dalam pasangan <strong>key: value</strong>. Key adalah string (atau Symbol), value bisa tipe apapun.</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">pengguna</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">id</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
  <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Miftakhuddin</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">email</span><span class="p">:</span> <span class="dl">"</span><span class="s2">me@kiki.my.id</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">aktif</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span>
  <span class="na">alamat</span><span class="p">:</span> <span class="p">{</span>             <span class="c1">// nested object</span>
    <span class="na">kota</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Surabaya</span><span class="dl">"</span><span class="p">,</span>
    <span class="na">provinsi</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Jawa Timur</span><span class="dl">"</span>
  <span class="p">},</span>
  <span class="na">hobi</span><span class="p">:</span> <span class="p">[</span><span class="dl">"</span><span class="s2">coding</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">gaming</span><span class="dl">"</span><span class="p">]</span>  <span class="c1">// array di dalam object</span>
<span class="p">};</span>

<span class="c1">// Akses property</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">pengguna</span><span class="p">.</span><span class="nx">nama</span><span class="p">);</span>            <span class="c1">// "Miftakhuddin" (dot notation)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">pengguna</span><span class="p">[</span><span class="dl">"</span><span class="s2">email</span><span class="dl">"</span><span class="p">]);</span>        <span class="c1">// "me@kiki.my.id" (bracket notation)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">pengguna</span><span class="p">.</span><span class="nx">alamat</span><span class="p">.</span><span class="nx">kota</span><span class="p">);</span>     <span class="c1">// "Surabaya"</span>

<span class="c1">// Ubah dan tambah property</span>
<span class="nx">pengguna</span><span class="p">.</span><span class="nx">nama</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Kiki</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">pengguna</span><span class="p">.</span><span class="nx">telepon</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">081234567890</span><span class="dl">"</span><span class="p">;</span>

<span class="c1">// Hapus property</span>
<span class="k">delete</span> <span class="nx">pengguna</span><span class="p">.</span><span class="nx">aktif</span><span class="p">;</span>

<span class="c1">// Cek keberadaan property</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">nama</span><span class="dl">"</span> <span class="k">in</span> <span class="nx">pengguna</span><span class="p">);</span>            <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">pengguna</span><span class="p">.</span><span class="nf">hasOwnProperty</span><span class="p">(</span><span class="dl">"</span><span class="s2">nama</span><span class="dl">"</span><span class="p">));</span> <span class="c1">// true</span>
</code></pre></div></div>

<h3 id="shorthand-property-dan-method">Shorthand Property dan Method</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">nama</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">usia</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>

<span class="c1">// Tanpa shorthand</span>
<span class="kd">const</span> <span class="nx">user1</span> <span class="o">=</span> <span class="p">{</span> <span class="na">nama</span><span class="p">:</span> <span class="nx">nama</span><span class="p">,</span> <span class="na">usia</span><span class="p">:</span> <span class="nx">usia</span> <span class="p">};</span>

<span class="c1">// Dengan shorthand (ES6) — jika nama variabel sama dengan key</span>
<span class="kd">const</span> <span class="nx">user2</span> <span class="o">=</span> <span class="p">{</span> <span class="nx">nama</span><span class="p">,</span> <span class="nx">usia</span> <span class="p">};</span>

<span class="c1">// Method di dalam object</span>
<span class="kd">const</span> <span class="nx">kalkulator</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">nilai</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>

  <span class="c1">// Cara lama</span>
  <span class="na">tambah</span><span class="p">:</span> <span class="kd">function</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">nilai</span> <span class="o">+=</span> <span class="nx">n</span><span class="p">;</span> <span class="p">},</span>

  <span class="c1">// Shorthand method (ES6)</span>
  <span class="nf">kurang</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">this</span><span class="p">.</span><span class="nx">nilai</span> <span class="o">-=</span> <span class="nx">n</span><span class="p">;</span> <span class="p">},</span>

  <span class="c1">// Arrow function — JANGAN untuk method yang pakai this</span>
  <span class="na">tampilkan</span><span class="p">:</span> <span class="p">()</span> <span class="o">=&gt;</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">nilai saat ini</span><span class="dl">"</span><span class="p">)</span>
<span class="p">};</span>
</code></pre></div></div>

<h3 id="destructuring-object">Destructuring Object</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">produk</span> <span class="o">=</span> <span class="p">{</span>
  <span class="na">id</span><span class="p">:</span> <span class="mi">101</span><span class="p">,</span>
  <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Laptop Gaming</span><span class="dl">"</span><span class="p">,</span>
  <span class="na">harga</span><span class="p">:</span> <span class="mi">15000000</span><span class="p">,</span>
  <span class="na">stok</span><span class="p">:</span> <span class="mi">5</span>
<span class="p">};</span>

<span class="c1">// Destructuring dasar</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">nama</span><span class="p">,</span> <span class="nx">harga</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">produk</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">nama</span><span class="p">,</span> <span class="nx">harga</span><span class="p">);</span>  <span class="c1">// "Laptop Gaming" 15000000</span>

<span class="c1">// Rename variabel</span>
<span class="kd">const</span> <span class="p">{</span> <span class="na">nama</span><span class="p">:</span> <span class="nx">namaProduk</span><span class="p">,</span> <span class="na">harga</span><span class="p">:</span> <span class="nx">hargaProduk</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">produk</span><span class="p">;</span>

<span class="c1">// Default value</span>
<span class="kd">const</span> <span class="p">{</span> <span class="nx">warna</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">hitam</span><span class="dl">"</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">produk</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">warna</span><span class="p">);</span>  <span class="c1">// "hitam" (karena tidak ada di produk)</span>

<span class="c1">// Nested destructuring</span>
<span class="kd">const</span> <span class="p">{</span> <span class="na">alamat</span><span class="p">:</span> <span class="p">{</span> <span class="nx">kota</span> <span class="p">}</span> <span class="p">}</span> <span class="o">=</span> <span class="nx">pengguna</span><span class="p">;</span>

<span class="c1">// Destructuring di parameter fungsi</span>
<span class="kd">function</span> <span class="nf">tampilkanProduk</span><span class="p">({</span> <span class="nx">nama</span><span class="p">,</span> <span class="nx">harga</span><span class="p">,</span> <span class="nx">stok</span> <span class="o">=</span> <span class="mi">0</span> <span class="p">})</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">nama</span><span class="p">}</span><span class="s2">: Rp</span><span class="p">${</span><span class="nx">harga</span><span class="p">.</span><span class="nf">toLocaleString</span><span class="p">()}</span><span class="s2"> (stok: </span><span class="p">${</span><span class="nx">stok</span><span class="p">}</span><span class="s2">)`</span><span class="p">);</span>
<span class="p">}</span>

<span class="nf">tampilkanProduk</span><span class="p">(</span><span class="nx">produk</span><span class="p">);</span>
</code></pre></div></div>

<h3 id="spread-dan-rest-pada-object">Spread dan Rest pada Object</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">dasar</span> <span class="o">=</span> <span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">b</span><span class="p">:</span> <span class="mi">2</span> <span class="p">};</span>
<span class="kd">const</span> <span class="nx">tambahan</span> <span class="o">=</span> <span class="p">{</span> <span class="na">c</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="na">d</span><span class="p">:</span> <span class="mi">4</span> <span class="p">};</span>

<span class="c1">// Gabungkan object (spread)</span>
<span class="kd">const</span> <span class="nx">gabungan</span> <span class="o">=</span> <span class="p">{</span> <span class="p">...</span><span class="nx">dasar</span><span class="p">,</span> <span class="p">...</span><span class="nx">tambahan</span> <span class="p">};</span>  <span class="c1">// { a:1, b:2, c:3, d:4 }</span>

<span class="c1">// Copy object (shallow)</span>
<span class="kd">const</span> <span class="nx">salinan</span> <span class="o">=</span> <span class="p">{</span> <span class="p">...</span><span class="nx">dasar</span> <span class="p">};</span>

<span class="c1">// Override property</span>
<span class="kd">const</span> <span class="nx">updated</span> <span class="o">=</span> <span class="p">{</span> <span class="p">...</span><span class="nx">produk</span><span class="p">,</span> <span class="na">harga</span><span class="p">:</span> <span class="mi">14000000</span><span class="p">,</span> <span class="na">stok</span><span class="p">:</span> <span class="mi">10</span> <span class="p">};</span>
</code></pre></div></div>

<h3 id="method-object-bawaan">Method Object Bawaan</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">obj</span> <span class="o">=</span> <span class="p">{</span> <span class="na">a</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">b</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="na">c</span><span class="p">:</span> <span class="mi">3</span> <span class="p">};</span>

<span class="nb">Object</span><span class="p">.</span><span class="nf">keys</span><span class="p">(</span><span class="nx">obj</span><span class="p">);</span>    <span class="c1">// ["a", "b", "c"]</span>
<span class="nb">Object</span><span class="p">.</span><span class="nf">values</span><span class="p">(</span><span class="nx">obj</span><span class="p">);</span>  <span class="c1">// [1, 2, 3]</span>
<span class="nb">Object</span><span class="p">.</span><span class="nf">entries</span><span class="p">(</span><span class="nx">obj</span><span class="p">);</span> <span class="c1">// [["a",1], ["b",2], ["c",3]]</span>

<span class="c1">// Iterasi object</span>
<span class="nb">Object</span><span class="p">.</span><span class="nf">entries</span><span class="p">(</span><span class="nx">obj</span><span class="p">).</span><span class="nf">forEach</span><span class="p">(([</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">])</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">key</span><span class="p">}</span><span class="s2">: </span><span class="p">${</span><span class="nx">value</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">});</span>

<span class="c1">// Gabungkan object</span>
<span class="nb">Object</span><span class="p">.</span><span class="nf">assign</span><span class="p">({},</span> <span class="nx">dasar</span><span class="p">,</span> <span class="nx">tambahan</span><span class="p">);</span>

<span class="c1">// Freeze — cegah perubahan</span>
<span class="kd">const</span> <span class="nx">config</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nf">freeze</span><span class="p">({</span> <span class="na">env</span><span class="p">:</span> <span class="dl">"</span><span class="s2">production</span><span class="dl">"</span><span class="p">,</span> <span class="na">port</span><span class="p">:</span> <span class="mi">3000</span> <span class="p">});</span>
</code></pre></div></div>

<hr />

<h2 id="array-of-objects--pola-yang-paling-sering-dipakai">Array of Objects — Pola yang Paling Sering Dipakai</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">produkList</span> <span class="o">=</span> <span class="p">[</span>
  <span class="p">{</span> <span class="na">id</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Laptop</span><span class="dl">"</span><span class="p">,</span> <span class="na">harga</span><span class="p">:</span> <span class="mi">15000000</span><span class="p">,</span> <span class="na">kategori</span><span class="p">:</span> <span class="dl">"</span><span class="s2">elektronik</span><span class="dl">"</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">id</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Mouse</span><span class="dl">"</span><span class="p">,</span>  <span class="na">harga</span><span class="p">:</span> <span class="mi">250000</span><span class="p">,</span>   <span class="na">kategori</span><span class="p">:</span> <span class="dl">"</span><span class="s2">elektronik</span><span class="dl">"</span> <span class="p">},</span>
  <span class="p">{</span> <span class="na">id</span><span class="p">:</span> <span class="mi">3</span><span class="p">,</span> <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Meja</span><span class="dl">"</span><span class="p">,</span>   <span class="na">harga</span><span class="p">:</span> <span class="mi">500000</span><span class="p">,</span>   <span class="na">kategori</span><span class="p">:</span> <span class="dl">"</span><span class="s2">furnitur</span><span class="dl">"</span> <span class="p">}</span>
<span class="p">];</span>

<span class="c1">// Filter produk elektronik</span>
<span class="kd">const</span> <span class="nx">elektronik</span> <span class="o">=</span> <span class="nx">produkList</span><span class="p">.</span><span class="nf">filter</span><span class="p">(</span><span class="nx">p</span> <span class="o">=&gt;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">kategori</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">elektronik</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Hitung total harga</span>
<span class="kd">const</span> <span class="nx">totalHarga</span> <span class="o">=</span> <span class="nx">produkList</span><span class="p">.</span><span class="nf">reduce</span><span class="p">((</span><span class="nx">total</span><span class="p">,</span> <span class="nx">p</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">total</span> <span class="o">+</span> <span class="nx">p</span><span class="p">.</span><span class="nx">harga</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>

<span class="c1">// Ambil hanya nama produk</span>
<span class="kd">const</span> <span class="nx">namaList</span> <span class="o">=</span> <span class="nx">produkList</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">p</span> <span class="o">=&gt;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">nama</span><span class="p">);</span>
<span class="c1">// ["Laptop", "Mouse", "Meja"]</span>

<span class="c1">// Sort berdasarkan harga</span>
<span class="nx">produkList</span><span class="p">.</span><span class="nf">sort</span><span class="p">((</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">a</span><span class="p">.</span><span class="nx">harga</span> <span class="o">-</span> <span class="nx">b</span><span class="p">.</span><span class="nx">harga</span><span class="p">);</span>

<span class="c1">// Cari produk berdasarkan id</span>
<span class="kd">const</span> <span class="nx">produkDicari</span> <span class="o">=</span> <span class="nx">produkList</span><span class="p">.</span><span class="nf">find</span><span class="p">(</span><span class="nx">p</span> <span class="o">=&gt;</span> <span class="nx">p</span><span class="p">.</span><span class="nx">id</span> <span class="o">===</span> <span class="mi">2</span><span class="p">);</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Array dan Object adalah dua struktur data yang akan kamu gunakan di hampir setiap program JavaScript. Dengan menguasai method seperti <code class="language-plaintext highlighter-rouge">map</code>, <code class="language-plaintext highlighter-rouge">filter</code>, <code class="language-plaintext highlighter-rouge">reduce</code>, dan destructuring, kamu bisa memanipulasi data dengan cara yang bersih dan ekspresif.</p>

<p>Di artikel berikutnya, kita masuk ke <strong>manipulasi DOM</strong> — cara JavaScript berinteraksi langsung dengan elemen HTML di halaman web.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[Hampir semua program nyata bekerja dengan kumpulan data — daftar produk, data pengguna, konfigurasi aplikasi. Di JavaScript, dua struktur data utama untuk menyimpan kumpulan informasi adalah Array (daftar terurut) dan Object (kumpulan key-value). Menguasai keduanya adalah kunci untuk bekerja dengan data di JavaScript.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">JavaScript: Fungsi, Arrow Function, dan Scope</title><link href="https://blog.kiki.my.id/javascript-fungsi-dan-scope/" rel="alternate" type="text/html" title="JavaScript: Fungsi, Arrow Function, dan Scope" /><published>2026-10-05T00:00:00+00:00</published><updated>2026-10-05T00:00:00+00:00</updated><id>https://blog.kiki.my.id/javascript-fungsi-dan-scope</id><content type="html" xml:base="https://blog.kiki.my.id/javascript-fungsi-dan-scope/"><![CDATA[<p><strong>Fungsi</strong> adalah blok kode yang diberi nama dan bisa dipanggil berulang kali. Fungsi adalah unit terkecil dari abstraksi dalam pemrograman — cara mengelompokkan logika agar tidak perlu ditulis ulang. Di JavaScript, fungsi adalah <strong>first-class citizen</strong> — bisa disimpan di variabel, dikirim sebagai argumen, dan dikembalikan sebagai nilai.</p>

<hr />

<h2 id="cara-mendefinisikan-fungsi">Cara Mendefinisikan Fungsi</h2>

<h3 id="function-declaration">Function Declaration</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">sapa</span><span class="p">(</span><span class="nx">nama</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="s2">`Halo, </span><span class="p">${</span><span class="nx">nama</span><span class="p">}</span><span class="s2">!`</span><span class="p">;</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sapa</span><span class="p">(</span><span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">));</span>   <span class="c1">// "Halo, Budi!"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">sapa</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sari</span><span class="dl">"</span><span class="p">));</span>   <span class="c1">// "Halo, Sari!"</span>
</code></pre></div></div>

<p>Function declaration bisa dipanggil <strong>sebelum</strong> didefinisikan (hoisting):</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">tambah</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">));</span>  <span class="c1">// 7 — bekerja meskipun fungsi di bawah</span>

<span class="kd">function</span> <span class="nf">tambah</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="function-expression">Function Expression</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Fungsi disimpan di variabel</span>
<span class="kd">const</span> <span class="nx">kali</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">a</span><span class="p">,</span> <span class="nx">b</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">a</span> <span class="o">*</span> <span class="nx">b</span><span class="p">;</span>
<span class="p">};</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">kali</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">));</span>  <span class="c1">// 20</span>
</code></pre></div></div>

<p>Function expression <strong>tidak</strong> di-hoist — harus didefinisikan sebelum dipanggil.</p>

<h3 id="arrow-function-es6--cara-modern">Arrow Function (ES6) — Cara Modern</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Format: (parameter) =&gt; ekspresi atau { blok kode }</span>

<span class="c1">// Satu baris — return implicit</span>
<span class="kd">const</span> <span class="nx">kuadrat</span> <span class="o">=</span> <span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">*</span> <span class="nx">n</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">salam</span> <span class="o">=</span> <span class="nx">nama</span> <span class="o">=&gt;</span> <span class="s2">`Halo, </span><span class="p">${</span><span class="nx">nama</span><span class="p">}</span><span class="s2">!`</span><span class="p">;</span>  <span class="c1">// satu parameter, () opsional</span>

<span class="c1">// Multi baris — perlu return eksplisit</span>
<span class="kd">const</span> <span class="nx">hitungLuas</span> <span class="o">=</span> <span class="p">(</span><span class="nx">panjang</span><span class="p">,</span> <span class="nx">lebar</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">luas</span> <span class="o">=</span> <span class="nx">panjang</span> <span class="o">*</span> <span class="nx">lebar</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">luas</span><span class="p">;</span>
<span class="p">};</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">kuadrat</span><span class="p">(</span><span class="mi">5</span><span class="p">));</span>       <span class="c1">// 25</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">salam</span><span class="p">(</span><span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">));</span>    <span class="c1">// "Halo, Budi!"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">hitungLuas</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">6</span><span class="p">));</span> <span class="c1">// 24</span>
</code></pre></div></div>

<hr />

<h2 id="parameter-dan-argumen">Parameter dan Argumen</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Default parameter — nilai jika tidak dikirim</span>
<span class="kd">function</span> <span class="nf">buat</span><span class="p">(</span><span class="nx">nama</span><span class="p">,</span> <span class="nx">role</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">member</span><span class="dl">"</span><span class="p">,</span> <span class="nx">aktif</span> <span class="o">=</span> <span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="p">{</span> <span class="nx">nama</span><span class="p">,</span> <span class="nx">role</span><span class="p">,</span> <span class="nx">aktif</span> <span class="p">};</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">buat</span><span class="p">(</span><span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">));</span>               <span class="c1">// { nama: "Budi", role: "member", aktif: true }</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">buat</span><span class="p">(</span><span class="dl">"</span><span class="s2">Sari</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">admin</span><span class="dl">"</span><span class="p">));</span>      <span class="c1">// { nama: "Sari", role: "admin", aktif: true }</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">buat</span><span class="p">(</span><span class="dl">"</span><span class="s2">Tono</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">guest</span><span class="dl">"</span><span class="p">,</span> <span class="kc">false</span><span class="p">));</span>

<span class="c1">// Rest parameter — kumpulkan argumen sisa ke array</span>
<span class="kd">function</span> <span class="nf">jumlahSemua</span><span class="p">(...</span><span class="nx">angka</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">angka</span><span class="p">.</span><span class="nf">reduce</span><span class="p">((</span><span class="nx">total</span><span class="p">,</span> <span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">total</span> <span class="o">+</span> <span class="nx">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">jumlahSemua</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">));</span>         <span class="c1">// 6</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">jumlahSemua</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">40</span><span class="p">));</span>  <span class="c1">// 100</span>
</code></pre></div></div>

<hr />

<h2 id="return-value">Return Value</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Fungsi bisa return nilai apapun</span>
<span class="kd">function</span> <span class="nf">cekGenap</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nx">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">;</span>  <span class="c1">// return boolean</span>
<span class="p">}</span>

<span class="kd">function</span> <span class="nf">getUser</span><span class="p">(</span><span class="nx">id</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="p">{</span> <span class="nx">id</span><span class="p">,</span> <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span> <span class="p">};</span>  <span class="c1">// return object</span>
<span class="p">}</span>

<span class="c1">// Tanpa return → function mengembalikan undefined</span>
<span class="kd">function</span> <span class="nf">cetakHalo</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Halo!</span><span class="dl">"</span><span class="p">);</span>
  <span class="c1">// tidak ada return</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">hasil</span> <span class="o">=</span> <span class="nf">cetakHalo</span><span class="p">();</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">hasil</span><span class="p">);</span>  <span class="c1">// undefined</span>
</code></pre></div></div>

<hr />

<h2 id="scope">Scope</h2>

<p><strong>Scope</strong> menentukan di mana variabel bisa diakses. JavaScript punya beberapa level scope:</p>

<h3 id="global-scope">Global Scope</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">appNama</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Blog Kiki</span><span class="dl">"</span><span class="p">;</span>  <span class="c1">// variabel global</span>

<span class="kd">function</span> <span class="nf">tampilkanNama</span><span class="p">()</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">appNama</span><span class="p">);</span>  <span class="c1">// bisa akses variabel global</span>
<span class="p">}</span>

<span class="nf">tampilkanNama</span><span class="p">();</span>  <span class="c1">// "Blog Kiki"</span>
</code></pre></div></div>

<h3 id="function-scope">Function Scope</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">hitungDiskon</span><span class="p">(</span><span class="nx">harga</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">diskon</span> <span class="o">=</span> <span class="mf">0.1</span><span class="p">;</span>        <span class="c1">// hanya ada di dalam fungsi ini</span>
  <span class="kd">const</span> <span class="nx">hasil</span> <span class="o">=</span> <span class="nx">harga</span> <span class="o">*</span> <span class="nx">diskon</span><span class="p">;</span>
  <span class="k">return</span> <span class="nx">hasil</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// console.log(diskon);  // ReferenceError: diskon tidak terdefinisi</span>
</code></pre></div></div>

<h3 id="block-scope-let-dan-const">Block Scope (let dan const)</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span>
  <span class="kd">let</span> <span class="nx">temp</span> <span class="o">=</span> <span class="mi">100</span><span class="p">;</span>
  <span class="kd">const</span> <span class="nx">MAX</span> <span class="o">=</span> <span class="mi">200</span><span class="p">;</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">temp</span><span class="p">);</span>  <span class="c1">// 100</span>
<span class="p">}</span>

<span class="c1">// console.log(temp);  // ReferenceError</span>
<span class="c1">// console.log(MAX);   // ReferenceError</span>
</code></pre></div></div>

<h3 id="closure--fungsi-yang-mengingat-scope-nya">Closure — Fungsi yang “Mengingat” Scope-nya</h3>

<p>Closure adalah fungsi yang tetap bisa mengakses variabel dari scope tempat ia dibuat, meski scope tersebut sudah selesai:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">buatCounter</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">let</span> <span class="nx">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>  <span class="c1">// variabel di outer function</span>

  <span class="k">return</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
    <span class="nx">count</span><span class="o">++</span><span class="p">;</span>           <span class="c1">// akses variabel dari outer function</span>
    <span class="k">return</span> <span class="nx">count</span><span class="p">;</span>
  <span class="p">};</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">counter</span> <span class="o">=</span> <span class="nf">buatCounter</span><span class="p">();</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">counter</span><span class="p">());</span>  <span class="c1">// 1</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">counter</span><span class="p">());</span>  <span class="c1">// 2</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">counter</span><span class="p">());</span>  <span class="c1">// 3</span>

<span class="kd">const</span> <span class="nx">counter2</span> <span class="o">=</span> <span class="nf">buatCounter</span><span class="p">();</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">counter2</span><span class="p">());</span> <span class="c1">// 1 ← counter baru, independen</span>
</code></pre></div></div>

<p>Closure sangat berguna untuk enkapsulasi data dan membuat module pattern.</p>

<hr />

<h2 id="higher-order-function">Higher-Order Function</h2>

<p>JavaScript mendukung fungsi sebagai nilai — bisa dikirim sebagai argumen atau dikembalikan sebagai hasil:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Fungsi sebagai argumen (callback)</span>
<span class="kd">function</span> <span class="nf">prosesData</span><span class="p">(</span><span class="nx">angka</span><span class="p">,</span> <span class="nx">transform</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">return</span> <span class="nf">transform</span><span class="p">(</span><span class="nx">angka</span><span class="p">);</span>
<span class="p">}</span>

<span class="kd">const</span> <span class="nx">duaKali</span> <span class="o">=</span> <span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">kuadrat</span> <span class="o">=</span> <span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">**</span> <span class="mi">2</span><span class="p">;</span>

<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">prosesData</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="nx">duaKali</span><span class="p">));</span>  <span class="c1">// 10</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nf">prosesData</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="nx">kuadrat</span><span class="p">));</span>  <span class="c1">// 25</span>

<span class="c1">// Ini adalah dasar dari map, filter, reduce!</span>
<span class="kd">const</span> <span class="nx">angka</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>

<span class="kd">const</span> <span class="nx">digandakan</span> <span class="o">=</span> <span class="nx">angka</span><span class="p">.</span><span class="nf">map</span><span class="p">(</span><span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">*</span> <span class="mi">2</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">digandakan</span><span class="p">);</span>  <span class="c1">// [2, 4, 6, 8, 10]</span>

<span class="kd">const</span> <span class="nx">genap</span> <span class="o">=</span> <span class="nx">angka</span><span class="p">.</span><span class="nf">filter</span><span class="p">(</span><span class="nx">n</span> <span class="o">=&gt;</span> <span class="nx">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">genap</span><span class="p">);</span>       <span class="c1">// [2, 4]</span>

<span class="kd">const</span> <span class="nx">total</span> <span class="o">=</span> <span class="nx">angka</span><span class="p">.</span><span class="nf">reduce</span><span class="p">((</span><span class="nx">acc</span><span class="p">,</span> <span class="nx">n</span><span class="p">)</span> <span class="o">=&gt;</span> <span class="nx">acc</span> <span class="o">+</span> <span class="nx">n</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">total</span><span class="p">);</span>       <span class="c1">// 15</span>
</code></pre></div></div>

<hr />

<h2 id="iife--immediately-invoked-function-expression">IIFE — Immediately Invoked Function Expression</h2>

<p>Fungsi yang langsung dipanggil saat didefinisikan:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">rahasia</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">tidak bisa diakses dari luar</span><span class="dl">"</span><span class="p">;</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">IIFE berjalan!</span><span class="dl">"</span><span class="p">);</span>
<span class="p">})();</span>

<span class="c1">// Versi arrow function</span>
<span class="p">(()</span> <span class="o">=&gt;</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Arrow IIFE</span><span class="dl">"</span><span class="p">);</span>
<span class="p">})();</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Fungsi adalah alat terpenting dalam JavaScript. Dengan memahami function declaration, arrow function, scope, closure, dan higher-order function, kamu sudah siap menulis kode JavaScript yang terstruktur dan maintainable.</p>

<p>Di artikel berikutnya, kita bahas <strong>Array dan Object</strong> — struktur data utama di JavaScript untuk mengelola kumpulan informasi.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[Fungsi adalah blok kode yang diberi nama dan bisa dipanggil berulang kali. Fungsi adalah unit terkecil dari abstraksi dalam pemrograman — cara mengelompokkan logika agar tidak perlu ditulis ulang. Di JavaScript, fungsi adalah first-class citizen — bisa disimpan di variabel, dikirim sebagai argumen, dan dikembalikan sebagai nilai.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">JavaScript: Kondisi (if/else, switch) dan Perulangan (for, while)</title><link href="https://blog.kiki.my.id/javascript-kondisi-dan-perulangan/" rel="alternate" type="text/html" title="JavaScript: Kondisi (if/else, switch) dan Perulangan (for, while)" /><published>2026-10-04T00:00:00+00:00</published><updated>2026-10-04T00:00:00+00:00</updated><id>https://blog.kiki.my.id/javascript-kondisi-dan-perulangan</id><content type="html" xml:base="https://blog.kiki.my.id/javascript-kondisi-dan-perulangan/"><![CDATA[<p>Program yang berguna harus bisa <strong>mengambil keputusan</strong> (kondisi) dan <strong>mengulang tugas</strong> (perulangan). Dua konsep ini adalah jantung dari semua logika pemrograman. Setelah memahami kondisi dan perulangan, kamu sudah bisa menulis program yang sesungguhnya.</p>

<hr />

<h2 id="kondisi-if-else-if-else">Kondisi: <code class="language-plaintext highlighter-rouge">if</code>, <code class="language-plaintext highlighter-rouge">else if</code>, <code class="language-plaintext highlighter-rouge">else</code></h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">nilai</span> <span class="o">=</span> <span class="mi">78</span><span class="p">;</span>

<span class="k">if </span><span class="p">(</span><span class="nx">nilai</span> <span class="o">&gt;=</span> <span class="mi">90</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Grade A — Sangat Baik</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">nilai</span> <span class="o">&gt;=</span> <span class="mi">80</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Grade B — Baik</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">nilai</span> <span class="o">&gt;=</span> <span class="mi">70</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Grade C — Cukup</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">nilai</span> <span class="o">&gt;=</span> <span class="mi">60</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Grade D — Kurang</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Grade E — Gagal</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// Output: Grade C — Cukup</span>
</code></pre></div></div>

<h3 id="truthy-dan-falsy">Truthy dan Falsy</h3>

<p>JavaScript mengevaluasi kondisi sebagai boolean. Nilai-nilai yang dianggap <strong>falsy</strong> (bernilai false):</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Semua ini dianggap false dalam kondisi</span>
<span class="k">if </span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>         <span class="p">{</span> <span class="p">}</span> <span class="c1">// false — angka 0</span>
<span class="k">if </span><span class="p">(</span><span class="dl">""</span><span class="p">)</span>        <span class="p">{</span> <span class="p">}</span> <span class="c1">// false — string kosong</span>
<span class="k">if </span><span class="p">(</span><span class="kc">null</span><span class="p">)</span>      <span class="p">{</span> <span class="p">}</span> <span class="c1">// false</span>
<span class="k">if </span><span class="p">(</span><span class="kc">undefined</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span> <span class="c1">// false</span>
<span class="k">if </span><span class="p">(</span><span class="kc">NaN</span><span class="p">)</span>       <span class="p">{</span> <span class="p">}</span> <span class="c1">// false</span>
<span class="k">if </span><span class="p">(</span><span class="kc">false</span><span class="p">)</span>     <span class="p">{</span> <span class="p">}</span> <span class="c1">// false</span>

<span class="c1">// Semua nilai lain dianggap truthy</span>
<span class="k">if </span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>         <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">truthy</span><span class="dl">"</span><span class="p">);</span> <span class="p">}</span>  <span class="c1">// true</span>
<span class="k">if </span><span class="p">(</span><span class="dl">"</span><span class="s2">halo</span><span class="dl">"</span><span class="p">)</span>    <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">truthy</span><span class="dl">"</span><span class="p">);</span> <span class="p">}</span>  <span class="c1">// true</span>
<span class="k">if </span><span class="p">([])</span>        <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">truthy</span><span class="dl">"</span><span class="p">);</span> <span class="p">}</span>  <span class="c1">// true — array kosong!</span>
<span class="k">if </span><span class="p">({})</span>        <span class="p">{</span> <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">truthy</span><span class="dl">"</span><span class="p">);</span> <span class="p">}</span>  <span class="c1">// true — object kosong!</span>
</code></pre></div></div>

<h3 id="operator-ternary--kondisi-satu-baris">Operator Ternary — Kondisi Satu Baris</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">umur</span> <span class="o">=</span> <span class="mi">20</span><span class="p">;</span>

<span class="c1">// Format: kondisi ? nilaiJikaTrue : nilaiJikaFalse</span>
<span class="kd">const</span> <span class="nx">status</span> <span class="o">=</span> <span class="nx">umur</span> <span class="o">&gt;=</span> <span class="mi">18</span> <span class="p">?</span> <span class="dl">"</span><span class="s2">dewasa</span><span class="dl">"</span> <span class="p">:</span> <span class="dl">"</span><span class="s2">anak-anak</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">status</span><span class="p">);</span>  <span class="c1">// "dewasa"</span>

<span class="c1">// Cocok untuk assignment sederhana</span>
<span class="kd">const</span> <span class="nx">sambutan</span> <span class="o">=</span> <span class="nx">nama</span> <span class="p">?</span> <span class="s2">`Halo, </span><span class="p">${</span><span class="nx">nama</span><span class="p">}</span><span class="s2">!`</span> <span class="p">:</span> <span class="dl">"</span><span class="s2">Halo, tamu!</span><span class="dl">"</span><span class="p">;</span>
</code></pre></div></div>

<h3 id="nullish-coalescing--dan-optional-chaining-">Nullish Coalescing <code class="language-plaintext highlighter-rouge">??</code> dan Optional Chaining <code class="language-plaintext highlighter-rouge">?.</code></h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// ?? — gunakan nilai kanan jika kiri null atau undefined</span>
<span class="kd">const</span> <span class="nx">nama</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="kd">const</span> <span class="nx">tampilan</span> <span class="o">=</span> <span class="nx">nama</span> <span class="o">??</span> <span class="dl">"</span><span class="s2">Anonim</span><span class="dl">"</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">tampilan</span><span class="p">);</span>  <span class="c1">// "Anonim"</span>

<span class="c1">// Berbeda dari || yang juga mengganti falsy (0, "")</span>
<span class="kd">const</span> <span class="nx">harga</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">harga</span> <span class="o">||</span> <span class="mi">100</span><span class="p">);</span>   <span class="c1">// 100 ← salah! 0 adalah harga valid</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">harga</span> <span class="o">??</span> <span class="mi">100</span><span class="p">);</span>   <span class="c1">// 0   ← benar!</span>

<span class="c1">// ?. — akses property tanpa error jika null/undefined</span>
<span class="kd">const</span> <span class="nx">user</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">user</span><span class="p">?.</span><span class="nx">nama</span><span class="p">);</span>         <span class="c1">// undefined (tidak error)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">user</span><span class="p">?.</span><span class="nx">alamat</span><span class="p">?.</span><span class="nx">kota</span><span class="p">);</span> <span class="c1">// undefined (tidak error)</span>
</code></pre></div></div>

<hr />

<h2 id="switch--kondisi-banyak-pilihan">Switch — Kondisi Banyak Pilihan</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">hari</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Senin</span><span class="dl">"</span><span class="p">;</span>

<span class="k">switch </span><span class="p">(</span><span class="nx">hari</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">Senin</span><span class="dl">"</span><span class="p">:</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">Selasa</span><span class="dl">"</span><span class="p">:</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">Rabu</span><span class="dl">"</span><span class="p">:</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">Kamis</span><span class="dl">"</span><span class="p">:</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">Jumat</span><span class="dl">"</span><span class="p">:</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hari kerja</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">break</span><span class="p">;</span>  <span class="c1">// PENTING: tanpa break, akan lanjut ke case berikutnya</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">Sabtu</span><span class="dl">"</span><span class="p">:</span>
  <span class="k">case</span> <span class="dl">"</span><span class="s2">Minggu</span><span class="dl">"</span><span class="p">:</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Akhir pekan</span><span class="dl">"</span><span class="p">);</span>
    <span class="k">break</span><span class="p">;</span>
  <span class="nl">default</span><span class="p">:</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Hari tidak dikenal</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="perulangan-for">Perulangan: <code class="language-plaintext highlighter-rouge">for</code></h2>

<h3 id="for-klasik"><code class="language-plaintext highlighter-rouge">for</code> Klasik</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// for (inisialisasi; kondisi; increment)</span>
<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Iterasi ke-</span><span class="p">${</span><span class="nx">i</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// Iterasi ke-0, ke-1, ke-2, ke-3, ke-4</span>

<span class="c1">// Hitung mundur</span>
<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// Lompat 2</span>
<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>  <span class="c1">// 0, 2, 4, 6, 8, 10</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="forof--iterasi-arraystring"><code class="language-plaintext highlighter-rouge">for...of</code> — Iterasi Array/String</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">buah</span> <span class="o">=</span> <span class="p">[</span><span class="dl">"</span><span class="s2">apel</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">mangga</span><span class="dl">"</span><span class="p">,</span> <span class="dl">"</span><span class="s2">jeruk</span><span class="dl">"</span><span class="p">];</span>

<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">item</span> <span class="k">of</span> <span class="nx">buah</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">item</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// apel, mangga, jeruk</span>

<span class="c1">// Dengan string</span>
<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">huruf</span> <span class="k">of</span> <span class="dl">"</span><span class="s2">Hello</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">huruf</span><span class="p">);</span>  <span class="c1">// H, e, l, l, o</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="forin--iterasi-object"><code class="language-plaintext highlighter-rouge">for...in</code> — Iterasi Object</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">const</span> <span class="nx">orang</span> <span class="o">=</span> <span class="p">{</span> <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">,</span> <span class="na">usia</span><span class="p">:</span> <span class="mi">25</span><span class="p">,</span> <span class="na">kota</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Jakarta</span><span class="dl">"</span> <span class="p">};</span>

<span class="k">for </span><span class="p">(</span><span class="kd">const</span> <span class="nx">key</span> <span class="k">in</span> <span class="nx">orang</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">key</span><span class="p">}</span><span class="s2">: </span><span class="p">${</span><span class="nx">orang</span><span class="p">[</span><span class="nx">key</span><span class="p">]}</span><span class="s2">`</span><span class="p">);</span>
<span class="p">}</span>
<span class="c1">// nama: Budi</span>
<span class="c1">// usia: 25</span>
<span class="c1">// kota: Jakarta</span>
</code></pre></div></div>

<hr />

<h2 id="perulangan-while-dan-dowhile">Perulangan: <code class="language-plaintext highlighter-rouge">while</code> dan <code class="language-plaintext highlighter-rouge">do...while</code></h2>

<h3 id="while--selama-kondisi-true"><code class="language-plaintext highlighter-rouge">while</code> — Selama Kondisi True</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">angka</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>

<span class="k">while </span><span class="p">(</span><span class="nx">angka</span> <span class="o">&lt;=</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">angka</span><span class="p">);</span>
  <span class="nx">angka</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// 1, 2, 3, 4, 5</span>

<span class="c1">// Gunakan while saat tidak tahu jumlah iterasinya</span>
<span class="kd">let</span> <span class="nx">input</span> <span class="o">=</span> <span class="dl">""</span><span class="p">;</span>
<span class="k">while </span><span class="p">(</span><span class="nx">input</span> <span class="o">!==</span> <span class="dl">"</span><span class="s2">keluar</span><span class="dl">"</span><span class="p">)</span> <span class="p">{</span>
  <span class="nx">input</span> <span class="o">=</span> <span class="nf">prompt</span><span class="p">(</span><span class="dl">"</span><span class="s2">Ketik 'keluar' untuk berhenti:</span><span class="dl">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="dowhile--eksekusi-minimal-sekali"><code class="language-plaintext highlighter-rouge">do...while</code> — Eksekusi Minimal Sekali</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Blok do selalu dieksekusi MINIMAL SATU KALI</span>
<span class="kd">let</span> <span class="nx">counter</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="k">do</span> <span class="p">{</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`Counter: </span><span class="p">${</span><span class="nx">counter</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="nx">counter</span><span class="o">++</span><span class="p">;</span>
<span class="p">}</span> <span class="k">while </span><span class="p">(</span><span class="nx">counter</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">);</span>
<span class="c1">// Counter: 0, Counter: 1, Counter: 2</span>
</code></pre></div></div>

<hr />

<h2 id="kontrol-perulangan-break-dan-continue">Kontrol Perulangan: <code class="language-plaintext highlighter-rouge">break</code> dan <code class="language-plaintext highlighter-rouge">continue</code></h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// break — hentikan perulangan sepenuhnya</span>
<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">i</span> <span class="o">===</span> <span class="mi">5</span><span class="p">)</span> <span class="k">break</span><span class="p">;</span>  <span class="c1">// berhenti saat i = 5</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>      <span class="c1">// 0, 1, 2, 3, 4</span>
<span class="p">}</span>

<span class="c1">// continue — lewati iterasi saat ini, lanjut ke berikutnya</span>
<span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">i</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>  <span class="c1">// lewati angka genap</span>
  <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>              <span class="c1">// 1, 3, 5, 7, 9</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="contoh-praktis-tabel-perkalian">Contoh Praktis: Tabel Perkalian</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">function</span> <span class="nf">tabelPerkalian</span><span class="p">(</span><span class="nx">n</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="s2">`</span><span class="p">${</span><span class="nx">n</span><span class="p">}</span><span class="s2"> x </span><span class="p">${</span><span class="nx">i</span><span class="p">}</span><span class="s2"> = </span><span class="p">${</span><span class="nx">n</span> <span class="o">*</span> <span class="nx">i</span><span class="p">}</span><span class="s2">`</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>

<span class="nf">tabelPerkalian</span><span class="p">(</span><span class="mi">7</span><span class="p">);</span>
<span class="c1">// 7 x 1 = 7</span>
<span class="c1">// 7 x 2 = 14</span>
<span class="c1">// ...</span>
<span class="c1">// 7 x 10 = 70</span>
</code></pre></div></div>

<h2 id="contoh-praktis-fizzbuzz">Contoh Praktis: FizzBuzz</h2>

<p>Problem klasik yang sering muncul di interview:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for </span><span class="p">(</span><span class="kd">let</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;=</span> <span class="mi">100</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
  <span class="k">if </span><span class="p">(</span><span class="nx">i</span> <span class="o">%</span> <span class="mi">15</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">FizzBuzz</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">i</span> <span class="o">%</span> <span class="mi">3</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Fizz</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="k">if </span><span class="p">(</span><span class="nx">i</span> <span class="o">%</span> <span class="mi">5</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Buzz</span><span class="dl">"</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>Kondisi dan perulangan adalah fondasi dari semua logika program. <code class="language-plaintext highlighter-rouge">if/else</code> untuk keputusan, <code class="language-plaintext highlighter-rouge">for/while</code> untuk pengulangan — kuasai keduanya dan kamu bisa memecahkan hampir semua masalah pemrograman dasar.</p>

<p>Di artikel berikutnya, kita bahas <strong>fungsi di JavaScript</strong> — cara mengemas logika yang bisa dipanggil berulang kali.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[Program yang berguna harus bisa mengambil keputusan (kondisi) dan mengulang tugas (perulangan). Dua konsep ini adalah jantung dari semua logika pemrograman. Setelah memahami kondisi dan perulangan, kamu sudah bisa menulis program yang sesungguhnya.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Pengenalan JavaScript: Bahasa Pemrograman Web yang Wajib Dipelajari</title><link href="https://blog.kiki.my.id/pengenalan-javascript-dasar-untuk-pemula/" rel="alternate" type="text/html" title="Pengenalan JavaScript: Bahasa Pemrograman Web yang Wajib Dipelajari" /><published>2026-10-03T00:00:00+00:00</published><updated>2026-10-03T00:00:00+00:00</updated><id>https://blog.kiki.my.id/pengenalan-javascript-dasar-untuk-pemula</id><content type="html" xml:base="https://blog.kiki.my.id/pengenalan-javascript-dasar-untuk-pemula/"><![CDATA[<p>Kalau HTML adalah kerangka dan CSS adalah tampilan sebuah halaman web, maka <strong>JavaScript</strong> adalah otaknya — bagian yang membuat halaman bisa berinteraksi, merespons klik, memuat data tanpa refresh, dan masih banyak lagi. JavaScript adalah satu-satunya bahasa pemrograman yang berjalan langsung di browser, dan saat ini juga bisa berjalan di server melalui Node.js.</p>

<hr />

<h2 id="sejarah-singkat-javascript">Sejarah Singkat JavaScript</h2>

<p>JavaScript dibuat oleh <strong>Brendan Eich</strong> dalam waktu 10 hari pada tahun 1995 saat bekerja di Netscape. Awalnya bernama Mocha, lalu LiveScript, kemudian diubah menjadi JavaScript untuk memanfaatkan popularitas Java saat itu — meski keduanya tidak ada hubungannya secara teknis.</p>

<p>Saat ini JavaScript distandarisasi oleh <strong>ECMAScript (ES)</strong> yang dikelola oleh ECMA International. Versi modern yang paling banyak digunakan adalah <strong>ES6 (2015)</strong> ke atas, yang membawa banyak fitur baru seperti arrow function, <code class="language-plaintext highlighter-rouge">let</code>/<code class="language-plaintext highlighter-rouge">const</code>, template literal, destructuring, dan masih banyak lagi.</p>

<hr />

<h2 id="di-mana-javascript-berjalan">Di Mana JavaScript Berjalan?</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Browser (Client-side)          Server (Node.js)
┌─────────────────────┐        ┌─────────────────────┐
│  Manipulasi DOM     │        │  REST API            │
│  Event handling     │        │  Database queries    │
│  AJAX / Fetch API   │        │  File system         │
│  Animasi            │        │  WebSocket server    │
│  Form validation    │        │  CLI tools           │
└─────────────────────┘        └─────────────────────┘
</code></pre></div></div>

<hr />

<h2 id="cara-menjalankan-javascript">Cara Menjalankan JavaScript</h2>

<h3 id="di-browser-console">Di Browser (Console)</h3>

<p>Buka browser → tekan <code class="language-plaintext highlighter-rouge">F12</code> → tab <strong>Console</strong> → ketik kode langsung.</p>

<h3 id="di-html--inline">Di HTML — Inline</h3>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;!DOCTYPE html&gt;</span>
<span class="nt">&lt;html&gt;</span>
<span class="nt">&lt;head&gt;</span>
  <span class="nt">&lt;title&gt;</span>Belajar JavaScript<span class="nt">&lt;/title&gt;</span>
<span class="nt">&lt;/head&gt;</span>
<span class="nt">&lt;body&gt;</span>
  <span class="nt">&lt;h1&gt;</span>Hello World<span class="nt">&lt;/h1&gt;</span>

  <span class="c">&lt;!-- JavaScript di dalam tag script --&gt;</span>
  <span class="nt">&lt;script&gt;</span>
    <span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Halo dari JavaScript!</span><span class="dl">"</span><span class="p">);</span>
    <span class="nf">alert</span><span class="p">(</span><span class="dl">"</span><span class="s2">Selamat datang!</span><span class="dl">"</span><span class="p">);</span>
  <span class="nt">&lt;/script&gt;</span>
<span class="nt">&lt;/body&gt;</span>
<span class="nt">&lt;/html&gt;</span>
</code></pre></div></div>

<h3 id="di-html--file-eksternal-cara-terbaik">Di HTML — File Eksternal (Cara Terbaik)</h3>

<div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c">&lt;!-- Letakkan sebelum &lt;/body&gt; agar halaman selesai dimuat dulu --&gt;</span>
<span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"script.js"</span><span class="nt">&gt;&lt;/script&gt;</span>

<span class="c">&lt;!-- Atau di &lt;head&gt; dengan defer (eksekusi setelah DOM siap) --&gt;</span>
<span class="nt">&lt;script </span><span class="na">src=</span><span class="s">"script.js"</span> <span class="na">defer</span><span class="nt">&gt;&lt;/script&gt;</span>
</code></pre></div></div>

<hr />

<h2 id="variabel-var-let-dan-const">Variabel: <code class="language-plaintext highlighter-rouge">var</code>, <code class="language-plaintext highlighter-rouge">let</code>, dan <code class="language-plaintext highlighter-rouge">const</code></h2>

<p>JavaScript punya tiga cara mendeklarasikan variabel:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// var — cara lama, hindari di kode modern</span>
<span class="kd">var</span> <span class="nx">nama</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">;</span>

<span class="c1">// let — untuk nilai yang bisa berubah</span>
<span class="kd">let</span> <span class="nx">usia</span> <span class="o">=</span> <span class="mi">25</span><span class="p">;</span>
<span class="nx">usia</span> <span class="o">=</span> <span class="mi">26</span><span class="p">;</span>  <span class="c1">// boleh diubah</span>

<span class="c1">// const — untuk nilai yang tidak berubah</span>
<span class="kd">const</span> <span class="nx">PI</span> <span class="o">=</span> <span class="mf">3.14159</span><span class="p">;</span>
<span class="c1">// PI = 3;  // ERROR! const tidak bisa diubah</span>
</code></pre></div></div>

<h3 id="perbedaan-scope">Perbedaan Scope</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// var: function scope (bisa bocor dari blok if/for)</span>
<span class="k">if </span><span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">var</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
<span class="p">}</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">x</span><span class="p">);</span>  <span class="c1">// 10 ← bisa diakses!</span>

<span class="c1">// let/const: block scope (terbatas di dalam blok {})</span>
<span class="k">if </span><span class="p">(</span><span class="kc">true</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">let</span> <span class="nx">y</span> <span class="o">=</span> <span class="mi">20</span><span class="p">;</span>
<span class="p">}</span>
<span class="c1">// console.log(y);  // ReferenceError: y tidak terdefinisi</span>
</code></pre></div></div>

<p><strong>Aturan praktis</strong>: Selalu gunakan <code class="language-plaintext highlighter-rouge">const</code> secara default. Gunakan <code class="language-plaintext highlighter-rouge">let</code> hanya jika nilai perlu diubah. Hindari <code class="language-plaintext highlighter-rouge">var</code>.</p>

<hr />

<h2 id="tipe-data">Tipe Data</h2>

<p>JavaScript memiliki 7 tipe data primitif:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// String — teks</span>
<span class="kd">let</span> <span class="nx">nama</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Miftakhuddin</span><span class="dl">"</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">sapaan</span> <span class="o">=</span> <span class="dl">'</span><span class="s1">Halo, Dunia!</span><span class="dl">'</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">template</span> <span class="o">=</span> <span class="s2">`Halo, </span><span class="p">${</span><span class="nx">nama</span><span class="p">}</span><span class="s2">!`</span><span class="p">;</span>  <span class="c1">// template literal</span>

<span class="c1">// Number — angka (integer dan float jadi satu)</span>
<span class="kd">let</span> <span class="nx">bulat</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">desimal</span> <span class="o">=</span> <span class="mf">3.14</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">negatif</span> <span class="o">=</span> <span class="o">-</span><span class="mi">100</span><span class="p">;</span>

<span class="c1">// Boolean — true/false</span>
<span class="kd">let</span> <span class="nx">aktif</span> <span class="o">=</span> <span class="kc">true</span><span class="p">;</span>
<span class="kd">let</span> <span class="nx">sudahLogin</span> <span class="o">=</span> <span class="kc">false</span><span class="p">;</span>

<span class="c1">// null — nilai kosong yang disengaja</span>
<span class="kd">let</span> <span class="nx">data</span> <span class="o">=</span> <span class="kc">null</span><span class="p">;</span>

<span class="c1">// undefined — belum diberi nilai</span>
<span class="kd">let</span> <span class="nx">belumDiisi</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">belumDiisi</span><span class="p">);</span>  <span class="c1">// undefined</span>

<span class="c1">// BigInt — angka sangat besar</span>
<span class="kd">const</span> <span class="nx">angkaBesar</span> <span class="o">=</span> <span class="mi">9007199254740991</span><span class="nx">n</span><span class="p">;</span>

<span class="c1">// Symbol — nilai unik (jarang dipakai pemula)</span>
<span class="kd">const</span> <span class="nx">simbol</span> <span class="o">=</span> <span class="nc">Symbol</span><span class="p">(</span><span class="dl">"</span><span class="s2">deskripsi</span><span class="dl">"</span><span class="p">);</span>

<span class="c1">// Object — tipe non-primitif (array, object, function)</span>
<span class="kd">const</span> <span class="nx">orang</span> <span class="o">=</span> <span class="p">{</span> <span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">,</span> <span class="na">usia</span><span class="p">:</span> <span class="mi">25</span> <span class="p">};</span>
<span class="kd">const</span> <span class="nx">angka</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">];</span>
</code></pre></div></div>

<h3 id="cek-tipe-data">Cek Tipe Data</h3>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="dl">"</span><span class="s2">teks</span><span class="dl">"</span><span class="p">);</span>      <span class="c1">// "string"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="mi">42</span><span class="p">);</span>          <span class="c1">// "number"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="kc">true</span><span class="p">);</span>        <span class="c1">// "boolean"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="kc">undefined</span><span class="p">);</span>   <span class="c1">// "undefined"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="kc">null</span><span class="p">);</span>        <span class="c1">// "object" ← ini bug JS yang terkenal</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="p">{});</span>          <span class="c1">// "object"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="p">[]);</span>          <span class="c1">// "object"</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="k">typeof</span> <span class="kd">function</span><span class="p">(){});</span> <span class="c1">// "function"</span>
</code></pre></div></div>

<hr />

<h2 id="operator">Operator</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Aritmatika</span>
<span class="kd">let</span> <span class="nx">a</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span> <span class="nx">b</span> <span class="o">=</span> <span class="mi">3</span><span class="p">;</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">+</span> <span class="nx">b</span><span class="p">);</span>   <span class="c1">// 13</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">-</span> <span class="nx">b</span><span class="p">);</span>   <span class="c1">// 7</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">*</span> <span class="nx">b</span><span class="p">);</span>   <span class="c1">// 30</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">/</span> <span class="nx">b</span><span class="p">);</span>   <span class="c1">// 3.3333...</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">%</span> <span class="nx">b</span><span class="p">);</span>   <span class="c1">// 1 (sisa bagi / modulo)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="nx">a</span> <span class="o">**</span> <span class="nx">b</span><span class="p">);</span>  <span class="c1">// 1000 (perpangkatan)</span>

<span class="c1">// Assignment</span>
<span class="kd">let</span> <span class="nx">x</span> <span class="o">=</span> <span class="mi">5</span><span class="p">;</span>
<span class="nx">x</span> <span class="o">+=</span> <span class="mi">3</span><span class="p">;</span>   <span class="c1">// x = x + 3 → 8</span>
<span class="nx">x</span> <span class="o">-=</span> <span class="mi">2</span><span class="p">;</span>   <span class="c1">// x = x - 2 → 6</span>
<span class="nx">x</span> <span class="o">*=</span> <span class="mi">4</span><span class="p">;</span>   <span class="c1">// x = x * 4 → 24</span>
<span class="nx">x</span><span class="o">++</span><span class="p">;</span>      <span class="c1">// x = x + 1</span>
<span class="nx">x</span><span class="o">--</span><span class="p">;</span>      <span class="c1">// x = x - 1</span>

<span class="c1">// Perbandingan</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">5</span> <span class="o">==</span> <span class="dl">"</span><span class="s2">5</span><span class="dl">"</span><span class="p">);</span>   <span class="c1">// true  ← perbandingan longgar (type coercion)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">5</span> <span class="o">===</span> <span class="dl">"</span><span class="s2">5</span><span class="dl">"</span><span class="p">);</span>  <span class="c1">// false ← perbandingan ketat (tipe harus sama)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">5</span> <span class="o">!==</span> <span class="mi">3</span><span class="p">);</span>    <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">10</span> <span class="o">&gt;</span> <span class="mi">5</span><span class="p">);</span>     <span class="c1">// true</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="mi">10</span> <span class="o">&gt;=</span> <span class="mi">10</span><span class="p">);</span>   <span class="c1">// true</span>

<span class="c1">// Logika</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="kc">true</span> <span class="o">&amp;&amp;</span> <span class="kc">false</span><span class="p">);</span>  <span class="c1">// false (AND)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="kc">true</span> <span class="o">||</span> <span class="kc">false</span><span class="p">);</span>  <span class="c1">// true  (OR)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="o">!</span><span class="kc">true</span><span class="p">);</span>           <span class="c1">// false (NOT)</span>
</code></pre></div></div>

<p><strong>Aturan penting</strong>: Selalu gunakan <code class="language-plaintext highlighter-rouge">===</code> (triple equals) bukan <code class="language-plaintext highlighter-rouge">==</code> untuk perbandingan, karena <code class="language-plaintext highlighter-rouge">==</code> melakukan type coercion yang bisa menghasilkan hasil mengejutkan.</p>

<hr />

<h2 id="output-dan-input-dasar">Output dan Input Dasar</h2>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Output ke console (untuk debugging)</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">log</span><span class="p">(</span><span class="dl">"</span><span class="s2">Pesan biasa</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">warn</span><span class="p">(</span><span class="dl">"</span><span class="s2">Peringatan</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">error</span><span class="p">(</span><span class="dl">"</span><span class="s2">Error!</span><span class="dl">"</span><span class="p">);</span>
<span class="nx">console</span><span class="p">.</span><span class="nf">table</span><span class="p">([{</span><span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Budi</span><span class="dl">"</span><span class="p">},</span> <span class="p">{</span><span class="na">nama</span><span class="p">:</span> <span class="dl">"</span><span class="s2">Sari</span><span class="dl">"</span><span class="p">}]);</span>

<span class="c1">// Output ke halaman</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="dl">"</span><span class="s2">Teks langsung ke halaman</span><span class="dl">"</span><span class="p">);</span>
<span class="nb">document</span><span class="p">.</span><span class="nf">getElementById</span><span class="p">(</span><span class="dl">"</span><span class="s2">output</span><span class="dl">"</span><span class="p">).</span><span class="nx">textContent</span> <span class="o">=</span> <span class="dl">"</span><span class="s2">Teks ke elemen</span><span class="dl">"</span><span class="p">;</span>

<span class="c1">// Dialog browser (gunakan dengan hati-hati)</span>
<span class="nf">alert</span><span class="p">(</span><span class="dl">"</span><span class="s2">Ini dialog alert</span><span class="dl">"</span><span class="p">);</span>
<span class="kd">const</span> <span class="nx">nama</span> <span class="o">=</span> <span class="nf">prompt</span><span class="p">(</span><span class="dl">"</span><span class="s2">Siapa namamu?</span><span class="dl">"</span><span class="p">);</span>   <span class="c1">// input dari user</span>
<span class="kd">const</span> <span class="nx">setuju</span> <span class="o">=</span> <span class="nf">confirm</span><span class="p">(</span><span class="dl">"</span><span class="s2">Yakin lanjut?</span><span class="dl">"</span><span class="p">);</span> <span class="c1">// true/false</span>
</code></pre></div></div>

<hr />

<h2 id="kesimpulan">Kesimpulan</h2>

<p>JavaScript adalah bahasa yang sangat fleksibel dan powerful. Dengan memahami variabel, tipe data, dan operator dasar, kamu sudah punya fondasi untuk membangun hal-hal yang lebih menarik.</p>

<p>Di artikel berikutnya, kita bahas <strong>kondisi dan perulangan</strong> — cara membuat program yang bisa mengambil keputusan dan mengulang tugas secara otomatis.</p>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="JavaScript" /><category term="featured" /><category term="javascript" /><category term="jquery" /><category term="web-development" /><summary type="html"><![CDATA[Kalau HTML adalah kerangka dan CSS adalah tampilan sebuah halaman web, maka JavaScript adalah otaknya — bagian yang membuat halaman bisa berinteraksi, merespons klik, memuat data tanpa refresh, dan masih banyak lagi. JavaScript adalah satu-satunya bahasa pemrograman yang berjalan langsung di browser, dan saat ini juga bisa berjalan di server melalui Node.js.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/code_js.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/code_js.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Git Best Practices: Cheat Sheet dan Workflow Summary</title><link href="https://blog.kiki.my.id/git-best-practices-cheat-sheet/" rel="alternate" type="text/html" title="Git Best Practices: Cheat Sheet dan Workflow Summary" /><published>2026-10-02T00:00:00+00:00</published><updated>2026-10-02T00:00:00+00:00</updated><id>https://blog.kiki.my.id/git-best-practices-cheat-sheet</id><content type="html" xml:base="https://blog.kiki.my.id/git-best-practices-cheat-sheet/"><![CDATA[<p>Selamat! Kamu telah menyelesaikan 25 artikel tentang <strong>Git dan GitHub</strong> mulai dari basic sampai advanced topics. Artikel terakhir ini adalah <strong>ringkasan best practices</strong> dan <strong>cheat sheet</strong> yang bisa kamu jadikan referensi cepat sehari-hari.</p>

<hr />

<h2 id="git-workflow-github-flow-recommended"><strong>Git Workflow: GitHub Flow (Recommended)</strong></h2>

<p><strong>GitHub Flow</strong> adalah workflow simple dan cocok untuk kebanyakan tim:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>main (production-ready)
  └── feature/login-page (development)
      └── merge via Pull Request + code review
</code></pre></div></div>

<h3 id="step-by-step"><strong>Step-by-Step:</strong></h3>

<p><strong>1. Clone repository:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git clone https://github.com/username/repo.git
<span class="nb">cd </span>repo
</code></pre></div></div>

<p><strong>2. Buat branch baru:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout <span class="nt">-b</span> feature/login-page
</code></pre></div></div>

<p><strong>3. Kerjakan fitur, commit berkala:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git add src/Login.js
git commit <span class="nt">-m</span> <span class="s2">"feat: Add login form UI"</span>
</code></pre></div></div>

<p><strong>4. Push branch ke remote:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git push <span class="nt">-u</span> origin feature/login-page
</code></pre></div></div>

<p><strong>5. Buat Pull Request di GitHub</strong></p>

<p><strong>6. Code review, diskusi, dan revisi</strong></p>

<p><strong>7. Merge PR ke <code class="language-plaintext highlighter-rouge">main</code> (via GitHub UI)</strong></p>

<p><strong>8. Pull update main ke lokal:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout main
git pull
</code></pre></div></div>

<p><strong>9. Hapus branch lokal:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git branch <span class="nt">-d</span> feature/login-page
</code></pre></div></div>

<hr />

<h2 id="commit-messages-best-practices"><strong>Commit Messages Best Practices</strong></h2>

<p>Gunakan <strong>Conventional Commits</strong> format:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;type&gt;(&lt;scope&gt;): &lt;subject&gt;

&lt;body&gt;

&lt;footer&gt;
</code></pre></div></div>

<h3 id="types"><strong>Types:</strong></h3>
<ul>
  <li><code class="language-plaintext highlighter-rouge">feat</code>: Fitur baru</li>
  <li><code class="language-plaintext highlighter-rouge">fix</code>: Bug fix</li>
  <li><code class="language-plaintext highlighter-rouge">docs</code>: Update dokumentasi</li>
  <li><code class="language-plaintext highlighter-rouge">style</code>: Format code (tidak mengubah logic)</li>
  <li><code class="language-plaintext highlighter-rouge">refactor</code>: Refactor code</li>
  <li><code class="language-plaintext highlighter-rouge">test</code>: Tambah atau update test</li>
  <li><code class="language-plaintext highlighter-rouge">chore</code>: Update build tools, dependencies</li>
</ul>

<h3 id="contoh"><strong>Contoh:</strong></h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git commit <span class="nt">-m</span> <span class="s2">"feat(auth): Add JWT token validation"</span>
git commit <span class="nt">-m</span> <span class="s2">"fix(api): Fix null pointer exception in user endpoint"</span>
git commit <span class="nt">-m</span> <span class="s2">"docs: Update README with setup instructions"</span>
</code></pre></div></div>

<h3 id="template-commit-message"><strong>Template Commit Message:</strong></h3>

<p>Create <code class="language-plaintext highlighter-rouge">.gitmessage</code> template:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Type: feat|fix|docs|style|refactor|test|chore</span>
<span class="c"># Scope: auth|api|ui|database|etc</span>
<span class="c"># Subject: imperative, lowercase, no period at end</span>
<span class="c"># --- 50 chars limit ---</span>

<span class="c"># Body (optional):</span>
<span class="c"># Explain what and why, not how</span>
<span class="c"># --- 72 chars limit ---</span>

<span class="c"># Footer (optional):</span>
<span class="c"># Closes #123</span>
<span class="c"># Breaking Change: ...</span>
</code></pre></div></div>

<p><strong>Set sebagai default:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git config <span class="nt">--global</span> commit.template ~/.gitmessage
</code></pre></div></div>

<hr />

<h2 id="branching-strategy"><strong>Branching Strategy</strong></h2>

<h3 id="branch-naming-convention"><strong>Branch Naming Convention:</strong></h3>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>feature/&lt;feature-name&gt;    # Fitur baru
bugfix/&lt;bug-description&gt;  # Bug fix
hotfix/&lt;urgent-fix&gt;       # Production hotfix
release/&lt;version&gt;         # Staging release
</code></pre></div></div>

<p><strong>Contoh:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git checkout <span class="nt">-b</span> feature/user-authentication
git checkout <span class="nt">-b</span> bugfix/fix-login-redirect
git checkout <span class="nt">-b</span> hotfix/critical-security-patch
</code></pre></div></div>

<hr />

<h2 id="git-commands-cheat-sheet"><strong>Git Commands Cheat Sheet</strong></h2>

<h3 id="setup--config"><strong>Setup &amp; Config</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Set username dan email</span>
git config <span class="nt">--global</span> user.name <span class="s2">"Your Name"</span>
git config <span class="nt">--global</span> user.email <span class="s2">"email@example.com"</span>

<span class="c"># Set default editor</span>
git config <span class="nt">--global</span> core.editor <span class="s2">"code --wait"</span>

<span class="c"># Alias shortcuts</span>
git config <span class="nt">--global</span> alias.co checkout
git config <span class="nt">--global</span> alias.br branch
git config <span class="nt">--global</span> alias.st status
git config <span class="nt">--global</span> alias.cm commit
</code></pre></div></div>

<hr />

<h3 id="repository-basics"><strong>Repository Basics</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Init repository</span>
git init

<span class="c"># Clone repository</span>
git clone https://github.com/user/repo.git

<span class="c"># Clone with shallow history</span>
git clone <span class="nt">--depth</span> 1 https://github.com/user/repo.git

<span class="c"># Clone specific branch</span>
git clone <span class="nt">-b</span> develop https://github.com/user/repo.git
</code></pre></div></div>

<hr />

<h3 id="working-with-files"><strong>Working with Files</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Check status</span>
git status

<span class="c"># Add files</span>
git add file.txt
git add src/
git add <span class="nb">.</span>

<span class="c"># Commit</span>
git commit <span class="nt">-m</span> <span class="s2">"commit message"</span>

<span class="c"># Add and commit in one command</span>
git commit <span class="nt">-am</span> <span class="s2">"commit message"</span>

<span class="c"># Amend last commit</span>
git commit <span class="nt">--amend</span> <span class="nt">-m</span> <span class="s2">"new message"</span>

<span class="c"># Unstage file</span>
git reset file.txt

<span class="c"># Discard changes</span>
git restore file.txt
git checkout <span class="nt">--</span> file.txt
</code></pre></div></div>

<hr />

<h3 id="branching"><strong>Branching</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># List branches</span>
git branch
git branch <span class="nt">-a</span>  <span class="c"># include remote</span>

<span class="c"># Create branch</span>
git branch feature-x

<span class="c"># Switch branch</span>
git checkout feature-x
git switch feature-x

<span class="c"># Create and switch</span>
git checkout <span class="nt">-b</span> feature-x
git switch <span class="nt">-c</span> feature-x

<span class="c"># Delete branch</span>
git branch <span class="nt">-d</span> feature-x
git branch <span class="nt">-D</span> feature-x  <span class="c"># force delete</span>

<span class="c"># Rename branch</span>
git branch <span class="nt">-m</span> old-name new-name
</code></pre></div></div>

<hr />

<h3 id="merging--rebasing"><strong>Merging &amp; Rebasing</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Merge branch</span>
git checkout main
git merge feature-x

<span class="c"># Merge with no fast-forward</span>
git merge <span class="nt">--no-ff</span> feature-x

<span class="c"># Abort merge</span>
git merge <span class="nt">--abort</span>

<span class="c"># Rebase</span>
git rebase main

<span class="c"># Rebase interactive</span>
git rebase <span class="nt">-i</span> HEAD~3

<span class="c"># Abort rebase</span>
git rebase <span class="nt">--abort</span>

<span class="c"># Continue rebase after resolving conflicts</span>
git rebase <span class="nt">--continue</span>
</code></pre></div></div>

<hr />

<h3 id="remote-operations"><strong>Remote Operations</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Add remote</span>
git remote add origin https://github.com/user/repo.git

<span class="c"># List remotes</span>
git remote <span class="nt">-v</span>

<span class="c"># Fetch updates</span>
git fetch
git fetch origin

<span class="c"># Pull (fetch + merge)</span>
git pull
git pull origin main

<span class="c"># Pull with rebase</span>
git pull <span class="nt">--rebase</span>

<span class="c"># Push</span>
git push
git push origin main

<span class="c"># Push new branch</span>
git push <span class="nt">-u</span> origin feature-x

<span class="c"># Force push (dangerous!)</span>
git push <span class="nt">--force</span>
git push <span class="nt">--force-with-lease</span>  <span class="c"># safer</span>
</code></pre></div></div>

<hr />

<h3 id="histori--logs"><strong>Histori &amp; Logs</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># View log</span>
git log
git log <span class="nt">--oneline</span>
git log <span class="nt">--graph</span> <span class="nt">--oneline</span> <span class="nt">--all</span>

<span class="c"># View specific file history</span>
git log file.txt

<span class="c"># View changes</span>
git diff
git diff HEAD~1 HEAD
git diff main..feature-x

<span class="c"># View commit details</span>
git show commit-sha

<span class="c"># Search commits</span>
git log <span class="nt">--grep</span><span class="o">=</span><span class="s2">"bug fix"</span>
git log <span class="nt">--author</span><span class="o">=</span><span class="s2">"John"</span>
</code></pre></div></div>

<hr />

<h3 id="undo--reset"><strong>Undo &amp; Reset</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Undo last commit (keep changes)</span>
git reset <span class="nt">--soft</span> HEAD~1

<span class="c"># Undo last commit (discard changes)</span>
git reset <span class="nt">--hard</span> HEAD~1

<span class="c"># Undo file to specific commit</span>
git checkout commit-sha <span class="nt">--</span> file.txt

<span class="c"># Revert commit (create new commit)</span>
git revert commit-sha

<span class="c"># Clean untracked files</span>
git clean <span class="nt">-fd</span>
</code></pre></div></div>

<hr />

<h3 id="stash"><strong>Stash</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Stash changes</span>
git stash
git stash save <span class="s2">"work in progress"</span>

<span class="c"># List stashes</span>
git stash list

<span class="c"># Apply stash</span>
git stash apply
git stash apply stash@<span class="o">{</span>1<span class="o">}</span>

<span class="c"># Apply and drop</span>
git stash pop

<span class="c"># Drop stash</span>
git stash drop stash@<span class="o">{</span>0<span class="o">}</span>

<span class="c"># Clear all stashes</span>
git stash clear
</code></pre></div></div>

<hr />

<h3 id="tags"><strong>Tags</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Create tag</span>
git tag v1.0.0

<span class="c"># Create annotated tag</span>
git tag <span class="nt">-a</span> v1.0.0 <span class="nt">-m</span> <span class="s2">"Release version 1.0.0"</span>

<span class="c"># List tags</span>
git tag

<span class="c"># Push tag</span>
git push origin v1.0.0

<span class="c"># Push all tags</span>
git push <span class="nt">--tags</span>

<span class="c"># Delete tag</span>
git tag <span class="nt">-d</span> v1.0.0
git push origin <span class="nt">--delete</span> v1.0.0
</code></pre></div></div>

<hr />

<h3 id="advanced-commands"><strong>Advanced Commands</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Cherry-pick commit</span>
git cherry-pick commit-sha

<span class="c"># View reflog</span>
git reflog

<span class="c"># Garbage collection</span>
git gc <span class="nt">--aggressive</span> <span class="nt">--prune</span><span class="o">=</span>now

<span class="c"># Find who changed a line</span>
git blame file.txt

<span class="c"># Search in code</span>
git <span class="nb">grep</span> <span class="s2">"search term"</span>

<span class="c"># Bisect (find bug commit)</span>
git bisect start
git bisect bad HEAD
git bisect good commit-sha
</code></pre></div></div>

<hr />

<h2 id="github-specific-tips"><strong>GitHub-Specific Tips</strong></h2>

<h3 id="pull-request-best-practices"><strong>Pull Request Best Practices:</strong></h3>

<p>✅ <strong>Keep PR small</strong> (&lt; 400 lines)
✅ <strong>Write descriptive title dan description</strong>
✅ <strong>Add screenshots untuk UI changes</strong>
✅ <strong>Link related issues:</strong> <code class="language-plaintext highlighter-rouge">Closes #123</code>
✅ <strong>Request specific reviewers</strong>
✅ <strong>Respond to review comments</strong></p>

<h3 id="github-cli"><strong>GitHub CLI:</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Install gh</span>
brew <span class="nb">install </span>gh  <span class="c"># macOS</span>
choco <span class="nb">install </span>gh  <span class="c"># Windows</span>

<span class="c"># Login</span>
gh auth login

<span class="c"># Create PR</span>
gh <span class="nb">pr </span>create <span class="nt">--title</span> <span class="s2">"Add login feature"</span> <span class="nt">--body</span> <span class="s2">"Description"</span>

<span class="c"># List PRs</span>
gh <span class="nb">pr </span>list

<span class="c"># View PR</span>
gh <span class="nb">pr </span>view 42

<span class="c"># Checkout PR locally</span>
gh <span class="nb">pr </span>checkout 42

<span class="c"># Merge PR</span>
gh <span class="nb">pr </span>merge 42 <span class="nt">--squash</span>
</code></pre></div></div>

<hr />

<h2 id="security-best-practices"><strong>Security Best Practices</strong></h2>

<h3 id="1-never-commit-secrets"><strong>1. Never Commit Secrets</strong></h3>

<p><strong>Use <code class="language-plaintext highlighter-rouge">.gitignore</code>:</strong></p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>.env
*.key
*.pem
secrets.yml
</code></pre></div></div>

<p><strong>Check for leaked secrets:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git log <span class="nt">--all</span> <span class="nt">--</span> .env
</code></pre></div></div>

<p><strong>Remove committed secret:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git filter-repo <span class="nt">--path</span> .env <span class="nt">--invert-paths</span>
</code></pre></div></div>

<hr />

<h3 id="2-sign-commits-dengan-gpg"><strong>2. Sign Commits dengan GPG</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Generate GPG key</span>
gpg <span class="nt">--gen-key</span>

<span class="c"># List keys</span>
gpg <span class="nt">--list-secret-keys</span> <span class="nt">--keyid-format</span><span class="o">=</span>long

<span class="c"># Configure Git</span>
git config <span class="nt">--global</span> user.signingkey YOUR_KEY_ID
git config <span class="nt">--global</span> commit.gpgsign <span class="nb">true</span>

<span class="c"># Signed commit</span>
git commit <span class="nt">-S</span> <span class="nt">-m</span> <span class="s2">"Signed commit"</span>
</code></pre></div></div>

<hr />

<h3 id="3-enable-2fa-di-github"><strong>3. Enable 2FA di GitHub</strong></h3>

<p>✅ Settings → Security → Two-factor authentication → Enable</p>

<hr />

<h2 id="productivity-tips"><strong>Productivity Tips</strong></h2>

<h3 id="1-git-aliases"><strong>1. Git Aliases</strong></h3>

<p>Add to <code class="language-plaintext highlighter-rouge">~/.gitconfig</code>:</p>
<div class="language-ini highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nn">[alias]</span><span class="w">
    </span><span class="py">co</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">checkout</span>
<span class="w">    </span><span class="py">br</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">branch</span>
<span class="w">    </span><span class="py">ci</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">commit</span>
<span class="w">    </span><span class="py">st</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">status</span>
<span class="w">    </span><span class="py">unstage</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">reset HEAD --</span>
<span class="w">    </span><span class="py">last</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">log -1 HEAD</span>
<span class="w">    </span><span class="py">visual</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">log --graph --oneline --all</span>
<span class="w">    </span><span class="py">amend</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="s">commit --amend --no-edit</span>
</code></pre></div></div>

<p><strong>Usage:</strong></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>git co main
git br <span class="nt">-a</span>
git visual
</code></pre></div></div>

<hr />

<h3 id="2-shell-prompt-with-git-branch"><strong>2. Shell Prompt with Git Branch</strong></h3>

<p><strong>For Bash:</strong> Add to <code class="language-plaintext highlighter-rouge">~/.bashrc</code>:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>parse_git_branch<span class="o">()</span> <span class="o">{</span>
  git branch 2&gt; /dev/null | <span class="nb">sed</span> <span class="nt">-e</span> <span class="s1">'/^[^*]/d'</span> <span class="nt">-e</span> <span class="s1">'s/* \(.*\)/(\1)/'</span>
<span class="o">}</span>
<span class="nb">export </span><span class="nv">PS1</span><span class="o">=</span><span class="s2">"</span><span class="se">\u</span><span class="s2">@</span><span class="se">\h</span><span class="s2"> </span><span class="se">\W</span><span class="s2"> </span><span class="se">\[\0</span><span class="s2">33[32m</span><span class="se">\]\$</span><span class="s2">(parse_git_branch)</span><span class="se">\[\0</span><span class="s2">33[00m</span><span class="se">\]</span><span class="s2"> </span><span class="nv">$ </span><span class="s2">"</span>
</code></pre></div></div>

<p><strong>For Zsh:</strong> Use <strong>Oh My Zsh</strong> with <code class="language-plaintext highlighter-rouge">git</code> plugin enabled.</p>

<hr />

<h3 id="3-vscode-git-integration"><strong>3. VSCode Git Integration</strong></h3>

<p>✅ <strong>GitLens extension:</strong> Enhanced Git visualization
✅ <strong>Git Graph:</strong> Visual commit history
✅ <strong>Source Control panel:</strong> Built-in Git UI</p>

<hr />

<h2 id="troubleshooting-common-issues"><strong>Troubleshooting Common Issues</strong></h2>

<h3 id="1-merge-conflict"><strong>1. Merge Conflict</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># View conflicts</span>
git status

<span class="c"># Edit files, remove conflict markers</span>
<span class="o">&lt;&lt;&lt;&lt;&lt;&lt;</span>&lt;, <span class="o">=======</span>, <span class="o">&gt;&gt;&gt;&gt;&gt;&gt;&gt;</span>

<span class="c"># Mark as resolved</span>
git add file.txt

<span class="c"># Complete merge</span>
git commit
</code></pre></div></div>

<hr />

<h3 id="2-accidental-commit-to-wrong-branch"><strong>2. Accidental Commit to Wrong Branch</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Reset commit (keep changes)</span>
git reset <span class="nt">--soft</span> HEAD~1

<span class="c"># Switch to correct branch</span>
git checkout correct-branch

<span class="c"># Commit again</span>
git commit <span class="nt">-m</span> <span class="s2">"commit message"</span>
</code></pre></div></div>

<hr />

<h3 id="3-forgot-to-pull-before-push"><strong>3. Forgot to Pull Before Push</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Pull with rebase</span>
git pull <span class="nt">--rebase</span>

<span class="c"># Resolve conflicts if any</span>

<span class="c"># Push</span>
git push
</code></pre></div></div>

<hr />

<h3 id="4-need-to-edit-old-commit-message"><strong>4. Need to Edit Old Commit Message</strong></h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c"># Interactive rebase</span>
git rebase <span class="nt">-i</span> HEAD~3

<span class="c"># Change "pick" to "reword" for commit to edit</span>
<span class="c"># Save and close editor</span>

<span class="c"># Edit commit message in new editor</span>

<span class="c"># Force push (if already pushed)</span>
git push <span class="nt">--force-with-lease</span>
</code></pre></div></div>

<hr />

<h2 id="final-checklist"><strong>Final Checklist</strong></h2>

<p>✅ <strong>Always pull before starting work</strong>
✅ <strong>Create branch untuk setiap fitur</strong>
✅ <strong>Commit small dan sering</strong>
✅ <strong>Write descriptive commit messages</strong>
✅ <strong>Review own changes sebelum commit</strong>
✅ <strong>Run tests sebelum push</strong>
✅ <strong>Create PR untuk code review</strong>
✅ <strong>Merge hanya setelah approval</strong>
✅ <strong>Delete branch after merge</strong>
✅ <strong>Keep main branch production-ready</strong></p>

<hr />

<h2 id="kesimpulan"><strong>Kesimpulan</strong></h2>

<p>Git adalah tool yang powerful, tapi bisa overwhelming untuk pemula. Dengan mengikuti <strong>best practices</strong> dan <strong>workflow</strong> yang konsisten, Git akan menjadi alat yang sangat membantu dalam development sehari-hari.</p>

<p><strong>Key Takeaways dari 25 Artikel:</strong></p>
<ol>
  <li><strong>Git Basics:</strong> Init, add, commit, log, diff</li>
  <li><strong>Branching:</strong> Branch, merge, rebase, stash</li>
  <li><strong>Remote:</strong> Clone, push, pull, fetch</li>
  <li><strong>GitHub:</strong> Fork, PR, code review, organizations</li>
  <li><strong>Advanced:</strong> Hooks, submodules, monorepo, reflog</li>
  <li><strong>Optimization:</strong> GC, LFS, shallow clone, sparse checkout</li>
</ol>

<p>Selamat! Kamu sekarang punya fondasi kuat untuk menggunakan Git dan GitHub seperti pro. Happy coding! 🚀</p>

<hr />

<p><strong>Resources:</strong></p>
<ul>
  <li><a href="https://git-scm.com/doc">Git Official Docs</a></li>
  <li><a href="https://docs.github.com">GitHub Docs</a></li>
  <li><a href="https://www.atlassian.com/git/tutorials">Atlassian Git Tutorials</a></li>
  <li><a href="https://ohmyz.sh">Oh My Zsh</a></li>
  <li><a href="https://cli.github.com">GitHub CLI</a></li>
</ul>]]></content><author><name>kiki</name></author><category term="Tutorial" /><category term="Git" /><category term="featured" /><category term="git" /><category term="version-control" /><category term="github" /><summary type="html"><![CDATA[Selamat! Kamu telah menyelesaikan 25 artikel tentang Git dan GitHub mulai dari basic sampai advanced topics. Artikel terakhir ini adalah ringkasan best practices dan cheat sheet yang bisa kamu jadikan referensi cepat sehari-hari.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blog.kiki.my.id/assets/images/main/git_and_github.png" /><media:content medium="image" url="https://blog.kiki.my.id/assets/images/main/git_and_github.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>