Learn JavaScript

lesson ā§§ / ⧝ ¡ form, storage āφāϰ āϛ⧋āϟ app

Module ā§§ā§Ģ ¡ form, storage āφāϰ āϛ⧋āϟ app

Form āφāϰ storage-āĻāϰ āĻ›āĻŦāĻŋ: āϝ⧇ page āĻŽāύ⧇ āϰāĻžāϖ⧇

FreeāĻĒāĻĄāĻŧāĻž

āĻāχ lesson-āĻ āϝāĻž āĻļāĻŋāĻ–āĻŦ⧇

  • submit event-āĻāϰ āϭ⧇āϤāϰ⧇ āĻāĻ•āϟāĻž form-āĻāϰ field-āϗ⧁āϞ⧋ āĻĒāĻĄāĻŧā§‹, āφāϰ preventDefault āĻĻāĻŋāϝāĻŧ⧇ page-āϕ⧇ āϚāϞ⧇ āϝ⧇āϤ⧇ āĻĻāĻŋāĻ“ āύāĻžāĨ¤
  • āĻŦ⧁āĻāĻŋāϝāĻŧ⧇ āĻŦāϞ⧋ āĻĒā§āϰāϤāĻŋāϟāĻž field āϕ⧇āύ string āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ, āφāϰ āϝ⧋āĻ— āĻ•āϰāĻžāϰ āφāϗ⧇ āĻāĻ•āϟāĻž number field-āϕ⧇ number āĻŦāĻžāύāĻžāĻ“āĨ¤
  • āĻāĻ•āϟāĻž page-āĻāϰ state JSON text āĻšāĻŋāϏ⧇āĻŦ⧇ storage-āĻ āϰāĻžāĻ–ā§‹, āφāϰ page āφāĻŦāĻžāϰ āϖ⧁āϞāϞ⧇ āϏ⧇āϟāĻž āĻĢ⧇āϰāϤ āĻĒāĻĄāĻŧā§‹āĨ¤

Mirpur-āĻ Nusrat āĻļ⧁āĻ•ā§āϰ-āĻļāύāĻŋāĻŦāĻžāϰ⧇ āĻāĻ•āϟāĻž āĻ…āĻ™ā§āϕ⧇āϰ club āϚāĻžāϞāĻžāϝāĻŧāĨ¤ āĻ“ āĻāĻ•āϟāĻž sign-up page āĻŦāĻžāύāĻŋāϝāĻŧ⧇āϛ⧇, āϤāĻžāϤ⧇ āϤāĻŋāύāϟāĻž field: āĻ›āĻžāĻ¤ā§āϰ⧇āϰ āύāĻžāĻŽ, class, āφāϰ āĻļāύāĻŋāĻŦāĻžāϰ⧇āϰ batch-āĻāϰ āϜāĻ¨ā§āϝ āϟāĻŋāĻ• āĻĻ⧇āĻ“āϝāĻŧāĻžāϰ āĻāĻ•āϟāĻž āϘāϰāĨ¤ āĻāĻ•āϜāύ āĻ…āĻ­āĻŋāĻ­āĻžāĻŦāĻ• āϏāĻŦ āĻ­āϰ⧇ āĻŦā§‹āϤāĻžāĻŽ āϚāĻžāĻĒāϞ⧇āύāĨ¤ Page āĻāĻ•āĻŦāĻžāϰ āĻāϞāϕ⧇ āωāĻ āϞ, field-āϗ⧁āϞ⧋ āĻĢāĻžāρāĻ•āĻž āĻšāϝāĻŧ⧇ āϗ⧇āϞ, āφāϰ āϕ⧋āĻĨāĻžāĻ“ āĻ•āĻŋāϛ⧁āχ āϰāχāϞ āύāĻžāĨ¤

āϤāĻžāϰāĻĒāϰ āφāϰ⧇āĻ•āϟāĻž āϏāĻŽāĻ¸ā§āϝāĻžāĨ¤ Nusrat page-āĻ āĻāĻ•āϟāĻž āϞāĻŽā§āĻŦāĻž note-āĻāϰ āĻ…āĻ°ā§āϧ⧇āĻ• āϟāĻžāχāĻĒ āĻ•āϰ⧇āϛ⧇, āϭ⧁āϞ āĻ•āϰ⧇ tab āĻŦāĻ¨ā§āϧ āĻ•āϰ⧇ āφāĻŦāĻžāϰ āϖ⧁āϞāϞāĨ¤ Note āύ⧇āχāĨ¤ Page āĻŦāĻ¨ā§āϧ āĻšāĻ“āϝāĻŧāĻžāϰ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇āχ āϏāĻŦ āϭ⧁āϞ⧇ āϗ⧇āϛ⧇āĨ¤

āĻāχ module-āĻāϰ āϏāĻŽāĻ¸ā§āϝāĻž āĻāχ āĻĻ⧁āĻŸā§‹āχāĨ¤ Form-āϕ⧇ page āϛ⧇āĻĄāĻŧ⧇ āύāĻž āĻ—āĻŋāϝāĻŧ⧇ āύāĻŋāĻœā§‡āϰ value-āϗ⧁āϞ⧋ āϤ⧋āĻŽāĻžāϰ code-āĻāϰ āĻšāĻžāϤ⧇ āĻĻāĻŋāϤ⧇ āĻšāĻŦ⧇āĨ¤ āφāϰ page-āϕ⧇ āĻāĻ•āĻŦāĻžāϰ āĻ–ā§‹āϞāĻž āĻĨ⧇āϕ⧇ āφāϰ⧇āĻ•āĻŦāĻžāϰ āĻ–ā§‹āϞāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤ āĻāĻ•āϟ⧁ state āĻŽāύ⧇ āϰāĻžāĻ–āϤ⧇ āĻšāĻŦ⧇, āϕ⧋āύ⧋ server āĻ›āĻžāĻĄāĻŧāĻžāχāĨ¤ Module 14 āĻļāĻŋāĻ–āĻŋāϝāĻŧ⧇āϛ⧇ element āĻ–ā§‹āρāϜāĻž āφāϰ event āĻļā§‹āύāĻžāĨ¤ āĻāχ module āϤāĻžāϰ āĻ“āĻĒāϰ āĻĻāĻžāρāĻĄāĻŧāĻžāϝāĻŧ, āĻāĻ•āϟāĻž form āφāϰ āĻāĻ•āϟāĻž storage āĻ•āϰ⧇ āĻ•āϰ⧇, āφāϰ āĻļ⧇āώ āĻšāϝāĻŧ āϤāĻŋāύāϟāĻž āϛ⧋āϟ app āĻĻāĻŋāϝāĻŧ⧇: āĻāĻ•āϟāĻž note taker, āĻāĻ•āϟāĻž settings panel āφāϰ āĻāĻ•āϟāĻž timerāĨ¤

Form āĻŽāĻžāύ⧇ field-āĻāϰ āĻāĻ•āϟāĻž āĻŦāĻžāĻ•ā§āϏ

Form āĻāĻŽāύ āĻāĻ•āϟāĻž element, āϝ⧇āϟāĻž field-āϗ⧁āϞ⧋āϕ⧇ āĻāĻ•āϏāĻžāĻĨ⧇ āϰāĻžāϖ⧇: text-āĻāϰ āϘāϰ, number-āĻāϰ āϘāϰ, checkbox āφāϰ listāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž field āĻāĻ•āϟāĻž input, āĻāĻ•āϟāĻž select āĻŦāĻž āĻāĻ•āϟāĻž textareaāĨ¤ Field-āĻāϰ āĻ•āĻžāϛ⧇ āĻĒ⧌āρāĻ›āĻžāĻ“ Module 14-āĻāϰ āĻŽāϤ⧋āχ, document.getElementById āĻŦāĻž querySelector āĻĻāĻŋāϝāĻŧ⧇, āφāϰ user āϕ⧀ āϟāĻžāχāĻĒ āĻ•āϰ⧇āϛ⧇ āϏ⧇āϟāĻž āĻĒāĻĄāĻŧā§‹ āĻ“āϰ value āĻĨ⧇āϕ⧇āĨ¤

āĻāχ āĻšāϞ⧋ Nusrat-āĻāϰ form, āĻāĻ•āϟāĻž page āĻšāĻŋāϏ⧇āĻŦ⧇āĨ¤ Run āϚāĻžāĻĒā§‹, āĻāĻ•āϟāĻž āύāĻžāĻŽ āϟāĻžāχāĻĒ āĻ•āϰ⧋, āĻāĻ•āϟāĻž class āĻŦāĻžāϛ⧋, āϤāĻžāϰāĻĒāϰ āĻŦā§‹āϤāĻžāĻŽ āϚāĻžāĻĒā§‹āĨ¤

