تیکه پاره های جاوا اسکریپت
442 subscribers
88 photos
11 videos
2 files
56 links
شاید اینا تکات ساده ای باشند اما بعضاً به پهنای دو روز باگ برای من بوده اند 🤓
آدرس گروه:
@iran_javascript_group

————————————————

☕️ Java Channel: @pieceJava
📒 JavaScript Channel: @pieceJs
Download Telegram
🖋 معنی و مفهوم عبارت Mutable و Immutable در علم برنامه نویسی

در برنامه نویسی، داده ها از دو دسته خارج نیستند یا Mutable هستند یا اینکه Immutable.
داده هایی که پس از تعریف کردن آن ها، قابل تغییر هستند اصطلاحاً بهشون Mutable میگیم و اونایی که غیر قابل تغییر هستند Immutable میگیم.

🟡 دیتا هایی با تایپ های Number، String و Boolean همگی از نوع Immutable هستند و دیتا هایی که تایپ های Array، Object، Map و Set دارند Immutable هستند.

ممکنه بگویید خب تمام این دیتا ها قابل تغییر هستند؟!!!
بله خب از یه جهت درست میگید اما منظور از قابل تغییر بودن، قابل تغییر بودن یا نبودن آدرس آن دیتا در حافظست. هر بار که دیتا های Immutable رو تغییر مقدار میدید، مقدار قبلی در حافظه موجود هست و کامپایلر یه آدرس جدید، برای مقدار جدید اون دیتا در حافظه اختصاص میده. اما mutable ها، هر بار که تغییر مقدار پیدا می‌کنند، در همان خانه ای که قبلاً در حافظه داشتند مقدارشون تغییر می‌کنه و خونه جدیدی بهشون اختصاص پیدا نمیکنه.

💬 این دو دسته هر دو از نظر مموری بهینه سازی شده اند اما دیتای Immutable به نسبت از بهینه سازی بیشتری برخوردار هستند چون غیر قابل تغییر هستند کامپایلر در زمان کامپایل برنامه میدونه که چه مقدار فضا برای این دیتا ها در حافظه اختصاص دهد و یک بار بیشتر هم نیاز به اختصاص دادن فضا ندارند. از همه مهم تر راحت تر کش میشن پس سرعت دسترسی بهشون هم خیلی زیاده.

💬 دیتا های Immutable ذاتا ترد سیف (Thread Safe) هستند این دیتا ها چون بعد از ایجاد غیر قابل تغییر هستند، ریسک دریافت خطای Data Corruction هنگام اجرای چند تردی برنامه کاهش میابه.

💬 دیتا های mutable بر خلاف immutable ها از سرعت بالاتری در زمان ایجاد تغییرات جدید برخوردارند چون نیازی به اختصاص یافتن آدرس جدید در حافظه ندارند و در همان آدرس قبلی تغییر میکنند در صورتی که Immutable ها ابتدا آدرس جدیدی بهشون اختصاص داده میشه سپس ذخیره میشن و این باعث میشه سرعت تغییر کمتری به نسبت mutable ها داشته باشند.
نکته: برای فیلد های input معمولاً دیتا های mutable مناسب تر هستند چون داده های ما با ورودی کاربر مدام در حال بروزرسانی هستند.


نکته 2: دیتا های immutable دیتا های مناسب تری برای تبدیل نوع داده هستند. از آنجایی که مقادیر قبلی آن ها همچنان در حافظه موجود هست، با نوع داده، ساید افکت کمتری متوجه پروژه شما میشود.


#انواع_داده #سوال_استخدامی

🟨 @pieceJS
Buy me a coffee 😀
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
💎 محاسبه تعداد اعداد منفی درون یک آرایه

برای محاسبه تعداد اعداد منفی درون یک آرایه میتونید از تیکه کد بالا استفاده کنید.

💡 نکته مهمی که داخل این پست میخوام بهتون بگم اینکه، قطعاً میدونید این کد رو میتونید با یه for ساده هم پیاده سازی کنید اما پرفورمنس آن به نسبت پیاده سازیش با حلقه for بالاتر هست دلیلش هم اینه که توابعی نظیر filter یا map صرفاً جهت کار بر روی آرایه ها ساخته شده اند و همیشه سعی شده در توابعی اخصاصی از الگوریتم های بهینه تری جهت بهبود پرفرمنس آن استفاده شود.

