{"id":17130789,"url":"https://github.com/shahryarjb/learnjsstuff","last_synced_at":"2026-03-10T07:31:14.142Z","repository":{"id":65955612,"uuid":"513977513","full_name":"shahryarjb/LearnJsStuff","owner":"shahryarjb","description":"نکاتی که نیاز هست در یادگیری جاوااسکریپت و تایپ اسکریپت مخصوصا در ری اکت دوباره یاداوری شود را در این بخش ذخیره کردم","archived":false,"fork":false,"pushed_at":"2024-08-12T16:16:56.000Z","size":49038,"stargazers_count":39,"open_issues_count":6,"forks_count":1,"subscribers_count":5,"default_branch":"master","last_synced_at":"2025-08-31T18:39:06.491Z","etag":null,"topics":["js","react","redux","typescript"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shahryarjb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-07-14T16:44:00.000Z","updated_at":"2025-03-25T17:30:11.000Z","dependencies_parsed_at":"2024-03-21T16:46:13.405Z","dependency_job_id":"40e7c800-62c1-4386-8448-c7fa91652e09","html_url":"https://github.com/shahryarjb/LearnJsStuff","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/shahryarjb/LearnJsStuff","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shahryarjb%2FLearnJsStuff","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shahryarjb%2FLearnJsStuff/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shahryarjb%2FLearnJsStuff/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shahryarjb%2FLearnJsStuff/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shahryarjb","download_url":"https://codeload.github.com/shahryarjb/LearnJsStuff/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shahryarjb%2FLearnJsStuff/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30326902,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T05:25:20.737Z","status":"ssl_error","status_checked_at":"2026-03-10T05:25:17.430Z","response_time":106,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["js","react","redux","typescript"],"created_at":"2024-10-14T19:13:15.288Z","updated_at":"2026-03-10T07:31:14.103Z","avatar_url":"https://github.com/shahryarjb.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# مراحل یادگیری جاوااسکریپت\n\n\n---\n---\n\n### منابع بیشتر\n\n- https://github.com/getify/You-Dont-Know-JS\n- https://github.com/denysdovhan/wtfjs\n- https://github.com/wesbos/JavaScript30\n- https://github.com/ryanmcdermott/clean-code-javascript\n- https://github.com/lydiahallie/javascript-questions\n- https://github.com/metagrover/ES6-for-humans\n- https://github.com/trekhleb/javascript-algorithms\n- https://github.com/verekia/js-stack-from-scratch\n\n---\n---\n\n### جلوگیری از ریفرش شدن صفحه وب سایت \n\n\n```js\ndocument.querySelector('#someIDOfAForm').addEventListener('submit', function(e) {\n    e.preventDefault // it prevents refresh the post\n    e.target.elements.productTitle.value // productTitle is the name of a field in a form\n})\n```\n\n---\n\n### اضافه کردن و گرفتن اطلاعات از لوکال استوریج مروگر\n\n\n```js\nconst product = {title: \"Test one\", price: 10203}\nconst productJson = JSON.stringify(product) // Convert object to Json string\nlocalStorage.setItem('product', productJson) // Save String with a key in local storage\n```\n\n\u003e دریافت اطلاعات از لوکال استوریج و تبدیل اون به آبجکت\n\n```js\nconst productJson = localStorage.getItem('product')\nconst product = JSON.parse(productJson) // Convert Json to string\nconsole.log(`Product: ${product.title} - Price: ${product.price}`)\n```\n\n---\n\n### دریافت پارامتر و دیگر موارد از آدرس\n\nبرای دریافت اطلاعات مورد نظر از روی لینک سایت می توانیم از `Location` استفاده کنیم که این امکان را می دهد پارامتر پرت هوست و دیگر موارد را دریافت و در کدمان استفاده کنیم.[ اطلاعات بیشتر](https://developer.mozilla.org/en-US/docs/Web/API/Location#location_anatomy)\n\n\n---\n\n### استفاده از window\nبه صورت مثال اگر ما می خواهیم به خود مروگر دسترسی داشته باشیم و تمام تب ها اگر چیزی تغییر کرد متوجه بشویم می توانیم از window استفاده کنیم نمونه کد زیر تغییر در لوکلال استوریج را نمایش می دهد\n\n```js\nwindow.addEventListener('storage', function(e) {\n    if (e.key == 'product') {\n        product = JSON.parse(e.newValue)\n        ...\n    }\n})\n```\n\n---\n\n\u003e نکته: وقتی از `this` استفاده می کنیم دیگر نمی توانیم از ارور فانکشن ها یعنی با `=\u003e` استفاده کنیم\n\n---\n\n### ساخت new آبجکت و ارث بری از آن\n\nفرض بر مثال که شما خواستید به صورت شی گرایی کار کنید و همینطور ارث بری رو انجام بدهید در مرحله اول بدون ارث بری شما می خواهید این امکان را به یوزر بدهید از آبجکت شما یک اینستنت جدید بسازند\n\n```js\nconst User = function(email, id) {\n    this.email = email\n    this.id = id\n}\nconst username = new User('test@test.com', 13)\n```\n\nخروجی کد بالا می شود به شرح زیر:\n```js\nUser {email: 'test@test.com', id: 13}\n```\n\nهمانطور که می بنید خروجی بالا از یک آبجکتی که `new` هست.\n\nحالا فرض بر اینکه ما می خواهیم یک تابع بسازیم در آبجکت به عنوان تابع کانستراکتر که باید از `prototype` استفاده کنیم\n\nفقط کافیست کد زیر را اضافه کنیم قبل از `new` کردن آبجکت\n\n```js\nUser.prototype.userInfo = function() {\n    return `ID: ${this.id} - Email: ${this.email}`\n}\n```\n\nحالا دوباره صدا بزنید\n\n```js\nconst username = new User('test@test.com', 13)\nconsole.log(username.userInfo())\n```\n\nحال خروجی می شود\n```js\nID: 13 - Email: test@test.com\n```\n\n---\n\n### استفاده از کلاس و تغییر مدلم آبجکت به کلاس\n\nخوب اگر بخواهیم کد های بالا را تبدیل کنیم به نوع کلاس می توانیم به این صورت انجام بدهیم\n\n```js\nclass User {\n    constructor(id, email) {\n        this.email = email\n        this.id = id\n    }\n\n    userInfo() {\n        return `ID: ${this.id} - Email: ${this.email}`\n    }\n}\n\nconst username = new User('test@test.com', 13)\nconsole.log(username.userInfo())\n```\n\n---\n\n### استفاده از ساب کلس و super\nوقتی می خواهیم ساب کلس بسازیم و همینطور اکستند شده باشد در تابع کانسترکتر نیاز هست از کلاس مادر با `super` بیاییم اطلاعات رو بیاریم مواردی که نیاز هست به شرح زیر عمل کنید. کد بالا + کلاس جدید\n```js\nclass User {\n    constructor(id, email) {\n        this.email = email\n        this.id = id\n    }\n\n    userInfo() {\n        return `ID: ${this.id} - Email: ${this.email}`\n    }\n}\n\nclass Job extends User {\n    constructor(id, email, jobTitle) {\n        super(id, email)\n        this.jobTitle = jobTitle\n    }\n}\nconst username = new Job('test@test.com', 13, 'Developer')\nconsole.log(username)\n```\n\nخروجی می شود:\n```js\nJob { email: 13, id: 'test@test.com', jobTitle: 'Developer' }\n```\n\n---\n\n### اضافه کردن گتر و ستر\nبرای اینکه بتوانیم به یک آبجکت یک گتر و ستر اضافه کنیم به صورت زیر عمل می کنیم\n\n```js\nconst product = {\n    title: \"Book\",\n    price: 26,\n    get productInfo() {\n        return `Title: ${this.title} -- Price: ${this.price}`\n    },\n    set productInfo(value) {\n        const seperetedValue = value.split(' ')\n        this.title = seperetedValue[0]\n        this.price = seperetedValue[1]\n    }\n}\n```\nهمانطور که در کد بالا می بنید ما از یک فانکشن در دو حالت `set` و `get` استفاده کردیم البته با ورودی مختلف\n\nحالا برای دوباره بایند کردند و همینطور چاپ کردن به صورت زیر عمل کنید\n\n```js\nconsole.log(product.productInfo)\nproduct.productInfo = \"BookSha 99\"\nconsole.log(product.productInfo)\n```\n\n---\n\n### کال بک برای انجام توابع توالی\n\nلازم به ذکر است کال بک همان تابع دومی هست که باید به صورت توالی انجام شود به صورت یک آرگون در فانکشن اول قرار می گیرد و نکته بسیار مهم این است که نباید پرانتز داشته باشد\n\nبه مثال زیر توجه کنید:\n```js\nfunction myDisplayer(some) {\n    document.getElementById(\"demo\").innerHTML = some;\n}\n  \nfunction myCalculator(num1, num2, myCallback) {\n    let sum = num1 + num2;\n    myCallback(sum);\n}\n\nmyCalculator(5, 5, myDisplayer);    \n```\n\n---\n\n### کنترل توالی تابع با `Promise`\nاین مورد هم مثل کال بک هست ولی باید از آن یک انستنت ساخت و همینطور دو آرگومان دارد که می تواند اسم هایی که شما می پسندید باشد `myResolve, myReject` \n```js\nlet myPromise = new Promise(function(resolve, reject) {\n    if (!error) {\n        resolve(); // when successful\n    } else {\n        reject();  // when error\n    }\n});\n\nmyPromise\n    .then(value =\u003e { console.log(value) })\n    .catch(err =\u003e { console.log(err) })\n```\nهمانطور که در کد بالا دیدید شما می توانید در `resolve()` و همینطور `reject()` خروجی مورد نظر خودتان را قرار بدهید و بعد بیایید در زمانی که ارور ندارید `.then` و زمانی که خطا هست در `catch` استفاده کنید. لازم به ذکر هست در اکوسیستم پرامیس موارد دیگری نیز وجود دارد که در لینک زیر می تونید مطالعه کنید\nhttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise\n\n\n---\n\n### تابع `async` برای توالی فانکشن\nاگر به کد زیر توجه کنید تابعی که صدا زده می شود مدتی طول می کشد و چون برایش `await` قرار گرفته پس برنامه منتظر آن می ماند تا کامل انجام شد برود به برای انجام دیگر موارد\n\n```js\nfunction resolveAfter2Seconds() {\n    return new Promise(resolve =\u003e {\n      setTimeout(() =\u003e {\n        resolve('resolved');\n      }, 2000);\n    });\n}\n  \nasync function asyncCall() {\n    console.log('calling');\n    const result = await resolveAfter2Seconds();\n    console.log(result);\n    // expected output: \"resolved\"\n}\n\nasyncCall();\n  \n```\n\n---\n\n### ارسال درخواست به `API`\n\nاولین متدی که می خواهیم جلو برویم که نباید روی آن فوکوس کرد `XMLHttpRequest` می باشد\n\n```js\nconst sendHttpRequest = (method, url, data) =\u003e {\n    const promise = new Promise((resolve, reject) =\u003e {\n        const xhr = new XMLHttpRequest()\n        xhr.open(method, url)\n        xhr.responseType = 'json'\n        if (data) {\n            xhr.setRequestHeader('Content-Type', 'application/json')\n        }\n        xhr.onload = () =\u003e {\n            resolve(xhr.response)\n        }\n        xhr.onerror = (e) =\u003e {\n            reject(e)\n        }\n        xhr.send(JSON.stringify(data))\n    })\n    return promise\n}\n\n\nsendHttpRequest('GET', 'https://jsonplaceholder.typicode.com/posts/1')\n.then((value) =\u003e {\n    console.log(value)\n})\n.catch((e) =\u003e {\n    console.log(e)\n})\n\nsendHttpRequest('POST', 'https://jsonplaceholder.typicode.com/posts', {\n   userId: 1,\n   id: 2,\n})\n.then((value) =\u003e {\n    console.log(value)\n})\n.catch((e) =\u003e {\n    console.log(e)\n})\n```\n\nدر قطعه کد زیر بجای استفاده از مورد بالا از `fetch` استفاده می کنیم که بسیار تمیز تر و همینطور بهینه تر می باشد \n\n```js\nconst sendHttpRequest = (method, url, data) =\u003e {\n    return fetch(url, {\n        method: method,\n        body: JSON.stringify(data),\n        headers: data ? { 'Content-Type': 'application/json' } : {}\n    })\n    .then(res =\u003e {\n        return res.json()\n    })\n}\n\n\nsendHttpRequest('GET', 'https://jsonplaceholder.typicode.com/posts/1')\n.then((value) =\u003e {\n    console.log(value)\n})\n.catch((e) =\u003e {\n    console.log(e)\n})\n\nsendHttpRequest('POST', 'https://jsonplaceholder.typicode.com/posts', {\n    id: 1,\n    userId: 1,\n    title: \"Post title\",\n    body: \"Post Body\"\n})\n.then((value) =\u003e {\n    console.log(value)\n})\n.catch((e) =\u003e {\n    console.log(e)\n})\n```\n\nولی بهترین راه برای ارسال درخواست استفاده از کتابخانه `axios` می باشد که می توانید نمونه کد زیر را مشاهده کنید\n```js\naxios.get('https://jsonplaceholder.typicode.com/posts/1')\n.then(res =\u003e {\n    console.log(res)\n})\n\n// For post\n\naxios.post('https://jsonplaceholder.typicode.com/posts', {\n    userId: 2\n})\n.then(res =\u003e {\n    console.log(res)\n})\n```\nبه همین راحتی تمامی امکانات رو خواهید داشت و گیت هابش حتما چک بشه داخلش آپشن های زیادی هست \nhttps://github.com/axios/axios\n\n\n---\n\n### استفاده از `rest`\nفرض بکنیم ما یک تابع داریم که ورودیش دست کاربر هست و می خواد یک بار ۵ تا عدد یک بار ۱۲ تا عدد رو بزارش توش و همه رو با هم جمع کنه اینجاست که به صورت زیر عمل می کنیم\n\n```js\nconst checkOut = (...prices) =\u003e {\n    let sum = 0\n    prices.forEach(item =\u003e sum += item)\n    return sum\n}\n\nconsole.log(checkOut(1, 10, 1))\n```\nهمانطور که می بنید ما ورودی تابع را به صورت `...prices` نوشتیم که می شود ورودی ما یعنی آرایه است\n\nبه قطعه کد زیر توجه کنید\n```js\nconst cartDetails = (userName, totalPrice, ...products) =\u003e {\n\n}\ncartDetails(\"testUser\", 100, 'book1', 'book2', 'book3')\n```\nدو پارامتر اول تابع خوب به صورت تیکی وارد تابع می شند و بقیه موارد یعنی از book1 تا book3 به صورت لیست دریافت می گردد.\n\nحالا فرض کنید ما می خواهیم یک آرایه را بگیریم و به آن آرایه جدید اضافه کنیم مثل `++` یا `|` در الیکسیر اینجا اگر `...` را استفاده کنیم به آن `spread` می گویم نه `rest` مثال را ببنید\n\n```js\nlet products = ['book1', 'book2', 'book3']\nproducts = [...products, 'book4']\n```\n\n\n---\n\n### استفاده از destructing\nاگر بخواهیم به صورت دیگیری به آبجکت دسترسی داشته باشیم یا حتی مورد جدیدی را هم به آن اضافه کنیم به صورت زیر انجام می دهیم\n```js\nconst product = {\n    title: 'Book',\n    price: 79\n}\nconst { title, price, exist = true} = product\n```\n\nاین مورد در خود آرایه هم می توانید مورد استفاده قرار بگیرد\n```js\nconst product = ['book', 79]\nconst { title, price, exist = true} = product\n```\n\n---\n\n### اکسپورت کردن توابع برای وب پک و ...\n\n```js\nexport { productTitle, productPrice, productId as default}\n```\nهمانطور که در خطوط بالا می بنید هر کدام از از موارد مطرح شده یک متغییر یا تابع هستند که می توانیم در دیگر فایل های js بعد از کانورت استفاده کنیم ولی `productId` چون با `as default` اومده در فایل های دیگه می تونیم اسمشو سفارشی خودمون قرار بدهیم\n\n```js\nimport coustomIdName, {productTitle, productPrice } from './util'\n```\nبه این صورت در دیگر فایل ها قابل فراخوانی می باشد نیاز نیست js به آخر مسیر اضافه شود خودش آن را شناسایی می کند\n\n\n---\n### استفاده از DOMContentLoaded\nاولین چیزی که بعد از لود صفحه باید انجام بگیرد این رویداد هست به صورت مثال:\n\n```js\nwindow.addEventListener('DOMContentLoaded', (event) =\u003e {\n    console.log('DOM fully loaded and parsed');\n});\n```\n\n---\n\n### استفاده از static\nوقتی در یک کلاس برای یک متد از `static` استفاده می کنیم دیگر نیاز نیست در جاهایی که می خواهیم از آن استفاده کنیم حتما یک اینستنت درست کنیم\n\n```js\nclass Name {\n    static save() {\n        console.log(\"Test\")\n    }\n}\n\ndocument.addEventListener(\"something\", () =\u003e {\n    Name.save()\n})\n```\n\nهمانطور که مشاهده می کنید دیگر نیازی به `new` کردن کلاس قبل از آن نیست\n\n---\n\n\u003e نکته: در جاوااسکریپت وقتی ما توابع را به با پرانتز می آوریم در جایی که می خواهیم فراخوانی بکنیم دقیقا به `js` گفتیم آن را سریع اجرا کن ولی بدون پرانتز آوردنش یعنی یک ریفرنس به اون که هر وقت نیاز شد انجام بگیرد\n\n```js\ncardBtn.addEventListener('click', this.showCart)\n```\n\n\u003e نکته: برای حذف یک المنت وقتی از `removeChild` استفاده می کنیم باید به آن بگویم از کجا شروع به حذف بکنه و کجا متوقف بشه در این زمان است که می توانیم به این صورت عمل کنیم `cardContent.removeChild(removeItem.parentElement.parentElement)`\n\n\n\u003e لازم به ذکر است برای دیدن رویداد های مروگر مخصوصا ویندوز و متد هایش می توانید به صورت کامل در لینک زیر به آن دسترسی داشته باشید\nhttps://developer.mozilla.org/en-US/docs/Web/API/Window\n\n\n---\n\n### معنی precedence چیست\n\nفرض کنید ما یک متغیر داریم که هم نام یک تابع می باشد و از نوع var هست متغیر و همینطور متغیر بالاتر نوشته شده است. حال اگر بیاییم کنسول لاگ بزنیم و متغیر هم ارزش گذاری شده باشد قبل از تابع کنسول لاگ خود متغیر را چاپ می کند ولی اگر فقط یک var باشد و مساوی با چیزی نباشد کنسول لاگ می آید تابع را پرینت می کند\n\n```js\nvar name = \"shahryar\"\nfunction name() {\n console.log('Hi shahryar')\n}\nconsole.log(name)\n```\nدر این قطعه کد باید `shahryar` چاپ شود ولی اگر `var name` باشد و مساوی با چیزی نباشد کنسول لاگ تابع را چاپ می کند\n\n---\n\n### چطور کلوژر بسازیم\n\nدر جاوااسکریپت وقتی خروجی یا return تابعی یک تابع دیگر باشد یعنی ما کلوژر ساختیم و وقتی آن را در یک متغیر قرار بدهیم خود متغیر می تواند به صورت تابع عمل کند\n\n```js\nfunction name() {\n    const firstName = \"shahryar\"\n    \n    return function () {\n        console.log(firstName)\n     }\n}\n\nconst newFn = name()\nnewFn()\n```\n\n---\n\n### کاربرد `this` در یک کلاس\n\nفرض بر این قرار بدهیم که می خواهیم با `this` یک متغیر را صدا بزنیم به صورت زیر \n```js\nclass SomeThing {\n    constructor() {\n        this.name = \"shahryar\"\n    }\n\n    delayMethod() {\n        setTimeout(function(){\n            console.log(`Title: ${this.name}`)\n        }, 3000)\n    }\n}\n```\nاگر از این کلاس یک اینستنس جدید درست کنید و همینطور متد درست شده را صدا بزنیم یا کنسول لاگ کنید `this.name` مطمئنن شما خروجی آندیفاین را دریافت می کنید.\nدلیل آن این هست که در تابع شما یک متد اسنکورایز صدا زده شده است و به خوبی الان در حال ارزش گزاری نیست\nولی چرا؟\nچون `this` داره با آبجکت خودش اشاره می کنهو الان آبجکت اون `windows` هست ولی اگر `this` رو بالای ست تایم اون توی فانکشن دیلی متد قرار بدهید حالا به کلاس اشاره می کنه و آبجکت اون رو می یاره . چطور باید این مشکل رو حل کنیم به کد زیر توجه کنید\n\n```js\nclass SomeThing {\n    constructor() {\n        this.name = \"shahryar\"\n    }\n\n    delayMethod() {\n        setTimeout(function(){\n            console.log(`Title: ${this.name}`)\n        }.bind(this), 3000)\n    }\n}\n```\nهمینطور که دیدی ما اومدیم بعد از آبجکت ست تایم اون متد `bind` رو صدا زدیم و این متد برای ما می آید مشخص می کند منظور ما کدام `this` می باشد.\n\n---\n\n### دریافت لیست کتابخانه هایی که به صورت گلوبال نصب شده اند\n\n```\nnpm list -g --depth=0\n```\n\n\n\n### اضافه کردن یک پارامتر جدید به آبجکت\n\n```js\nconst posts = res.data.slice(0, 4)\nposts.map((item) =\u003e {\n    return {\n        ...item,\n        author: 'Shahryar'\n    }\n})\n\n```\nهمانطور که در کد بالا می بنید ما از سه نقطه استفاده کردیم که معنی آن یعنی که تمام آبجکت های قبلی را داشته باشید و این مورد را به آن ضاافه کند\n\n\n---\n\n### لگاسی کد\n\nفرض کنید شما یک سری پروژه دارید کاربران ممکن هست از مروگر قدیمی استفاده کنند پس برای این کار می تونید از شرط استفاده کنید و فانکشن خودتون که اکسپورتش کردید استفاده کنید به صورت زیر:\n\n```js\nif (!window.Promise) {\n  window.Promise = Promise;\n}\n```\nپرامیس سمت راست تابعی هست که اکسپورت شده در صورتی که مروگر از پرامیس ساپورت نکنه این جایگزینش می شه\n\n---\n### نمونه کد جدا کردن کوکی مروگر و تبدیل به آبجکت\n```js\ncookies = Object.fromEntries(document.cookie.split('; ').map(c =\u003e c.split('=')));\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshahryarjb%2Flearnjsstuff","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshahryarjb%2Flearnjsstuff","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshahryarjb%2Flearnjsstuff/lists"}