<!doctype html>
<html>
<body>
  <form id="signup">
    <label>Name <input id="student" type="text"></label>
    <label>Class <input id="grade" type="number" min="1" max="12"></label>
    <label><input id="saturday" type="checkbox"> Saturday batch</label>
    <button type="submit">Sign up</button>
  </form>
  <p id="result">Nobody has signed up yet.</p>
  <script>
    const form = document.getElementById("signup");
    form.addEventListener("submit", (event) => {
      event.preventDefault();
      const who = document.getElementById("student").value;
      const grade = document.getElementById("grade").value;
      const saturday = document.getElementById("saturday").checked;
      document.getElementById("result").textContent =
        who + " joins class " + grade + (saturday ? ", Saturday batch" : "");
      console.log({ who, grade, saturday });
    });
  </script>
</body>
</html>
Run in Compiler

Page-āĻ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ āϤāĻŋāύāϟāĻž field āφāϰ āϤāĻžāϰ āύāĻŋāĻšā§‡ āĻāĻ• āϞāĻžāχāύ āϞ⧇āĻ–āĻžāĨ¤ āĻŦā§‹āϤāĻžāĻŽ āϚāĻžāĻĒāϞ⧇ āϞāĻžāχāύāϟāĻž āĻŦāĻĻāϞ⧇ āĻšāϝāĻŧ āϤ⧋āĻŽāĻžāϰ āĻĻ⧇āĻ“āϝāĻŧāĻž āύāĻžāĻŽ, class āφāϰ batchāĨ¤ Field-āϗ⧁āϞ⧋āϤ⧇ āϤ⧁āĻŽāĻŋ āϝāĻž āϟāĻžāχāĻĒ āĻ•āϰ⧇āĻ› āϏ⧇āϟāĻž āĻĨ⧇āϕ⧇ āϝāĻžāϝāĻŧāĨ¤ Page-āĻāϰ āύāĻŋāĻšā§‡āϰ console-āĻ āĻāĻ•āχ āϤāĻŋāύāϟāĻž value āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧ, āĻāĻ•āϟāĻž object āĻšāĻŋāϏ⧇āĻŦ⧇āĨ¤

Text-āĻāϰ āϘāϰ āφāϰ number-āĻāϰ āϘāϰ āĻĻ⧁āĻŸā§‹āχ āύāĻŋāĻœā§‡āϰ text āĻĻ⧇āϝāĻŧ value āĻĻāĻŋāϝāĻŧ⧇āĨ¤ Checkbox āφāϞāĻžāĻĻāĻž: āĻ“āϰ value āĻāĻ•āϟāĻž āύāĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āϟ label, āφāϰ āϟāĻŋāĻ• āĻĻ⧇āĻ“āϝāĻŧāĻž āφāϛ⧇ āĻ•āĻŋāύāĻž āϏ⧇āϟāĻž āĻĨāĻžāϕ⧇ checked-āĻ, āϝ⧇āϟāĻž true āĻŦāĻž falseāĨ¤ āϏāĻŦ āϰāĻ•āĻŽ field āĻĻ⧇āĻ–āĻžāĻŦ⧇ Lesson 02āĨ¤

submit āφāϰ preventDefault

Form-āĻāϰ āĻāĻ•āϟāĻž āύāĻŋāϜāĻ¸ā§āĻŦ āĻ•āĻžāϜ āφāϛ⧇āĨ¤ User āϝāĻ–āύ āĻ“āϰ submit āĻŦā§‹āϤāĻžāĻŽ āϚāĻžāĻĒ⧇, āĻŦāĻž āϕ⧋āύ⧋ text-āĻāϰ āϘāϰ⧇ Enter āϚāĻžāĻĒ⧇, browser āϏ⧇āϟāĻž submit āĻ•āϰ⧇āĨ¤ Submit āĻŽāĻžāύ⧇: āĻĒā§āϰāϤāĻŋāϟāĻž field āϜāĻĄāĻŧā§‹ āĻ•āϰ⧋, form-āĻāϰ action-āĻ āϞ⧇āĻ–āĻž āĻ āĻŋāĻ•āĻžāύāĻžāϝāĻŧ āĻĒāĻžāĻ āĻžāĻ“, āφāϰ āϝ⧇ page āĻĢ⧇āϰāϤ āφāϏ⧇ āϏ⧇āϟāĻž load āĻ•āϰ⧋āĨ¤ JavaScript-āĻāϰ āφāϗ⧇ web āĻāĻ­āĻžāĻŦ⧇āχ āϚāϞāϤ, āφāϰ āϕ⧋āύ⧋ script āĻ›āĻžāĻĄāĻŧāĻžāĻ“ āĻāϟāĻž āφāϜāĻ“ āϚāϞ⧇āĨ¤

āĻāϟāĻž āĻ•āϰāĻžāϰ āφāϗ⧇ browser form-āĻāϰ āĻ“āĻĒāϰ āĻāĻ•āϟāĻž submit event āĻ›āĻžāĻĄāĻŧ⧇āĨ¤ āϤ⧋āĻŽāĻžāϰ listener āϚāϞ⧇ āφāϗ⧇āĨ¤ āϤāĻžāϰ āϭ⧇āϤāϰ⧇ event.preventDefault() browser-āĻāϰ āύāĻŋāĻœā§‡āϰ āĻ•āĻžāϜāϟāĻž āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧ, āϤāĻžāχ page āϝ⧇āĻ–āĻžāύ⧇ āĻ›āĻŋāϞ āϏ⧇āĻ–āĻžāύ⧇āχ āĻĨāĻžāϕ⧇āĨ¤ āĻāĻŦāĻžāϰ value-āϗ⧁āϞ⧋āϰ āϕ⧀ āĻšāĻŦ⧇, āϏ⧇āϟāĻž āĻ āĻŋāĻ• āĻ•āϰ⧇ āϤ⧋āĻŽāĻžāϰ codeāĨ¤

āĻļā§‹āύ⧋ form-āĻāϰ submit, āĻŦā§‹āϤāĻžāĻŽā§‡āϰ click āύāĻžāĨ¤ āϕ⧇āω field-āĻāϰ āϭ⧇āϤāϰ⧇ Enter āϚāĻžāĻĒāϞ⧇āĻ“ submit event āφāϏ⧇, āφāϰ āφāϏ⧇ browser-āĻāϰ āύāĻŋāĻœā§‡āϰ āϝāĻžāϚāĻžāχ āĻĒāĻžāϰ āĻšāĻ“āϝāĻŧāĻžāϰ āĻĒāϰ⧇āχ, āϝ⧇āĻŽāύ āĻāĻ•āϟāĻž required fieldāĨ¤ click listener Enter āϚāĻžāĻĒāĻž āϧāϰāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž, āφāϰ form āϤ⧈āϰāĻŋ āύāĻž āĻĨāĻžāĻ•āϞ⧇āĻ“ āϚāϞ⧇ āϝāĻžāϝāĻŧāĨ¤

Reader-āĻāϰ preview-āϤ⧇ āύāĻž āĻĨāĻžāĻŽāĻžāύ⧋ form-āĻ“ page āϛ⧇āĻĄāĻŧ⧇ āϝāĻžāϝāĻŧ āύāĻž, āĻ•āĻžāϰāĻŖ preview āϕ⧋āĻĨāĻžāĻ“ āĻ•āĻŋāϛ⧁ āĻĒāĻžāĻ āĻžāϝāĻŧ āύāĻžāĨ¤ āφāϏāϞ site-āĻ āϝ⧇āϤ, āφāϰ field-āϗ⧁āϞ⧋ āĻĢāĻžāρāĻ•āĻž āĻšāϝāĻŧ⧇ āϝ⧇āϤ, āĻ āĻŋāĻ• Nusrat-āĻāϰ āĻŽāϤ⧋āĨ¤ āϤāĻžāχ āĻāχ module-āĻāϰ āĻĒā§āϰāϤāĻŋāϟāĻž form handler āϏāĻŦāĻžāϰ āφāϗ⧇ preventDefault() āĻĄāĻžāϕ⧇āĨ¤

āĻĒā§āϰāϤāĻŋāϟāĻž field āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ string

Module 2-āĻ āĻāĻ•āϟāĻž āύāĻŋāϝāĻŧāĻŽ āĻĻ⧇āϖ⧇āĻ›āĻŋāϞ⧇, āĻāĻŦāĻžāϰ āϤāĻžāϰ āφāϏāϞ āĻĢāϞ āĻĻ⧇āĻ–āĻŦ⧇āĨ¤ āĻāĻ•āϟāĻž field-āĻāϰ value āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻ•āϟāĻž string, type="number" āĻĻ⧇āĻ“āϝāĻŧāĻž āϘāϰ⧇āĻ“āĨ¤ Browser āĻāĻ•āϟāĻž number pad āĻĻ⧇āĻ–āĻžāϝāĻŧ āĻ āĻŋāĻ•āχ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻšāĻžāϤ⧇ āĻĻ⧇āϝāĻŧ textāĨ¤ āĻāĻŽāύ āĻĻ⧁āĻŸā§‹ value + āĻĻāĻŋāϝāĻŧ⧇ āϝ⧋āĻ— āĻ•āϰāϞ⧇ āĻĻ⧁āĻŸā§‹ string āĻœā§‹āĻĄāĻŧāĻž āϞāĻžāϗ⧇āĨ¤