💬 پ.ن: البته تو نمونه بالا اینقدر اختلاف بین پرفرومنس ها در حالت های مختلف ناچیز هست که میشه ازش صرف نظر کنید و فقط به خوانایی تمرکز کنید


🌐 @pieceJS
❣️ Buy me a coffee
👍4
💎 نکته ای در مورد بروزرسانی داکیومنت توسط mongoose

دو متد findByIdAndUpdate و findOneAndUpdate به صورت پیشفرض، داکیومنت فعلی رو برمیگردونند سپس، مقدار اون رو آپدیت میکنند اگر میخواهید مقدار داکیومنت مورد نظر پس از آپدیت شدن برگردانید تنظیمات زیر رو اعمال کنید

Model.findByIdAndUpdate(id, updateObj, {new: true}, function(err, model) {...


🌐 @pieceJS
❣️ Buy me a coffee
👍5
💎 نکته ای در خصوص استفاده از ایونت های onChange یا onClick در select تگ ها

🔷 در صورتی که دارید از تگ select در پروژه خود استفاده می کنید، در نظر داشته باشید که نمیتوانید از ایونت های onChange یا onClick در تگ های فرزند آن یعنی تگ های option استفاده کنید و فقط میتوانید از این ایونت ها در خود تگ select استفاده کنید دلیل آن هم این است که اکثر ورژن های بروزر های کروم، سافاری و IE از آن ها در این تگ یعنی option پشتیبانی نمی کنند. (فایرفاکس پشتیبانی میکنه)


🌐 @pieceJS
👍3
🖋 اصطلاح Complex Transactions یعنی چه؟

این اصطلاح بیشتر در مبحث دیتابیس ها مورد استفاده قرار میگیره
اصطلاح Complex Transactions یا تراکنش های پیجیده به عملیات هایی گفته میشه که به صورت پیوسته و اتمیک (atomic) انجام میشه به عبارتی یا هیچ کدام انجام نشه یا همه با هم انجام بشه.
این قابلیت بیشتر در دیتابیس های SQL بیس ها وجود داره. در دیتابیس های noSQL باید این گونه عملیات ها مدیریت بشه.

#دیکشنری #دیتابیس



🌐 @pieceJS
👍5
💎 استفاده از تگ a به عنوان فرزند کامپوننت Link و چرا اصلا باید این کارو کنیم؟!

💬 اگر دارید از نکست جی اس استفاده می کنید حتماً متوجه شدید که نمیتونید از تگ a به عنوان فرزند در کامپوننت Link استفاده کنید!

حتماً برای یکی دو تا سوال شده که اصلاً چرا باید از a به عنوان فرزند در کامپوننت Link که خودش به نوعی داره از تگ a استفاده می کنه، استفاده کرد؟! 🤨

دلیلش صرفاً جهت بکارگیری از رویداد هایی مثل onClick، onChange و ... هست این رویداد ها رو نمیتونید به عنوان prop به خود کامپوننت Link بدید و باید به تگ a به عنوان فرزند بدید و در صورتی میتونید این تگ رو به عنوان فرزند به Link بدید که پراپ legacyBehavior رو به تگ Link بدید


پ.ن: البته من شنیدم تو نسخه های جدید نکست، دیگه نیازی نیست که از legacyBehavior هم استفاده کنید کسی تست زده؟


🌐 @pieceJS
👍7
💎 انتقال ویژگی href از Link به کامپوننت فرزند

فرض کنید یه کامپوننت سفارشی برای تگ لینک دکمه هاتون ایجاد کرده اید و میخواهید اونو به عنوان فرزند به کامپوننت های Link بدید.
در این شرایط برای اینکه بتونید از ویژگی href کامپوننت Link بهره مند بشید باید درون این تگ از پراپ passHref استفاده کنید این پراپ ویژگی href رو به کامپوننت فرزند یعنی MyBottonLink انتقال میدهد.



🌐 @pieceJS
👍6
💎 در مورد Custom Event در جاوا اسکریپت

🔶 برای ایجاد ایونت های سفارشی از کلاس CustomEvent یا کلاس Event استفاده میشه و معمولاً از ایونت سفارشی، برای ایجاد ارتباط بین بخش های مختلف پروژه استفاده می کنیم
تفاوتی که این دو کلاس با هم دارند اینه که وقتی از Event استفاده میکنید میتونید ایونت های ساده ای مثل onClick و... ایجاد کنید ولی وقتی از CustomEvent استفاده می کنید، میتونید یه سری جزئیات دیگه هم به ایونتتون اضافه کنید (که تو این محتوا بنا ندارم زیاد در این خصوص بنویسم)

💬 اما ممکنه براتون سوال بشه آیا از ایونت های سفارشی تو پروژه های ریکتی هم استفاده میکنیم یا اصلاً نیازه استفاده بشه؟! جواب اینه که شما تو اکثر پروژه های ریکتی از Custom Event استفاده می کنید با این تفاوت که دیگه مستقیم نمیاید از کلاس های CustomEvent یا Event استفاده کنید بلکه از ابزار هایی مثل Redux و ContextAPI استفاده می کنید.


نتیجه : به طور کلی از Custom Event برای ایجاد ارتباط بین بخش های مختلف پروژه استفاده میشه که این مورد تو Vanilla JS برای پروژه های کوچک راحت قابل پیاده سازی و نگهداریه ولی تو پروژه های بزرگ، مقداری پیچیده و نگهداریش سخت میشه. در صورتی که تو ریکت خیلی ساده، آسان و سریع تره


🌐 @pieceJS
👍4
💎 جستجو در دیتابیس بدون در نظر گرفتن بزرگی یا کوچکی حروف

برای جستجو در دیتابیس بدون در نظر گرفتن بزرگی یا کوچکی حروف، در دیتابیس های mongoDB باید از رجکس استفاده کنید.
در نظر داشته باشید به صورت پیشفرض، جستجویی که با استفاده از mongoose انجام میدید case-sensitive هست


 const user = await User.findOne({
email: new RegExp(`^${email}`,"i")
})



🌐 @pieceJS
👍2
#نمونه_چاپ جلد نرم:
- You Don't Know JS
- Build a Frontend Web Framework
- Dive Into Refactoring
- Learning JavaScript Design Patterns
- Grokking algorithm Persian

تصاویر ارسالی از مشتری عزیزمون😇😍🌸


~ کتابفروشی آی تی هلو
🍑 @ITBook_Pub
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
💎 در مورد Suspense در ریکت و نکست جی اس

استفاده از Suspense در React برای مدیریت لود کامپوننت‌های غیرهمزمان (async) استفاده میشه. زمانی که شما کامپوننتی رو با async تعریف می‌کنید، React تلاش می‌کنه تا اون کامپوننت رو لود کنه و اگر این لود زمان‌بر باشه، Suspense به کار میاد تا یک لودینگ شیک (loading state) رو نمایش بده.

اگر شما Suspense را در لایوت (layout) خود قرار دادید و کامپوننت اصلی شما هم به صورت غیرهمزمان یا همون async تنظیم کرده اید، در زمان بارگذاری اولیه، Suspense فعال میشه و صفحه لود یا هرچیزی که شما براش تعریف کردید رو نمایش میده.

نتیجه: اگر UX پروژه براتون اهمیت داره پیشنهاد میکنم حتماً از پراپ Suspense تو لایوت اصلی استفاده کنید

🌐 @pieceJS
👍6
💎 در مورد متد lean در Mongoose

تو Mongoose، وقتی با دیتابیس کار می‌کنی و یه کوئری می‌زنی، نتیجه‌ای که برمی‌گرده معمولاً یه شیء پر از امکانات و متدهای مختلف Mongoose هست. این یعنی می‌تونی مستقیم روش کارهایی مثل save یا populate انجام بدی. ولی گاهی وقتا تو فقط نیاز داری داده‌های خام و ساده رو بگیری و نیازی به این همه امکانات اضافی نداری. اینجا lean() به دادت می‌رسه!

فرض کن می‌خوای اطلاعات یه کاربر رو از دیتابیس بگیری، ولی نمی‌خوای باهاش کاری بکنی:

const user = await User.findOne({ email: "[email protected]" }).lean();
console.log(user);

اینجا user دیگه یه سند Mongoose نیست، بلکه یه شیء جاوااسکریپت ساده‌ست که فقط داده‌های خام توشه.


💡 فقط یادت باشه که اگه بعداً می‌خوای با این داده‌ها کارهایی مثل ذخیره (save) انجام بدی، lean() گزینه مناسبی نیست، چون داده‌ها دیگه اون قابلیت‌ها رو ندارن.

جمع بندی: lean() وقتی به دردت می‌خوره که فقط می‌خوای داده‌های خالص و بدون دردسر رو بگیری. سبک و سریع، دقیقاً همون چیزی که گاهی نیاز داری! 😄

🌐 @pieceJS
👍8
#معرفی_سایت
احتمالا تا الان متوجه شدید که بعضی از مقالات سایت medium پریمیوم هستند و تا زمانی که اشتراک پریمیوم رو تهیه نکنید، به شما اجازه ی خوندن نمیده.
البته مشکلی نیست، فقط کافیه لینک مقاله رو در داخل سایت readmedium.com وارد کنید😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
gistfile1.txt
26.4 KB
#پیشنهاد
فایل JSON حاوی اطلاعات تمامی استان ها و شهر های ایران که بشدت توی پروژه ها بخصوص جایی که نیاز به ثبت اطلاعات کاربر هست نیاز میشه

منبع: Saman Zamani Github
👍7
💎 در مورد متد Array.from در جاوااسکریپت

این متد یه جورایی مثل جادو می‌مونه که بهت اجازه می‌ده از هر چیزی که شبیه آرایه‌ست یا قابل تکراره، یه آرایه جدید بسازی. خیلی راحت و سریع! 🚀

چطوری کار می‌کنه؟

Array.from(arrayLike, mapFunction, thisArg)


پارامترهاش چیه؟

arrayLike:
- این یکی می‌تونه هر چیزی باشه که شبیه آرایه‌ست، مثلاً یک رشته، یا حتی یه مجموعه (Set) یا چیزای دیگه.
- مثلاً:

     Array.from('hello') // → ['h', 'e', 'l', 'l', 'o']


mapFunction (اختیاری):
- با این تابع می‌تونی به هر عنصر تو آرایه جدید یه تغییر بدی. مثلاً اگر بخوای همه عددها رو دو برابر کنی، می‌تونی ازش استفاده کنی.
- مثل این:

     const arr = Array.from([1, 2, 3], x => x * 2);
console.log(arr); // [2, 4, 6]


thisArg (اختیاری):
- این یکی بهت اجازه می‌ده یه مقدار خاص رو به عنوان this تو تابع mapFunction استفاده کنی.
- اگه نذاری، this به طور پیش‌فرض میشه undefined.


چند تا مثال بزنیم؟

🔶 1. ساختن آرایه از یه رشته

const str = 'hello';
const arr = Array.from(str);
console.log(arr); // ['h', 'e', 'l', 'l', 'o']


🔶 2. ساختن آرایه از یک مجموعه (Set)

const set = new Set([1, 2, 3]);
const arr = Array.from(set);
console.log(arr); // [1, 2, 3]


🔶 3. استفاده از mapFunction

const arr = Array.from([1, 2, 3], x => x + 1);
console.log(arr); // [2, 3, 4]


🔶 4. استفاده از thisArg

function addToThis(value) {
return value + this.number;
}
const obj = { number: 5 };
const arr = Array.from([1, 2, 3], addToThis, obj);
console.log(arr); // [6, 7, 8]


نکته‌های مهم

- غیر تغییر دهنده: یعنی اصل داده‌ها رو دست نمی‌زنه و فقط یه آرایه جدید می‌سازه. 🔒
- تبدیل آسون: با این متد می‌تونی هر داده‌ای رو به راحتی تبدیل به آرایه کنی. 🔄
- سازگاری: تو اکثر مرورگرهای مدرن کار می‌کنه، ولی ممکنه تو بعضی نسخه‌های قدیمی‌تر نباشه. 🖥

💭 نتیجه‌گیری

در کل، Array.from یه ابزار خیلی خوب و کاربردیه که بهت کمک می‌کنه از هر چیزی که شبیه آرایه‌ست، یه آرایه بسازی. با قابلیت‌هایی مثل تغییر دادن داده‌ها، خیلی کارتو راحت می‌کنه. پس حتماً امتحانش کن!


🌐 @pieceJS
👍10
💎 استفاده از مقادیر قدیمی استیت درون رویداد ها

دوستان عزیز وقتی توی رویدادهایی (مثل دابل‌کلیک) از state های ریداکس استفاده می‌کنید، بعد از هر باربروزرسانی store، ممکنه مقادیری که درون این رویدادها می‌گیرید قدیمی باشن، چون React مقداریر قبلی state رو نگه می‌داره. و اینجاست که مشکل پیش میاد چراکه مقادیر به‌روز نیستن!

اما راه‌حل سادست، به‌جای استفاده مستقیم از state، با getState از خود Redux آخرین و به‌روزترین مقادیر رو بگیرید. اینطوری همیشه مطمئنید که اطلاعاتی که دارید، کاملاً آپدیت و درسته.

پ.ن: صبح تا حالا وقتمو گرفت تا متوجه باگم شدم 🥹🥲



🌐 @pieceJS
👍7
💎 داینامیک کردن نام کلید ها در آبجکت ها

وقتی می‌خوایم یه کلید (key) توی یک شیء (object) رو به صورت دینامیک بسازیم، از براکت‌ها استفاده می‌کنیم. مثلاً:

{[product_${i}]: id}


اینجا داریم می‌گیم که اسم کلید رو با استفاده از i درست کنیم. یعنی اگر i برابر 1 باشه، کلید میشه product_1 اگر 2 باشه میشه product_2 و همینطور ادامه.

اگر بخوایم به صورت ثابت بنویسیم، باید اینطوری بنویسیم:

{ product_1: id }


اینجوری فقط یه کلید ثابت داریم و نمی‌تونیم توی حلقه چند تا کلید مختلف درست کنیم. پس با براکت‌ها می‌تونیم خیلی راحت اسم کلیدها رو تغییر بدیم.



🌐
@pieceJS
👍9
💎 رویداد beforeunload در جاوا اسکریپت

برای اینکه قبل از بسته شدن تب درون بروزر مربوط به وب اپلیکیشنی که طراحی کرده اید یه پیام Confirm بیاد میتونید از این رویداد استفاده کنید.


 useEffect(() => {
const handleBeforeUnload = (event) => {
event.preventDefault();
event.returnValue = '';
};

window.addEventListener('beforeunload', handleBeforeUnload);

return () => {
window.removeEventListener('beforeunload', handleBeforeUnload);
};
}, []);


#event

🌐 @pieceJS
👍8
💎 تابع eval در جاوا اسکریپت

تابع eval توی جاوااسکریپت یه جورایی مثل یه جادوگر عمل می‌کنه! می‌تونی بهش یه رشته بدی که شامل کد جاوااسکریپت هست، و اون رو اجرا می‌کنه. مثلاً:

eval("console.log('سلام دنیا!')");


این کد توی کنسول "سلام دنیا!" رو چاپ می‌کنه.

اما یه نکته مهم: استفاده از eval خطرناکه! اگه ورودی‌اش از منبع غیرقابل اعتماد باشه، ممکنه کدهای بدی اجرا بشه. 😁👌🏻 همچنین، سرعت برنامه‌ت رو هم می‌تونه پایین بیاره.

پس بهتره فقط وقتی که واقعا نیاز داری ازش استفاده کنی و به جای اون، از روش‌های دیگه برای اجرای کد استفاده کنی.


#function
🌐 @pieceJS
👍8
Media is too big
VIEW IN TELEGRAM
🎞 ویدئویی جالب از پرفورمنس انواع روش های مرتب سازی

دیدنش پیشنهاد میشه، میتونه بهتون ذهنیت بهتری از روش های مرتب سازی بده


🌐 @pieceJS
👍4