Preview āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ–āĻžāύ⧇ page āϚāϞ⧇ āύāĻž, āϤāĻžāχ āύāĻŋāĻšā§‡āϰ program āĻĻ⧁āĻŸā§‹ field-āĻāϰ āϜāĻžāϝāĻŧāĻ—āĻžāϝāĻŧ āϏāĻžāϧāĻžāϰāĻŖ object āĻŦāϏāĻžāϝāĻŧāĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž object-āĻ āϏ⧇āχ value, āϝ⧇āϟāĻž āĻāĻ•āϟāĻž number-āĻāϰ āϘāϰ āĻĻāĻŋāϤāĨ¤

const first = { value: "5" };   // what a type="number" box gives back
const second = { value: "2" };

console.log(first.value + second.value);
console.log(Number(first.value) + Number(second.value));
console.log(typeof first.value);
console.log(Number(""), Number("  "), Number("5kg"));
52
7
string
0 0 NaN
Run in Compiler

āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύ āϏāĻ‚āĻ–ā§āϝāĻž āϝ⧋āĻ— āύāĻž āĻ•āϰ⧇ text āĻĻ⧁āĻŸā§‹ āϜ⧁āĻĄāĻŧ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āϞāĻžāχāύ āφāϗ⧇ āĻĒā§āϰāϤāĻŋāϟāĻž value-āϕ⧇ Number āĻĻāĻŋāϝāĻŧ⧇ āĻŦāĻĻāϞāĻžāϝāĻŧ, āϤāĻžāχ āϝ⧋āĻ—āĻĢāϞ āĻ āĻŋāĻ• āφāϏ⧇āĨ¤ āĻļ⧇āώ āϞāĻžāχāύ⧇ āĻĒāϰ⧇āϰ āϜāĻ¨ā§āϝ āϤāĻŋāύāϟāĻž āĻĢāĻžāρāĻĻ āϰāĻžāĻ–āĻžāĨ¤ āĻĢāĻžāρāĻ•āĻž field āĻšāϝāĻŧ⧇ āϝāĻžāϝāĻŧ 0, āĻļ⧁āϧ⧁ space-āĻ“āϝāĻŧāĻžāϞāĻž field-āĻ“ 0, āφāϰ āϏāĻ‚āĻ–ā§āϝāĻž āύāĻž āĻāĻŽāύ text āĻšāϝāĻŧ NaNāĨ¤

āϤāĻžāχ āĻ…āĻ­ā§āϝāĻžāϏāϟāĻž āϛ⧋āϟāĨ¤ Field āĻĒāĻĄāĻŧāĻžāϰ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇āχ āĻ“āϕ⧇ number āĻŦāĻžāύāĻžāĻ“, āφāϰ āĻŦāĻžāύāĻžāύ⧋āϰ āφāϗ⧇ āĻ āĻŋāĻ• āĻ•āϰ⧋ āĻĢāĻžāρāĻ•āĻž field āĻŽāĻžāύ⧇ āϕ⧀āĨ¤ āĻĢāĻžāρāĻ•āĻž class āĻŽāĻžāύ⧇ class āĻļā§‚āĻ¨ā§āϝ āύāĻžāĨ¤

Storage āϰāĻžāϖ⧇ āĻļ⧁āϧ⧁ string

āĻāĻŦāĻžāϰ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āϏāĻŽāĻ¸ā§āϝāĻž: āĻŽāύ⧇ āϰāĻžāĻ–āĻžāĨ¤ Browser āĻĒā§āϰāϤāĻŋāϟāĻž site-āϕ⧇ āĻāĻ•āϟāĻž āϛ⧋āϟ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ āĻĻ⧇āϝāĻŧ, āύāĻžāĻŽ localStorageāĨ¤ āĻāϟāĻž key āφāϰ value-āĻāϰ āĻœā§‹āĻĄāĻŧāĻž āϰāĻžāϖ⧇, āφāϰ tab āĻŦāĻ¨ā§āϧ āĻ•āϰāϞ⧇, browser āĻŦāĻ¨ā§āϧ āĻ•āϰāϞ⧇, āĻāĻŽāύāĻ•āĻŋ computer āφāĻŦāĻžāϰ āϚāĻžāϞ⧁ āĻ•āϰāϞ⧇āĻ“ āϟāĻŋāϕ⧇ āĻĨāĻžāϕ⧇āĨ¤ āĻāϰ āĻĒā§āϰāϧāĻžāύ āϤāĻŋāύāϟāĻž call āĻšāϞ⧋ setItem(key, value), getItem(key) āφāϰ removeItem(key)āĨ¤

āĻāχ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ⧇āϰ āĻāĻ•āϟāĻž āĻ•āĻĄāĻŧāĻž āύāĻŋāϝāĻŧāĻŽ: āĻāϟāĻž āĻļ⧁āϧ⧁ string āϰāĻžāϖ⧇āĨ¤ setItem-āϕ⧇ āĻāĻ•āϟāĻž number, array āĻŦāĻž object āĻĻāĻŋāϞ⧇ āϏ⧇ āφāϗ⧇ value-āϟāĻžāϕ⧇ string āĻŦāĻžāύāĻžāϝāĻŧ, āĻ āĻŋāĻ• āϝ⧇āĻ­āĻžāĻŦ⧇ String(value) āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ Object-āĻāϰ āĻŦ⧇āϞāĻžāϝāĻŧ āϏ⧇āχ string āϕ⧋āύ⧋ āĻ•āĻžāĻœā§‡āϰ āύāĻžāĨ¤

Node-āĻ localStorage āύ⧇āχ, āϤāĻžāχ program āĻāĻ•āχ call-āĻ“āϝāĻŧāĻžāϞāĻž āĻāĻ•āϟāĻž āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ āĻāϟāĻž string āϰāĻžāϖ⧇ āĻāĻ•āϟāĻž Map-āĻ, āφāϰ āĻĒā§āϰāϤāĻŋāϟāĻž value String āĻĻāĻŋāϝāĻŧ⧇ āĻŦāĻĻāϞāĻžāϝāĻŧ, āĻ āĻŋāĻ• browser-āĻāϰ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ⧇āϰ āĻŽāϤ⧋āĨ¤

const data = new Map();
const store = {
  setItem(key, value) { data.set(key, String(value)); },
  getItem(key) { return data.has(key) ? data.get(key) : null; },
};

store.setItem("count", 3);
console.log(store.getItem("count"), typeof store.getItem("count"));

store.setItem("settings", { theme: "dark" });
console.log(store.getItem("settings"));

store.setItem("settings", JSON.stringify({ theme: "dark" }));
console.log(store.getItem("settings"));
console.log(JSON.parse(store.getItem("settings")).theme);
console.log(store.getItem("missing"));
3 string
[object Object]
{"theme":"dark"}
dark
null
Run in Compiler

Number-āϟāĻž āĻĢ⧇āϰāϤ āφāϏ⧇ string "3" āĻšāϝāĻŧ⧇āĨ¤ Object āĻĢ⧇āϰāϤ āφāϏ⧇ [object Object] āĻšāϝāĻŧ⧇, āφāϰ āϭ⧇āϤāϰ⧇āϰ theme āϚāĻŋāϰāϤāϰ⧇ āĻšāĻžāϰāĻŋāϝāĻŧ⧇ āϝāĻžāϝāĻŧāĨ¤ Object-āϕ⧇ JSON.stringify-āĻ āĻŽā§āĻĄāĻŧ⧇ āĻĻāĻŋāϞ⧇ āφāϏāϞ text āϜāĻŽāĻž āĻšāϝāĻŧ, āφāϰ JSON.parse āϏ⧇āϟāĻžāϕ⧇ āφāĻŦāĻžāϰ object āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ āϝ⧇ key āĻ•āĻ–āύ⧋ set āĻšāϝāĻŧāύāĻŋ, āϏ⧇ āĻĻ⧇āϝāĻŧ null, undefined āύāĻžāĨ¤

āĻāχ āĻœā§‹āĻĄāĻŧāĻžāϟāĻžāχ storage-āĻāϰ āĻĒ⧁āϰ⧋ āĻ›āĻžāρāϚāĨ¤ āϞ⧇āĻ–ā§‹ JSON.stringify āĻĻāĻŋāϝāĻŧ⧇, āĻĒāĻĄāĻŧā§‹ JSON.parse āĻĻāĻŋāϝāĻŧ⧇āĨ¤ JSON āύāĻŋāĻœā§‡ āĻļāĻŋāĻ–āĻŋāϝāĻŧ⧇āϛ⧇ Module 8; āĻāĻ–āĻžāύ⧇ āϏ⧇āϟāĻž āϤ⧋āĻŽāĻžāϰ object āφāϰ string-āĻāϰ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ⧇āϰ āĻŽāĻžāĻā§‡āϰ āϏ⧇āϤ⧁āĨ¤

Preview-āĻāϰ āύāĻŋāĻœā§‡āϰ āϕ⧋āύ⧋ storage āύ⧇āχ

Reader-āĻāϰ preview-āϤ⧇ āφāϏāϞ localStorage āϚāĻžāϞāĻŋāϝāĻŧ⧇ āĻĻ⧇āĻ–ā§‹āĨ¤ āύāĻŋāĻšā§‡āϰ page āĻāĻ•āϟāĻž try-āĻāϰ āϭ⧇āϤāϰ⧇ āĻ“āϕ⧇ āϚāĻžāϝāĻŧ, āφāϰ āϕ⧀ āĻšāϞ⧋ āϏ⧇āϟāĻž āϜāĻžāύāĻžāϝāĻŧāĨ¤

<!doctype html>
<html>
<body>
  <p id="report">Checking storage...</p>
  <script>
    const report = document.getElementById("report");
    try {
      localStorage.setItem("visits", "1");
      report.textContent = "Storage works on this page.";
    } catch (err) {
      report.textContent = "Storage refused: " + err.name;
      console.log(err.name + ": " + err.message);
    }
  </script>
</body>
</html>
Run in Compiler

Preview-āϤ⧇ page āϞ⧇āϖ⧇ Storage refused: SecurityError, āφāϰ console āĻĻ⧇āĻ–āĻžāϝāĻŧ browser-āĻāϰ āύāĻŋāĻœā§‡āϰ message, āϝ⧇āϟāĻž browser āϭ⧇āĻĻ⧇ āφāϞāĻžāĻĻāĻžāĨ¤ Preview āĻāĻ•āϟāĻž āĻŦāĻ¨ā§āϧ frame, āϝāĻžāϰ āύāĻŋāĻœā§‡āϰ āϕ⧋āύ⧋ origin āύ⧇āχ, āφāϰ storage āĻĨāĻžāϕ⧇ āĻāĻ•āϟāĻž origin-āĻāϰ āĻŽāĻžāϞāĻŋāĻ•āĻžāύāĻžāϝāĻŧāĨ¤ āϤāĻžāχ āĻ“āĻ–āĻžāύ⧇ localStorage, sessionStorage, indexedDB āφāϰ document.cookie āϏāĻŦāĻžāχ throw āĻ•āϰ⧇āĨ¤

āφāϏāϞ site-āĻ āĻāĻ•āχ call āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ Page-āϟāĻž file āĻšāĻŋāϏ⧇āĻŦ⧇ save āĻ•āϰ⧇ āύāĻŋāĻœā§‡āϰ browser-āĻ āϖ⧁āϞāϞ⧇āĻ“ āĻ•āĻžāϜ āĻ•āϰ⧇āĨ¤ āϤāĻžāχ āĻāχ module-āĻāϰ page-āϗ⧁āϞ⧋ āϤāĻžāχ āĻ•āϰ⧇, āϝāĻž āϏāĻžāĻŦāϧāĻžāύ⧀ āφāϏāϞ code āĻāĻŽāύāĻŋāϤ⧇āχ āĻ•āϰ⧇: āφāϗ⧇ āφāϏāϞ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇, throw āĻ•āϰāϞ⧇ memory-āϤ⧇ āĻāĻ•āϟāĻž āϛ⧋āϟ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ⧇ āϚāϞ⧇ āϝāĻžāϝāĻŧāĨ¤ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϟāĻžāϰ āĻāĻ•āχ getItem, setItem āφāϰ removeItem, āϤāĻžāχ page-āĻāϰ āĻŦāĻžāĻ•āĻŋ āĻ…āĻ‚āĻļ āϤāĻĢāĻžāϤāϟāĻž āĻŸā§‡āϰāχ āĻĒāĻžāϝāĻŧ āύāĻžāĨ¤ Preview-āϤ⧇ "āĻŽāύ⧇ āϰāĻžāĻ–āĻž" state āϟāĻŋāϕ⧇ āĻĨāĻžāϕ⧇ āφāĻŦāĻžāϰ Run āϚāĻžāĻĒāĻž āĻĒāĻ°ā§āϝāĻ¨ā§āϤāĨ¤

State, save āĻ•āϰ⧇ āφāĻŦāĻžāϰ āĻĒāĻĄāĻŧāĻž

āĻāĻ•āϟāĻž āϛ⧋āϟ app āϝāĻž āϜāĻžāύ⧇ āϏāĻŦ āϰāĻžāϖ⧇ āĻāĻ•āϟāĻž object-āĻ, āĻ“āϰ state: note-āϗ⧁āϞ⧋, āĻŦ⧇āϛ⧇ āύ⧇āĻ“āϝāĻŧāĻž theme, timer-āĻāϰ āϏāĻŽāϝāĻŧāĨ¤ App save āĻ•āϰāĻž āĻŽāĻžāύ⧇ āĻ“āχ object-āϕ⧇ text āĻŦāĻžāύāĻŋāϝāĻŧ⧇ āϰ⧇āϖ⧇ āĻĻ⧇āĻ“āϝāĻŧāĻžāĨ¤ App āĻ–ā§‹āϞāĻž āĻŽāĻžāύ⧇ text āĻĒāĻĄāĻŧ⧇ āϤāĻž āĻĨ⧇āϕ⧇ āύāϤ⧁āύ āĻāĻ•āϟāĻž object āĻŦāĻžāύāĻžāύ⧋āĨ¤

āĻāĻ• āĻāĻ• āϞāĻžāχāύ āĻ•āϰ⧇ āϘāϟāύāĻžāϟāĻž āĻĻ⧇āĻ–ā§‹āĨ¤ āϤ⧀āϰāϗ⧁āϞ⧋ āĻĻ⧇āĻ–āĻžāϝāĻŧ āϕ⧋āύ āύāĻžāĻŽ āϕ⧋āύ object-āϕ⧇ āĻĻ⧇āĻ–āĻžāĻšā§āϛ⧇āĨ¤

āĻāĻ•āχ āϧāĻžāĻĒāϗ⧁āϞ⧋ table-āĻ, āĻĒā§āϰāϤāĻŋ āϧāĻžāĻĒ⧇ āĻāĻ•āϟāĻž rowāĨ¤

āϧāĻžāĻĒLineChangedāϕ⧀ āĻšāϞ⧋
1const state = { theme: "dark", notes: ["buy milk"] };state āĻĻ⧇āĻ–āĻžāϝāĻŧ o1-āϕ⧇, āφāϰ āĻ“āϰ notes āĻšāϞ⧋ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āĻāĻ•āϟāĻž object, o2āĨ¤
2state.notes.push("call Rafi");o2.1Notes array-āϤ⧇ āĻāĻ–āύ 2āϟāĻž noteāĨ¤
3const saved = JSON.stringify(state);saved āϕ⧋āύ⧋ object āύāĻž: āĻāϟāĻž 49 āĻ…āĻ•ā§āώāϰ⧇āϰ āĻāĻ•āϟāĻž string, setItem-āĻāϰ āϜāĻ¨ā§āϝ āϤ⧈āϰāĻŋāĨ¤
4const loaded = JSON.parse(saved);JSON.parse āύāϤ⧁āύ object āĻŦāĻžāύāĻžāϝāĻŧ, o3 āφāϰ o4: loaded === state āĻšāϞ⧋ falseāĨ¤
5loaded.notes.push("pay fee");o4.2āĻŦāĻžāĻĄāĻŧ⧇ āĻļ⧁āϧ⧁ āύāϤ⧁āύ copy: state-āĻ āĻāĻ–āύ⧋ 2āϟāĻž note, loaded-āĻ 3āϟāĻžāĨ¤

āĻŽā§‹āĻĄāĻŧ āĻ˜ā§‹āϰ⧇ āϧāĻžāĻĒ 3-āĻāĨ¤ saved-āĻ āϕ⧋āύ⧋ āϤ⧀āϰāχ āύ⧇āχ, āφāϛ⧇ āĻļ⧁āϧ⧁ āĻ…āĻ•ā§āώāϰāĨ¤ Storage āĻāϟāĻžāχ āϰāĻžāϖ⧇āĨ¤ āϧāĻžāĻĒ 4 āϏ⧇āχ āĻ…āĻ•ā§āώāϰ āĻĨ⧇āϕ⧇ āύāϤ⧁āύ āĻāĻ•āϟāĻž āĻĒ⧁āϰ⧋ object-āĻāϰ āĻĒāϰāĻŋāĻŦāĻžāϰ āĻŦāĻžāύāĻžāϝāĻŧ, app āϝāϤāĻŦāĻžāϰ āĻ–ā§‹āϞ⧇ āϤāϤāĻŦāĻžāϰ āĻ āĻŋāĻ• āĻāϟāĻžāχ āϘāĻŸā§‡āĨ¤ āϧāĻžāĻĒ 5 āĻĻ⧇āĻ–āĻžāϝāĻŧ āĻĻ⧁āĻŸā§‹ āĻĒāϰāĻŋāĻŦāĻžāϰ āφāϞāĻžāĻĻāĻž: āĻāĻ•āϟāĻž āĻŦāĻĻāϞāĻžāϞ⧇ āφāϰ⧇āĻ•āϟāĻž āĻ•āĻ–āύ⧋ āϛ⧋āρāϝāĻŧāĻž āĻĒāĻĄāĻŧ⧇ āύāĻžāĨ¤

āĻāĻ• āύāϜāϰ⧇ form āφāϰ storage

form.addEventListener("submit", (event) => {   // runs before the browser submits
  event.preventDefault();                       // stay on this page
  const text = input.value;                     // always a string
  const n = Number(numberInput.value);          // convert before you add
  const ticked = checkbox.checked;              // true or false
});
localStorage.setItem("key", JSON.stringify(state));   // write: object to text
const state = JSON.parse(localStorage.getItem("key")); // read: text to object, null if never set
Example 1: Nusrat-āĻāϰ sign-up page, āĻāĻŦāĻžāϰ āĻŽāύ⧇ āϰāĻžāϖ⧇

āĻāχ āĻšāϞ⧋ āĻĒ⧁āϰ⧋ pageāĨ¤ āĻāϟāĻž sign-up-āĻāϰ āĻāĻ•āϟāĻž list āύāĻŋāĻœā§‡āϰ state-āĻ āϰāĻžāϖ⧇, āĻĒā§āϰāϤāĻŋāϟāĻž submit-āĻāϰ āĻĒāϰ⧇ list save āĻ•āϰ⧇, āφāϰ āĻ—ā§‹āύāĻžāϟāĻž āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤ āφāϗ⧇ āφāϏāϞ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇, āύāĻž āĻĒ⧇āϞ⧇ āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ⧇ āϝāĻžāϝāĻŧāĨ¤

<!doctype html>
<html>
<body>
  <form id="signup">
    <label>Name <input id="student" type="text" required></label>
    <label>Class <input id="grade" type="number" min="1" max="12" required></label>
    <button type="submit">Sign up</button>
  </form>
  <p id="count"></p>
  <script>
    function memoryStore() {
      const data = new Map();
      return {
        getItem(key) { return data.has(key) ? data.get(key) : null; },
        setItem(key, value) { data.set(key, String(value)); },
        removeItem(key) { data.delete(key); },
      };
    }
    let store;
    try {
      localStorage.getItem("probe");
      store = localStorage;
    } catch (err) {
      console.log("using the memory stand-in: " + err.name);
      store = memoryStore();
    }
    const signups = JSON.parse(store.getItem("club-signups")) || [];
    const show = () => {
      document.getElementById("count").textContent = signups.length + " signed up";
    };
    show();
    document.getElementById("signup").addEventListener("submit", (event) => {
      event.preventDefault();
      const who = document.getElementById("student").value.trim();
      const grade = Number(document.getElementById("grade").value);
      signups.push({ who, grade });
      store.setItem("club-signups", JSON.stringify(signups));
      event.target.reset();
      show();
    });
  </script>
</body>
</html>

Page āĻ–ā§‹āϞ⧇ 0 signed up āĻĻāĻŋāϝāĻŧ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž sign-up āĻ—ā§‹āύāĻžāϝāĻŧ āĻāĻ• āϝ⧋āĻ— āĻ•āϰ⧇, āφāϰ āĻĒāϰ⧇āϰ āĻ…āĻ­āĻŋāĻ­āĻžāĻŦāϕ⧇āϰ āϜāĻ¨ā§āϝ form āĻ–āĻžāϞāĻŋ āĻ•āϰ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āĻāĻ•āϟāĻž field āĻĢāĻžāρāĻ•āĻž āϰ⧇āϖ⧇ āĻŦā§‹āϤāĻžāĻŽ āϚāĻžāĻĒā§‹: browser āĻ“āχ field-āĻāϰ āĻ“āĻĒāϰ āύāĻŋāĻœā§‡āϰ message āĻĻ⧇āĻ–āĻžāϝāĻŧ, āφāϰ submit event āφāϏ⧇āχ āύāĻžāĨ¤ āφāϏāϞ site-āĻ reload-āĻāϰ āĻĒāϰ⧇āĻ“ āĻ—ā§‹āύāĻž āϟāĻŋāϕ⧇ āĻĨāĻžāϕ⧇, āĻ•āĻžāϰāĻŖ list āĻĨāĻžāϕ⧇ localStorage-āĻāĨ¤

JSON.parse(store.getItem("club-signups")) || [] āϞāĻžāχāύāϟāĻž āϖ⧇āϝāĻŧāĻžāϞ āĻ•āϰ⧋āĨ¤ āĻāĻ•āĻĻāĻŽ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āĻ•āĻŋāϛ⧁āχ save āĻ•āϰāĻž āύ⧇āχ, āϤāĻžāχ getItem āĻĻ⧇āϝāĻŧ nullāĨ¤ JSON.parse(null) āĻĢ⧇āϰāϤ āĻĻ⧇āϝāĻŧ null, āφāϰ || [] āϏ⧇āϟāĻžāϕ⧇ āĻŦāĻžāύāĻžāϝāĻŧ āĻĢāĻžāρāĻ•āĻž listāĨ¤

Run in Compiler
Example 2: āĻāĻ•āχ āφāϏāĻž-āϝāĻžāĻ“āϝāĻŧāĻž, Node-āĻ

āĻ“āĻĒāϰ⧇āϰ page āĻāĻ–āĻžāύ⧇ āύāĻŋāĻœā§‡āϰ save āĻ•āϰāĻž text print āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āύāĻž, āϤāĻžāχ āĻāχ program āĻāĻ•āχ save āφāϰ load āϚāĻžāϞāĻžāϝāĻŧ Node-āĻ, āĻŦāĻŋāĻ•āĻ˛ā§āĻĒāϟāĻž āĻĻāĻŋāϝāĻŧ⧇āĨ¤ "Reload" āĻšāϞ⧋ āĻļ⧁āϧ⧁ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ āĻĨ⧇āϕ⧇ āĻŦāĻžāύāĻžāύ⧋ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āĻāĻ•āϟāĻž stateāĨ¤

const data = new Map();
const store = {
  getItem(key) { return data.has(key) ? data.get(key) : null; },
  setItem(key, value) { data.set(key, String(value)); },
};

const signups = JSON.parse(store.getItem("club-signups")) || [];
signups.push({ who: "Rafi", grade: 7 });
signups.push({ who: "Mitu", grade: 9 });
store.setItem("club-signups", JSON.stringify(signups));

console.log(store.getItem("club-signups"));

const afterReload = JSON.parse(store.getItem("club-signups")) || [];
console.log(afterReload.length, afterReload[1].who, typeof afterReload[1].grade);
console.log(afterReload === signups);
[{"who":"Rafi","grade":7},{"who":"Mitu","grade":9}]
2 Mitu number
false

āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύ āĻšāϞ⧋ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ⧇ āĻĨāĻžāĻ•āĻž āĻšā§āĻŦāĻšā§ textāĨ¤ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āϞāĻžāχāύ āĻĻ⧇āĻ–āĻžāϝāĻŧ āĻ“āχ text āĻĨ⧇āϕ⧇ āφāĻŦāĻžāϰ āĻŦāĻžāύāĻžāύ⧋ list: āĻĻ⧁āĻŸā§‹ sign-up, āφāϰ class āĻāĻ–āύ⧋ number, āĻ•āĻžāϰāĻŖ JSON number-āϕ⧇ number āĻšāĻŋāϏ⧇āĻŦ⧇āχ āϰāĻžāϖ⧇āĨ¤ āĻļ⧇āώ āϞāĻžāχāύ false: reload āĻ•āϰāĻž list āĻāĻ•āϟāĻž āύāϤ⧁āύ array, widget-āĻāϰ āϧāĻžāĻĒ 4-āĻāϰ āĻŽāϤ⧋āĨ¤

Run in Compiler

āĻāϟāĻž āϕ⧋āĻĨāĻžāϝāĻŧ āĻ•āĻžāĻœā§‡ āϞāĻžāϗ⧇

  • The New York Times-āĻāϰ Wordle: āϤ⧋āĻŽāĻžāϰ streak āφāϰ āĻšāĻŋāϏāĻžāĻŦ āĻĨāĻžāϕ⧇ browser-āĻāϰ localStorage-āĻ, āĻāχ āĻ•āĻžāϰāϪ⧇āχ āύāϤ⧁āύ phone-āĻ āϏ⧇āϗ⧁āϞ⧋ āĻļā§‚āĻ¨ā§āϝ āĻĻ⧇āĻ–āĻžāϝāĻŧāĨ¤
  • Excalidraw: whiteboard āϤ⧋āĻŽāĻžāϰ āφāρāĻ•āĻž localStorage-āĻ āϰāĻžāϖ⧇, āϤāĻžāχ āϕ⧋āύ⧋ account āĻ›āĻžāĻĄāĻŧāĻžāχ reload āĻ•āϰāϞ⧇ āφāρāĻ•āĻž āĻĢ⧇āϰāϤ āφāϏ⧇āĨ¤
  • āĻĒā§āϰāϤāĻŋāϟāĻž browser-āĻāϰ āύāĻŋāĻœā§‡āϰ form āϝāĻžāϚāĻžāχ: āĻāĻ•āϟāĻž required field āύāĻŋāĻœā§‡āχ submit āĻĨāĻžāĻŽāĻžāϝāĻŧ āφāϰ āĻāĻ•āϟāĻž message āĻĻ⧇āĻ–āĻžāϝāĻŧ, āϕ⧋āύ⧋ script āϚāϞāĻžāϰ āφāϗ⧇āχāĨ¤

āϝ⧇ āϭ⧁āϞāϗ⧁āϞ⧋ āϏāĻŦāĻžāχ āĻ•āϰ⧇

ā§§. JSON āĻ›āĻžāĻĄāĻŧāĻž object āϰāĻžāĻ–āĻž

const data = new Map();
const store = {
  setItem(key, value) { data.set(key, String(value)); },
  getItem(key) { return data.get(key); },
};
const settings = { theme: "dark", size: 18 };
store.setItem("settings", settings);
console.log(store.getItem("settings"));
console.log(store.getItem("settings").theme);
[object Object]
undefined

āĻ­āĻžāĻŖā§āĻĄāĻžāϰ object-āϟāĻžāϕ⧇ text [object Object] āĻŦāĻžāύāĻŋāϝāĻŧ⧇ āĻĢ⧇āϞ⧇āϛ⧇, theme āφāϰ size āĻĻ⧁āĻŸā§‹āχ āύ⧇āχāĨ¤ āĻāĻ•āϟāĻž string āĻĨ⧇āϕ⧇ .theme āĻĒāĻĄāĻŧāϞ⧇ āφāϏ⧇ undefined, āφāϰ āϕ⧋āύ⧋ error āϏāĻžāĻŦāϧāĻžāύ āĻ•āϰ⧇ āύāĻžāĨ¤ āϞ⧇āĻ–ā§‹ store.setItem("settings", JSON.stringify(settings)), āφāϰ āĻĢ⧇āϰāϤ āĻĒāĻĄāĻŧā§‹ JSON.parse āĻĻāĻŋāϝāĻŧ⧇āĨ¤

⧍. āĻĻ⧁āĻŸā§‹ field-āϕ⧇ string āĻšāĻŋāϏ⧇āĻŦ⧇ āϝ⧋āĻ— āĻ•āϰāĻž

const price = { value: "120" };
const quantity = { value: "3" };
const deliveryFee = 60;

console.log(price.value * quantity.value + deliveryFee);
console.log(price.value + deliveryFee);
420
12060

āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύ āĻ āĻŋāĻ• āĻĻ⧇āĻ–āĻžāϝāĻŧ, āĻ•āĻžāϰāĻŖ * āύāĻŋāĻœā§‡āχ āĻĻ⧁āĻŸā§‹ string-āϕ⧇ number āĻŦāĻžāύāĻŋāϝāĻŧ⧇ āύ⧇āϝāĻŧāĨ¤ āĻĻā§āĻŦāĻŋāϤ⧀āϝāĻŧ āϞāĻžāχāύ "120" āφāϰ 60 āϜ⧁āĻĄāĻŧ⧇ āĻāĻ•āϟāĻž āϞāĻŽā§āĻŦāĻž string āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ Code āĻāĻ•āϟāĻž operator-āĻ āϚāϞ⧇, āĻĒāϰ⧇āϰāϟāĻžāϝāĻŧ āĻ­āĻžāϙ⧇āĨ¤ āĻĒā§āϰāϤāĻŋāϟāĻž field āĻĒāĻĄāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ⧇āχ Number āĻĻāĻŋāϝāĻŧ⧇ āĻŦāĻĻāϞ⧇ āύāĻžāĻ“, āϤāĻžāĻšāϞ⧇ āĻĒā§āϰāĻļā§āύāϟāĻžāχ āĻ“āϠ⧇ āύāĻžāĨ¤

ā§Š. āĻ•āĻ–āύ⧋ save āĻšāϝāĻŧāύāĻŋ āĻāĻŽāύ key parse āĻ•āϰāĻž

const data = new Map();
const getItem = (key) => (data.has(key) ? data.get(key) : null);

const state = JSON.parse(getItem("notes-app"));
console.log(state.notes.length);
TypeError: Cannot read properties of null (reading 'notes')

āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ āĻ•āĻŋāϛ⧁āχ save āĻĨāĻžāϕ⧇ āύāĻž, āϤāĻžāχ getItem āĻĻ⧇āϝāĻŧ null, āφāϰ JSON.parse(null)-āĻ“ āĻĻ⧇āϝāĻŧ nullāĨ¤ āĻĒāϰ⧇āϰ āϞāĻžāχāύ āĻĨ⧇āĻŽā§‡ āϝāĻžāϝāĻŧ TypeError: Cannot read properties of null (reading 'notes') āĻĻāĻŋāϝāĻŧ⧇āĨ¤ āĻĒā§āϰāĻĨāĻŽāĻŦāĻžāϰ⧇āϰ āϜāĻ¨ā§āϝ āϏāĻŦāϏāĻŽāϝāĻŧ āĻāĻ•āϟāĻž default āĻĻāĻžāĻ“: JSON.parse(getItem("notes-app")) || { notes: [] }āĨ¤

āĻŽāĻžāĻĨāĻž āĻ–āĻžāϟāĻžāĻ“

āĻ­āĻžāĻŖā§āĻĄāĻžāϰ⧇ āϕ⧀ āϰāχāϞ?

Rafi-āϰ app āĻāĻŽāύ āĻāĻ•āϟāĻž value save āĻ•āϰ⧇, āϝ⧇āϟāĻž āĻŽāĻžāĻā§‡ āĻŽāĻžāĻā§‡ āĻĨāĻžāϕ⧇ āύāĻžāĨ¤ āύāĻŋāϰāĻžāĻĒāĻĻ āĻĨāĻžāĻ•āϤ⧇ āĻ“ āϏ⧇āϟāĻž JSON.stringify-āĻ āĻŽā§āĻĄāĻŧ⧇ āĻĻ⧇āϝāĻŧ, āφāϰ āφāĻļāĻž āĻ•āϰ⧇ āĻāϰāĻĒāϰ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ āĻĢāĻžāρāĻ•āĻž āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

const data = new Map();
const setItem = (key, value) => data.set(key, String(value));
const getItem = (key) => (data.has(key) ? data.get(key) : null);

let lastNote;
setItem("last", JSON.stringify(lastNote));
console.log(typeof getItem("last"), getItem("last"));

āĻ­āĻžāĻŖā§āĻĄāĻžāϰ⧇ āϕ⧀ āφāϛ⧇, āφāϰ āĻĒāϰ⧇ app āϝāĻ–āύ āĻ“āϰ āĻ“āĻĒāϰ JSON.parse āĻĄāĻžāĻ•āĻŦ⧇ āϤāĻ–āύ āϕ⧀ āĻšāĻŦ⧇?

Exercise 1āϏāĻšāϜ

Tanvir āĻāĻ•āϟāĻž āϛ⧋āϟ quiz app āĻŦāĻžāύāĻŋāϝāĻŧ⧇āϛ⧇, āϝ⧇āϟāĻž āωāĻ¤ā§āϤāϰāϗ⧁āϞ⧋ browser-āĻāϰ storage-āĻ āĻŽāύ⧇ āϰāĻžāϖ⧇āĨ¤ āĻ“ āϏāϰāĻžāϏāϰāĻŋ value āĻĻāĻŋāϝāĻŧ⧇ setItem āĻĄā§‡āϕ⧇āϛ⧇, JSON.stringify āĻĻāĻŋāϤ⧇ āϭ⧁āϞ⧇ āϗ⧇āϛ⧇āĨ¤ Storage āĻļ⧁āϧ⧁ text āϰāĻžāϖ⧇, āϤāĻžāχ āĻĒā§āϰāϤāĻŋāϟāĻž value string āĻšāϝāĻŧ⧇ āϗ⧇āϛ⧇, āĻ āĻŋāĻ• āϝ⧇āĻ­āĻžāĻŦ⧇ String(value) āĻŦāĻžāύāĻžāϝāĻŧāĨ¤ Tanvir āĻĻ⧇āĻ–āϤ⧇ āϚāĻžāϝāĻŧ āĻ“āϰ app āφāϏāϞ⧇ āϕ⧀ save āĻ•āϰ⧇āϛ⧇āĨ¤

Input. āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύ⧇ nāĨ¤ āĻĒāϰ⧇āϰ n āϟāĻž āϞāĻžāχāύ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻžāϝāĻŧ JSON-āĻ āϞ⧇āĻ–āĻž āĻāĻ•āϟāĻž value: āĻāĻ•āϟāĻž number, āĻāĻ•āϟāĻž string, true, false, null, āĻāĻ•āϟāĻž array āĻ…āĻĨāĻŦāĻž āĻāĻ•āϟāĻž objectāĨ¤

Output. āĻĒā§āϰāϤāĻŋāϟāĻž value-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ• āϞāĻžāχāύ: āĻ“āχ value setItem āĻĻāĻŋāϝāĻŧ⧇ āϰāĻžāĻ–āĻžāϰ āĻĒāϰ⧇ getItem āϝ⧇ text āĻĢ⧇āϰāϤ āĻĻāĻŋāϤāĨ¤ Text-āϟāĻž āύāĻŋāĻœā§‡āχ JSON string āĻšāĻŋāϏ⧇āĻŦ⧇ print āĻ•āϰ⧋, quote-āϏāĻš, āϝāĻžāϤ⧇ āĻĢāĻžāρāĻ•āĻž text-āĻ“ "" āĻšāϝāĻŧ⧇ āĻĻ⧇āĻ–āĻž āϝāĻžāϝāĻŧāĨ¤

Constraints. 1 <= n <= 1000. Each line is valid JSON of at most 200 characters, and the last line is not empty..

Sample.

6
42
"hello"
{"theme":"dark"}
[1,[2,3]]
null
[]
"42"
"hello"
"[object Object]"
"1,2,3"
"null"
""
const input = require("fs").readFileSync(0, "utf8");
const lines = input.split("\n");
let at = 0;
const next = () => lines[at++];
const nextInt = () => Number(next());
const out = [];

// your code: read with next() and nextInt(), push every line of output to out

console.log(out.join("\n"));
Run in Compiler

setitem-strings āύāĻžāĻŽā§‡ grade āĻšāϝāĻŧāĨ¤

Exercise 2āĻŽāĻžāĻāĻžāϰāĻŋ

Nusrat āĻĻ⧇āĻ–āϤ⧇ āϚāĻžāϝāĻŧ āĻ“āϰ sign-up page āĻ āĻŋāĻ• āϕ⧀ save āĻ•āϰ⧇āĨ¤ Sign-up-āϗ⧁āϞ⧋ āĻĒāĻĄāĻŧā§‹, class-āϕ⧇ number āϰ⧇āϖ⧇ object-āĻāϰ āĻāĻ•āϟāĻž list āĻŦāĻžāύāĻžāĻ“, āφāϰ āϏ⧇āϟāĻž JSON āĻšāĻŋāϏ⧇āĻŦ⧇ āϰāĻžāĻ–ā§‹āĨ¤ āϤāĻžāϰāĻĒāϰ āϰāĻžāĻ–āĻž text āφāϰ āϤāĻž āĻĨ⧇āϕ⧇ āĻĢ⧇āϰāϤ āĻĒāĻĄāĻŧāĻž āĻ—ā§‹āύāĻžāϟāĻž print āĻ•āϰ⧋āĨ¤

Input. n, āϤāĻžāϰāĻĒāϰ n āϟāĻž āϞāĻžāχāύ, āĻĒā§āϰāϤāĻŋāϟāĻžāϝāĻŧ āĻāĻ•āϟāĻž āύāĻžāĻŽ āφāϰ āĻāĻ•āϟāĻž classāĨ¤

Output. āĻāĻ• āϞāĻžāχāύ⧇ āϰāĻžāĻ–āĻž JSON text, āϤāĻžāϰāĻĒāϰ count N, āϝ⧇āĻ–āĻžāύ⧇ N āĻšāϞ⧋ āĻ“āχ text āĻĨ⧇āϕ⧇ parse āĻ•āϰ⧇ āĻĢ⧇āϰāϤ āĻĒāĻžāĻ“āϝāĻŧāĻž list-āĻāϰ āĻĻ⧈āĻ°ā§āĻ˜ā§āϝāĨ¤

Constraints. 1 <= n <= 20āĨ¤ āύāĻžāĻŽ 1 āĻĨ⧇āϕ⧇ 10 āĻ…āĻ•ā§āώāϰ⧇āϰ, āφāϰ class 1 āĻĨ⧇āϕ⧇ 12āĨ¤

Sample. āύāĻŋāĻšā§‡āϰ inputāĨ¤

3
Rafi 7
Mitu 9
Sumon 7
const input = require("fs").readFileSync(0, "utf8");
const tokens = input.split(/\s+/).filter(Boolean);
let at = 0;
const next = () => tokens[at++];
const nextInt = () => Number(next());
const out = [];

// your code: read with next() and nextInt(), push every line of output to out

console.log(out.join("\n"));

Sample-āĻāϰ output.

[{"who":"Rafi","grade":7},{"who":"Mitu","grade":9},{"who":"Sumon","grade":7}]
count 3
Run in Compiler
Exercise 3āĻ•āĻ āĻŋāύ

āĻāĻ•āϟāĻž fee-āϰ page-āĻ number field-āĻāϰ āĻāĻ•āϟāĻž āĻ•āϞāĻžāĻŽ āφāϛ⧇, āφāϰ Nusrat āĻ“āϗ⧁āϞ⧋āϰ value āϝ⧇āĻ­āĻžāĻŦ⧇ āϟāĻžāχāĻĒ āĻ•āϰāĻž āĻ›āĻŋāϞ āϏ⧇āĻ­āĻžāĻŦ⧇āχ āĻ•āĻĒāĻŋ āĻ•āϰ⧇āϛ⧇āĨ¤ āĻ•āĻŋāϛ⧁ āĻĢāĻžāρāĻ•āĻž, āĻ•āĻŋāϛ⧁āϤ⧇ āĻļ⧁āϧ⧁ space, āφāϰ āĻ•āĻŋāϛ⧁āϤ⧇ āĻāĻŽāύ text āϝ⧇āϟāĻž āϏāĻ‚āĻ–ā§āϝāĻž āύāĻžāĨ¤ āφāϏāϞ āϏāĻ‚āĻ–ā§āϝāĻžāϗ⧁āϞ⧋ āϝ⧋āĻ— āĻ•āϰ⧋, āφāϰ āĻŦāĻžāĻ•āĻŋ āĻĻ⧁āχ āϰāĻ•āĻŽ āφāϞāĻžāĻĻāĻž āĻ•āϰ⧇ āĻ—ā§‹āύ⧋āĨ¤

Input. āĻĒā§āϰāĻĨāĻŽ āϞāĻžāχāύ⧇ n, āϤāĻžāϰāĻĒāϰ n āϟāĻž āϞāĻžāχāύ, āĻĒā§āϰāϤāĻŋāϟāĻžāϝāĻŧ āĻāĻ•āϟāĻž field-āĻāϰ value, āĻ āĻŋāĻ• āϝ⧇āĻ­āĻžāĻŦ⧇ āϟāĻžāχāĻĒ āĻ•āϰāĻžāĨ¤ āϕ⧋āύ⧋ āϞāĻžāχāύ āĻĢāĻžāρāĻ•āĻž āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇āĨ¤

Output. āϤāĻŋāύāϟāĻž āϞāĻžāχāύ: āϏāĻ‚āĻ–ā§āϝāĻž āφāϛ⧇ āĻāĻŽāύ field-āϗ⧁āϞ⧋āϰ āϝ⧋āĻ—āĻĢāϞ āύāĻŋāϝāĻŧ⧇ total T, āĻĢāĻžāρāĻ•āĻž āĻŦāĻž āĻļ⧁āϧ⧁ space-āĻ“āϝāĻŧāĻžāϞāĻž field-āϗ⧁āϞ⧋ āύāĻŋāϝāĻŧ⧇ empty E, āφāϰ āĻŦāĻžāĻ•āĻŋāϗ⧁āϞ⧋ āύāĻŋāϝāĻŧ⧇ invalid IāĨ¤

Constraints. 1 <= n <= 50āĨ¤ āĻāĻ•āϟāĻž value āĻŦāĻĄāĻŧāĻœā§‹āϰ 10 āĻ…āĻ•ā§āώāϰ⧇āϰ, āφāϰ āĻļ⧇āώ āϞāĻžāχāύ āĻĢāĻžāρāĻ•āĻž āύāĻžāĨ¤

Sample. āύāĻŋāĻšā§‡āϰ inputāĨ¤ āĻāϰ āϤ⧃āϤ⧀āϝāĻŧ āϞāĻžāχāύ āĻĢāĻžāρāĻ•āĻž, āφāϰ āϚāϤ⧁āĻ°ā§āĻĨ āϞāĻžāχāύ⧇ āĻĻ⧁āĻŸā§‹ spaceāĨ¤

6
500
 250 

  
abc
1200
const input = require("fs").readFileSync(0, "utf8");
const lines = input.split("\n");
let at = 0;
const next = () => lines[at++];
const nextInt = () => Number(next());
const out = [];

// your code: read with next() and nextInt(), push every line of output to out

console.log(out.join("\n"));

Sample-āĻāϰ output.

total 1950
empty 2
invalid 1
Run in Compiler

āϏāϚāϰāĻžāϚāϰ āϝ⧇ āĻĒā§āϰāĻļā§āύāϗ⧁āϞ⧋ āφāϏ⧇

  • Preview storage āĻĻ⧇āϝāĻŧ āύāĻž āϕ⧇āύ?

    Storage āĻĨāĻžāϕ⧇ āĻāĻ•āϟāĻž origin-āĻāϰ āĻŽāĻžāϞāĻŋāĻ•āĻžāύāĻžāϝāĻŧ, āĻŽāĻžāύ⧇ āĻāĻ•āϟāĻž site-āĻāϰ scheme, host āφāϰ portāĨ¤ Preview āĻĒā§āϰāϤāĻŋāϟāĻž page āϚāĻžāϞāĻžāϝāĻŧ origin āĻ›āĻžāĻĄāĻŧāĻž āĻāĻ•āϟāĻž āĻŦāĻ¨ā§āϧ frame-āĻ, āϝāĻžāϤ⧇ āĻ…āĻ¨ā§āϝ āϕ⧋āύ⧋ page āĻ“āϰ āϰāĻžāĻ–āĻž āϜāĻŋāύāĻŋāϏ āĻĒāĻĄāĻŧāϤ⧇ āύāĻž āĻĒāĻžāϰ⧇āĨ¤ āϤāĻžāχ browser āĻ“āĻ–āĻžāύ⧇ storage āĻĻ⧇āϝāĻŧ āύāĻž, āφāϰ āĻāĻ•āχ code āϝ⧇āϕ⧋āύ⧋ āφāϏāϞ site-āĻ āϚāϞ⧇āĨ¤

  • localStorage āφāϰ cookie āĻ•āĻŋ āĻāĻ•āχ?

    āύāĻžāĨ¤ āĻĻ⧁āĻŸā§‹āχ browser-āĻ āĻĨāĻžāϕ⧇, āĻ•āĻŋāĻ¨ā§āϤ⧁ cookie āĻĒā§āϰāϤāĻŋāϟāĻž request-āĻāϰ āϏāĻžāĻĨ⧇ server-āĻ āϝāĻžāϝāĻŧ, āφāϰ localStorage āĻ•āĻ–āύ⧋ browser āĻ›āĻžāĻĄāĻŧ⧇ āύāĻžāĨ¤ Cookie āϖ⧁āĻŦ āϛ⧋āϟāĻ“āĨ¤ Cookie āϕ⧀ āĻŦāϝāĻŧ⧇ āύāĻŋāϝāĻŧ⧇ āϝāĻžāϝāĻŧ, āϏ⧇āϟāĻž āĻĻ⧇āĻ–āĻžāĻŦ⧇ Lesson 05āĨ¤

  • preventDefault āĻ•āĻŋ user-āϕ⧇ āϟāĻžāχāĻĒ āĻ•āϰāϤ⧇ āĻŦāĻžāϧāĻž āĻĻ⧇āϝāĻŧ?

    āύāĻžāĨ¤ āĻāϟāĻž āĻļ⧁āϧ⧁ āϝ⧇ event-āĻāϰ āĻ“āĻĒāϰ āĻĄāĻžāĻ•āĻž āĻšāϝāĻŧ⧇āϛ⧇ āϤāĻžāϰ default āĻ•āĻžāϜāϟāĻž āĻŦāĻžāϤāĻŋāϞ āĻ•āϰ⧇āĨ¤ submit-āĻāϰ āĻŦ⧇āϞāĻžāϝāĻŧ āϏ⧇āχ āĻ•āĻžāϜ āĻšāϞ⧋ form āĻĒāĻžāĻ āĻžāύ⧋ āφāϰ āύāϤ⧁āύ page load āĻ•āϰāĻžāĨ¤ āϟāĻžāχāĻĒ āĻ•āϰāĻž, click āĻ•āϰāĻž āφāϰ browser-āĻāϰ āύāĻŋāĻœā§‡āϰ āϝāĻžāϚāĻžāχ āϏāĻŦ āϝ⧇āĻŽāύ āĻ›āĻŋāϞ āϤ⧇āĻŽāύāχ āĻĨāĻžāϕ⧇āĨ¤

  • Browser-āĻāϰ data āĻŽā§āϛ⧇ āĻĻāĻŋāϞ⧇ localStorage-āĻāϰ āϕ⧀ āĻšāϝāĻŧ?

    āϚāϞ⧇ āϝāĻžāϝāĻŧ, cookie āφāϰ āĻ“āχ site-āĻāϰ āĻŦāĻžāĻ•āĻŋ data-āϰ āϏāĻžāĻĨ⧇āĨ¤ Private window-āĻ“ āĻĢāĻžāρāĻ•āĻž āĻ­āĻžāĻŖā§āĻĄāĻžāϰ āĻĻāĻŋāϝāĻŧ⧇ āĻļ⧁āϰ⧁ āĻšāϝāĻŧ āφāϰ āĻļ⧇āώ⧇ āϏ⧇āϟāĻž āĻĢ⧇āϞ⧇ āĻĻ⧇āϝāĻŧāĨ¤ āϤāĻžāχ localStorage āϰāĻžāĻ–āĻž āĻ­āĻžāϞ⧋ āĻāĻŽāύ āϜāĻŋāύāĻŋāϏ⧇āϰ āϜāĻ¨ā§āϝ, āϜāϰ⧁āϰāĻŋ āϕ⧋āύ⧋ āĻ•āĻŋāϛ⧁āϰ āĻāĻ•āĻŽāĻžāĻ¤ā§āϰ copy-āϰ āϜāĻ¨ā§āϝ āĻ•āĻ–āύ⧋ āύāĻžāĨ¤

āĻŽā§‚āϞ āĻ•āĻĨāĻž

  • Form-āĻāϰ āĻ“āĻĒāϰ submit āĻļā§‹āύ⧋, event.preventDefault() āĻĄāĻžāϕ⧋, āϤāĻžāϰāĻĒāϰ field-āϗ⧁āϞ⧋ āĻĒāĻĄāĻŧā§‹āĨ¤
  • āĻĒā§āϰāϤāĻŋāϟāĻž field-āĻāϰ value āĻāĻ•āϟāĻž string; checkbox-āĻāϰ āĻ…āĻŦāĻ¸ā§āĻĨāĻž checked-āĻ; āϏāĻ‚āĻ–ā§āϝāĻž āĻĒāĻĄāĻŧāĻžāϰ āϏāĻŽāϝāĻŧ⧇āχ āĻŦāĻĻāϞ⧇ āύāĻžāĻ“āĨ¤
  • Storage āϰāĻžāϖ⧇ āĻļ⧁āϧ⧁ string: āϞ⧇āĻ–ā§‹ JSON.stringify āĻĻāĻŋāϝāĻŧ⧇, āĻĒāĻĄāĻŧā§‹ JSON.parse āĻĻāĻŋāϝāĻŧ⧇, āφāϰ null-āĻāϰ āϜāĻ¨ā§āϝ āĻāĻ•āϟāĻž default āĻĻāĻžāĻ“āĨ¤
  • Preview-āϤ⧇ storage āύ⧇āχ, āϤāĻžāχ page āφāϗ⧇ āφāϏāϞ āĻ­āĻžāĻŖā§āĻĄāĻžāϰ āĻšā§‡āĻˇā§āϟāĻž āĻ•āϰ⧇, āύāĻž āĻĒ⧇āϞ⧇ āĻāĻ•āχ call-āĻ“āϝāĻŧāĻžāϞāĻž āĻŦāĻŋāĻ•āĻ˛ā§āĻĒ⧇ āϝāĻžāϝāĻŧāĨ¤
  • App-āĻāϰ state āĻāĻ•āϟāĻž object; save āĻ•āϰāϞ⧇ āϏ⧇āϟāĻž text āĻšāϝāĻŧ, āφāϰ load āĻ•āϰāϞ⧇ āĻ“āχ text āĻĨ⧇āϕ⧇ āύāϤ⧁āύ object āϤ⧈āϰāĻŋ āĻšāϝāĻŧāĨ¤
  • āφāϰāĻ“ āĻ—āĻ­ā§€āϰ⧇ āϝ⧇āϤ⧇ āϚāĻžāχāϞ⧇: āϭ⧇āϤāϰ⧇āϰ āĻ•āĻĨāĻž, origin, storage event, main thread āφāϰ cookie (Pro)āĨ¤

āĻāϰāĻĒāϰ: āĻĒā§āϰāϤāĻŋāϟāĻž āϰāĻ•āĻŽā§‡āϰ field, browser-āĻāϰ āύāĻŋāĻœā§‡āϰ āϝāĻžāϚāĻžāχ, FormData, āĻĻ⧁āχ āϰāĻ•āĻŽ storage āφāϰ āϤāĻžāϰāĻŋāĻ–, āĻāĻ•āϟāĻž āĻāĻ•āϟāĻž āĻ•āϰ⧇āĨ¤

lesson ā§§ āĻļ⧇āώ

āĻļ⧇āώ āĻšāϞ⧇ āϚāĻŋāĻšā§āύ āĻĻāĻŋāύ, āĻ…āĻ—ā§āϰāĻ—āϤāĻŋ āφāĻĒāύāĻžāϰ āϏāĻžāĻĨ⧇ āĻĨāĻžāĻ•āĻŦ⧇āĨ¤

āĻĒāϰ⧇āϰāϟāĻž: Form, storage āφāϰ āϤāĻžāϰāĻŋāϖ⧇āϰ āĻĒā§āϰāϤāĻŋāϟāĻž āĻšāĻžāϤāĻŋāϝāĻŧāĻžāϰ, āĻāĻ•āϟāĻž āĻāĻ•āϟāĻž āĻ•āϰ⧇