جاوااسکریپت (مشابه همه زبانهایی که دارن از استاندارد آیایایای۷۵۴ استفاده میکنن) حاصل جمع 0.2 + 0.1 رو به شکل زیر نشون میده:
0.30000000000000004
حالا چرا همچین اتفاقی میفته؟ چون طبق معیارهای استاندارد بالا ، همه اعداد به مبنای باینری تبدیل میشن و کمی تقریب پیش میاد. توضیح کامل ترش رو میتونید توی استاندارد زیر مطالعه کنید.
https://lnkd.in/dzcdRqnj
دلیلش ممکنه برامون خیلی مهم نباشه ولی قطعا راه حلش مهمه.
حالا چطوری میتونیم موقع محاسبات از این خطا (اگر بشه بهش گفت خطا) جلوگیری کنیم؟
راه اول : استفاده از کتابخانه جانبی مثل دسیمال جیاس:
import Decimal from 'decimal.js';
console.log(new Decimal(0.1).plus(new Decimal(0.2)).toNumber());
راه دوم: استفاده از اینستنس متدهای نامبر:
console.log((0.1 + 0.2).toFixed(2));
راه سوم:استفاده از تقریب ثابت:
const precision = 1000
console.log((0.1 * precision + 0.2 * precision) / precision)
مطالب بیشتر در کانال رقصنده با کد :
@danceswithcode
0.30000000000000004
حالا چرا همچین اتفاقی میفته؟ چون طبق معیارهای استاندارد بالا ، همه اعداد به مبنای باینری تبدیل میشن و کمی تقریب پیش میاد. توضیح کامل ترش رو میتونید توی استاندارد زیر مطالعه کنید.
https://lnkd.in/dzcdRqnj
دلیلش ممکنه برامون خیلی مهم نباشه ولی قطعا راه حلش مهمه.
حالا چطوری میتونیم موقع محاسبات از این خطا (اگر بشه بهش گفت خطا) جلوگیری کنیم؟
راه اول : استفاده از کتابخانه جانبی مثل دسیمال جیاس:
import Decimal from 'decimal.js';
console.log(new Decimal(0.1).plus(new Decimal(0.2)).toNumber());
راه دوم: استفاده از اینستنس متدهای نامبر:
console.log((0.1 + 0.2).toFixed(2));
راه سوم:استفاده از تقریب ثابت:
const precision = 1000
console.log((0.1 * precision + 0.2 * precision) / precision)
مطالب بیشتر در کانال رقصنده با کد :
@danceswithcode
جاوااسکریپت یک زبان dynamically typed (و همچنین weakly typed) هستش.
ویژگی dynamically typed یعنی یک متغیر میتونه هر نوع مقداری را نگه داره و در طول زمان نوعش تغییر کنه.
ویژگی weakly typed یعنی زبان در برخی عملیاتها بهصورت ضمنی نوع داده را تبدیل میکنه، بدون اینکه خطای type بده.
این رفتار با زبانهایی مثل Java یا C# که نوع متغیر در آنها ثابته، فرق داره.
ویژگی dynamically typed یعنی یک متغیر میتونه هر نوع مقداری را نگه داره و در طول زمان نوعش تغییر کنه.
ویژگی weakly typed یعنی زبان در برخی عملیاتها بهصورت ضمنی نوع داده را تبدیل میکنه، بدون اینکه خطای type بده.
این رفتار با زبانهایی مثل Java یا C# که نوع متغیر در آنها ثابته، فرق داره.
رقصنده با کد
در مورد زمان برگزاریها دورهها همیشه اختلاف نظر وجود داره. شما کدوم رو ترجیج میدید؟ لطفا حتما نظر بدید.
دوستان کم لطفی نکنید. لطفا رای بدید
رقصنده با کد
دوره جامع جاوااسکریپت (با تمرکز فقط روی جاوااسکریپت مدرن) پیشنیاز: ندارد مخاطب : همه نفرات علاقه مند ( با سابقه یا بدون سابقه ) کاربرد : فرانت اند ، بکاند ، موبایل و ... تاریخ شروع : ۱۷ مرداد تعداد جلسات : ۱۶ جلسه ۲ ساعته ( هر جمعه ۲ جلسه ) ساعت برگزاری…
جلسه اول دوره جامع جاوااسکریپتمون که رایگان هم بود هفته گذشته با موفقیت برگزار شد. با تشکر از نفراتی که شرکت کردن.
فردا جلسه دوم و سوم دوره جامع جاوااسکریپت با حضور ۴ نفر از دوستان برگزار میشه ولی هنوز ۲ ظرفیت خالی دیگه وجود داره. چون جلسه اول بیشتر به تاریخچه و موارد غیر فنی پرداخته شد ، همچنان اگر علاقه داشته باشید میتونید شرکت کنید ولی از فردا دیگه دوره بسته میشه چون بعدش دیگه نمیتونید مباحث رو دنبال کنید اگر جلسهای رو نبوده باشید.
فردا جلسه دوم و سوم دوره جامع جاوااسکریپت با حضور ۴ نفر از دوستان برگزار میشه ولی هنوز ۲ ظرفیت خالی دیگه وجود داره. چون جلسه اول بیشتر به تاریخچه و موارد غیر فنی پرداخته شد ، همچنان اگر علاقه داشته باشید میتونید شرکت کنید ولی از فردا دیگه دوره بسته میشه چون بعدش دیگه نمیتونید مباحث رو دنبال کنید اگر جلسهای رو نبوده باشید.
تفاوت Expression و Statement
1️⃣ Expression
- Produces a value.
- Can be used wherever a value is expected (e.g., in a variable assignment, as a function argument).
- Can be as simple as a literal (42) or more complex (a + b * 2).
2️⃣ Statement
- Performs an action.
- Does not directly produce a value that can be used in another expression.
- Controls the flow or declares something.
3️⃣ Expression Statement
Some expressions can also be statements when used on their own, like:
#js
1️⃣ Expression
- Produces a value.
- Can be used wherever a value is expected (e.g., in a variable assignment, as a function argument).
- Can be as simple as a literal (42) or more complex (a + b * 2).
5 // literal → value is 5
x = 10 // assignment → value is 10
a + b // addition → value is sum
myFunction() // function call → value is return result
true ? 1 : 0 // ternary → value is 1 or 0
2️⃣ Statement
- Performs an action.
- Does not directly produce a value that can be used in another expression.
- Controls the flow or declares something.
if (x > 10) { ... } // if statement
for (let i = 0; i < 5; i++) { ... } // loop statement
function greet() { ... } // function declaration
return x; // return statement
3️⃣ Expression Statement
Some expressions can also be statements when used on their own, like:
x = 5; // assignment expression used as a statement
sayHello(); // call expression used as a statement
#js
به طور کلی توی جاوااسکریپت، از نظر سرعت ، معمولاً حلقهی for ساده (با شمارندهی ایندکس) سریعتر از for...of هست، و این دو هم ، معمولاً سریعتر از متدهایی مثل .forEach() یا .map() عمل میکنند.
چرا for معمولاً سریعتره؟
- هیچ تابع اضافهای در هر تکرار ایجاد نمیکنه.
- از پروتکل iterator استفاده نمیکنه.
- مستقیماً با ایندکس و طول آرایه کار میکنه.
به صورت کلی:
- اگر سرعت حداکثری و کنترل کامل لازم داری : for ساده.
- اگر کد تمیز و خوانا میخوای و عملکرد خیلی بحرانی نیست : for...of.
- اگر سبک فانکشنال و کوتاهنویسی میخوای : .map() یا .forEach().
چرا for معمولاً سریعتره؟
- هیچ تابع اضافهای در هر تکرار ایجاد نمیکنه.
- از پروتکل iterator استفاده نمیکنه.
- مستقیماً با ایندکس و طول آرایه کار میکنه.
به صورت کلی:
- اگر سرعت حداکثری و کنترل کامل لازم داری : for ساده.
- اگر کد تمیز و خوانا میخوای و عملکرد خیلی بحرانی نیست : for...of.
- اگر سبک فانکشنال و کوتاهنویسی میخوای : .map() یا .forEach().
در جاوااسکریپت Iterable و Enumerable دو مفهوم متفاوت هستن، هرچند که معناشون کمی شبیه همدیگست.
💡 کلمه Enumerable یعنی قابل شمارش بودن propertyها
- فقط مربوط به کلیدهای یک آبجکته.
- یعنی اینکه آیا وقتی داری کلیدهای آبجکت رو با روشهایی مثل for...in یا Object.keys() میگیری، اون ویژگی (property) دیده میشه یا نه.
- اصلاً کاری به مقدارش یا پیمایش المنتها نداره، فقط دیده شدن property در شمارشهاست.
- کنترلش با denoscriptor انجام میشود
💡 کلمه Iterable یعنی پیمایش بودن مقدار
- مربوط به اینه که آیا خود شیء میتونه با for...of یا ...spread پیمایش بشه یا نه.
- این یعنی آبجکت باید پروتکل iterator رو پیادهسازی کنه (Symbol.iterator).
- این مفهوم بیشتر برای ساختار دادههای لیستی هست مثل Array, String, Map, Set.
مثال ترکیبی
اینجا:
- ویژگیهای a و b ، هر دو enumerable هستن پس Object.keys میبیندشون.
- خود obj رو با iterable کردیم پس for...of میتونه پیمایشش کنه.
---------------------
مطالب بیشتر در کانال رقصنده با کد
https://news.1rj.ru/str/danceswithcode
#js #deepjs
💡 کلمه Enumerable یعنی قابل شمارش بودن propertyها
- فقط مربوط به کلیدهای یک آبجکته.
- یعنی اینکه آیا وقتی داری کلیدهای آبجکت رو با روشهایی مثل for...in یا Object.keys() میگیری، اون ویژگی (property) دیده میشه یا نه.
- اصلاً کاری به مقدارش یا پیمایش المنتها نداره، فقط دیده شدن property در شمارشهاست.
- کنترلش با denoscriptor انجام میشود
const obj = { a: 1, b: 2 };
Object.defineProperty(obj, 'c', { value: 3, enumerable: false });
console.log(Object.keys(obj)); // ['a', 'b']
💡 کلمه Iterable یعنی پیمایش بودن مقدار
- مربوط به اینه که آیا خود شیء میتونه با for...of یا ...spread پیمایش بشه یا نه.
- این یعنی آبجکت باید پروتکل iterator رو پیادهسازی کنه (Symbol.iterator).
- این مفهوم بیشتر برای ساختار دادههای لیستی هست مثل Array, String, Map, Set.
const arr = [10, 20, 30];
for (const item of arr) {
console.log(item); // 10 20 30
}
console.log(...arr); // 10 20 30
مثال ترکیبی
const obj = {
a: 1,
b: 2,
[Symbol.iterator]: function* () {
yield this.a;
yield this.b;
}
};
console.log(Object.keys(obj));
for (const value of obj) {
console.log(value);
}
اینجا:
- ویژگیهای a و b ، هر دو enumerable هستن پس Object.keys میبیندشون.
- خود obj رو با iterable کردیم پس for...of میتونه پیمایشش کنه.
---------------------
مطالب بیشتر در کانال رقصنده با کد
https://news.1rj.ru/str/danceswithcode
#js #deepjs
یه چیزی.
اگر گاهی نکتهی پیشرفتهای از جاوااسکریپت داخل کانال میذارم و بلد نیستید ، روی انگیزه یا تلاشتون در یادگیری اثر منفی نذاره.
خیلی از نفرات اینها رو بلد نیستن و خیلی جاها هم آموزش نمیدن. چرا که خیلیاش واقعا توی استفاده روزمره نیستش.
من صرفا چون تلاش دارم جاوااسکریپت رو با تمام جزییاتش بلد بشم میرم سراغ این نکات و گرنه میتونید ۲۰ سال فرانتاند یا بکاند باشید و چیزی مثل weakRef یک بار هم نیازتون نشه.
اگر گاهی نکتهی پیشرفتهای از جاوااسکریپت داخل کانال میذارم و بلد نیستید ، روی انگیزه یا تلاشتون در یادگیری اثر منفی نذاره.
خیلی از نفرات اینها رو بلد نیستن و خیلی جاها هم آموزش نمیدن. چرا که خیلیاش واقعا توی استفاده روزمره نیستش.
من صرفا چون تلاش دارم جاوااسکریپت رو با تمام جزییاتش بلد بشم میرم سراغ این نکات و گرنه میتونید ۲۰ سال فرانتاند یا بکاند باشید و چیزی مثل weakRef یک بار هم نیازتون نشه.
a plus 220-1201 150 test.zip
8.3 MB
۱۵۰ تست A+
پیشنهاد میکنم نگاه کنید ببینید چه قدرش رو بلدید. حقیقتا خودم هر چی بیشتر میخونم بیشتر برگام میریزه که چه قدر بلد نیستم.
پیشنهاد میکنم نگاه کنید ببینید چه قدرش رو بلدید. حقیقتا خودم هر چی بیشتر میخونم بیشتر برگام میریزه که چه قدر بلد نیستم.
دو تا نقطهای که گذاشته شده خطای تایپی نیست.
توی جاوااسکریپت وقتی میخواید از متدی روی یک عدد به صورت مستقیم استفاده کنید باید از ۲ نقطه استفاده کنید تا به انجین جاوااسکریپت بگید که نقطه اول یعنی اینکه عددمون قسمت اعشاری نداره و نقطه دوم برای کال کردن متد استفاده میشه. در غیر اینصورت خطا میده
از روش دوم هم میتونید استفاده کنید.
توی جاوااسکریپت وقتی میخواید از متدی روی یک عدد به صورت مستقیم استفاده کنید باید از ۲ نقطه استفاده کنید تا به انجین جاوااسکریپت بگید که نقطه اول یعنی اینکه عددمون قسمت اعشاری نداره و نقطه دوم برای کال کردن متد استفاده میشه. در غیر اینصورت خطا میده
از روش دوم هم میتونید استفاده کنید.
دو تا نسخه از چت جیپیتی رو دارم. یکی پولی و یکی رایگان.
نسخه رایگان به مراتب قویتر از پولیه عمل میکنه. احتمالا به خاطر اینکه داره از ورژنهای قبل ۵ استفاده میکنه.
نسخه رایگان به مراتب قویتر از پولیه عمل میکنه. احتمالا به خاطر اینکه داره از ورژنهای قبل ۵ استفاده میکنه.
یه تجربه مصاحبه فنی جالب داشتم.
گاها پیش میاد که مصاحبه کننده خودش یه چیزایی رو خوب ندونه ولی اینکه هیچ کدوم از سوالها رو اصلا ندونه و فقط جواب تک کلمهایشون رو حفظ کرده باشه واقعا عجیبه.
بیشتر شبیه جلسه آموزشی شده بود تا مصاحبه.
شخص مورد نظر خودش برنامهنویس فرانتاند بود.
گاها پیش میاد که مصاحبه کننده خودش یه چیزایی رو خوب ندونه ولی اینکه هیچ کدوم از سوالها رو اصلا ندونه و فقط جواب تک کلمهایشون رو حفظ کرده باشه واقعا عجیبه.
بیشتر شبیه جلسه آموزشی شده بود تا مصاحبه.
شخص مورد نظر خودش برنامهنویس فرانتاند بود.
شاید گمان کنید برای اینکه مهارت پیدا کنید ، حتما باید تجهیزات خوبی داشته باشید ، ولی یکی از قویترین برنامهنویسهایی که میشناسم لپ تاپش به حدی داغون بود که فکر کنم خیلیها حاضر نیستن حتی روشنش کنن اما تمام کارش رو با همون انجام میداد.
تجهیزات خوب ، بودنش عالیه ولی نبودنش اصلا بهونه خوبی برای تنبلی نیست.
تجهیزات خوب ، بودنش عالیه ولی نبودنش اصلا بهونه خوبی برای تنبلی نیست.
تفاوت revert و reset در git
git revert
یک کامیت جدید ایجاد میکند که تغییرات کامیت مشخصشده را برعکس (undo) میکند
git reset
شاخه (branch) را به یک نقطه قبلی در تاریخچه برمیگرداند. این یعنی تاریخچه بازنویسی میشود.
#git #interview
git revert
یک کامیت جدید ایجاد میکند که تغییرات کامیت مشخصشده را برعکس (undo) میکند
git revert abc123
git reset
شاخه (branch) را به یک نقطه قبلی در تاریخچه برمیگرداند. این یعنی تاریخچه بازنویسی میشود.
git reset --hard abc123
#git #interview
ویژگی satisfied در TypeScript از نسخه 4.9 معرفی شده و برای بررسی نوع در زمان کامپایل بدون تغییر نوع اصلی متغیر استفاده میشود.
کاربرد اصلی satisfies
به شما اجازه میدهد مطمئن شوید که یک مقدار با یک تایپ خاص سازگار است.
اما برخلاف as، نوع مقدار را تغییر نمیدهد، فقط بررسی میکند.
در نتیجه:
• اگر اشتباه تایپی باشد، خطا میدهد.
• اگر درست باشد، نوع اصلی مقدار حفظ میشود.
مثال ساده
اینجا user باید تمام الزامات Person را برآورده کند.
اما همچنان نوع user برابر با { name: string; age: number; extra: boolean } میماند.
اگر name را حذف کنیم، خطا میدهد:
تفاوت با as
اینجا TypeScript فقط نوع را Cast میکند، حتی اگر چیزی کم باشد، ممکن است بدون خطا عبور کند (در حالت غیر strict).
ولی satisfies اجازه نمیدهد چیزی که ناقص است قبول شود.
مثال کاربردیتر با enum یا union
#ts #interview
کاربرد اصلی satisfies
به شما اجازه میدهد مطمئن شوید که یک مقدار با یک تایپ خاص سازگار است.
اما برخلاف as، نوع مقدار را تغییر نمیدهد، فقط بررسی میکند.
در نتیجه:
• اگر اشتباه تایپی باشد، خطا میدهد.
• اگر درست باشد، نوع اصلی مقدار حفظ میشود.
مثال ساده
type Person = {
name: string;
age: number;
};
const user = {
name: "Ali",
age: 30,
extra: true
} satisfies Person;
اینجا user باید تمام الزامات Person را برآورده کند.
اما همچنان نوع user برابر با { name: string; age: number; extra: boolean } میماند.
اگر name را حذف کنیم، خطا میدهد:
const user = {
age: 30
} satisfies Person; // ❌ خطا: name وجود ندارد
تفاوت با as
const user = {
name: "Ali",
age: 30
} as Person;
اینجا TypeScript فقط نوع را Cast میکند، حتی اگر چیزی کم باشد، ممکن است بدون خطا عبور کند (در حالت غیر strict).
ولی satisfies اجازه نمیدهد چیزی که ناقص است قبول شود.
مثال کاربردیتر با enum یا union
type Theme = "light" | "dark";
const config = {
theme: "light"
} satisfies { theme: Theme };
// اگر بنویسی:
const config2 = {
theme: "blue"
} satisfies { theme: Theme }; // ❌ خطا
#ts #interview
تفاوت git rebase و git merge در Git اساسی است، چون هر دو برای ترکیب تغییرات استفاده میشوند ولی نحوهی ادغام و تاریخچه کاملاً فرق دارد.
--------------------------
💡 git merge
• چه میکند؟
تغییرات دو شاخه را با هم ادغام میکند و یک کامیت جدید (merge commit) ایجاد میکند.
• تاریخچه حفظ میشود به صورت شاخهای (branching history).
• مزیت: سابقه واقعی و ترتیب زمانی کامیتها حفظ میشود.
• عیب: تاریخچه ممکن است شلوغ شود (کامیتهای Merge زیاد).
نتیجه:
A---B---C (main)
\
D---E (feature)
\
M (merge commit)
--------------------------
💡git rebase
• چه میکند؟
کل کامیتهای شاخهی فعلی را بر اساس شاخهی هدف بازنویسی میکند (history rewrite).
• کامیتها را جوری قرار میدهد که انگار از همان ابتدا بر اساس آخرین کامیت شاخهی هدف ساخته شدهاند.
• مزیت: تاریخچه خطی (linear history) و تمیز.
• عیب: بازنویسی تاریخچه خطرناک است (نباید در شاخههای اشتراکی استفاده شود).
نتیجه:
A---B---C---D'---E' (feature)
#interview #git
--------------------------
💡 git merge
• چه میکند؟
تغییرات دو شاخه را با هم ادغام میکند و یک کامیت جدید (merge commit) ایجاد میکند.
• تاریخچه حفظ میشود به صورت شاخهای (branching history).
• مزیت: سابقه واقعی و ترتیب زمانی کامیتها حفظ میشود.
• عیب: تاریخچه ممکن است شلوغ شود (کامیتهای Merge زیاد).
git checkout main
git merge feature
نتیجه:
A---B---C (main)
\
D---E (feature)
\
M (merge commit)
--------------------------
💡git rebase
• چه میکند؟
کل کامیتهای شاخهی فعلی را بر اساس شاخهی هدف بازنویسی میکند (history rewrite).
• کامیتها را جوری قرار میدهد که انگار از همان ابتدا بر اساس آخرین کامیت شاخهی هدف ساخته شدهاند.
• مزیت: تاریخچه خطی (linear history) و تمیز.
• عیب: بازنویسی تاریخچه خطرناک است (نباید در شاخههای اشتراکی استفاده شود).
git checkout feature
git rebase main
نتیجه:
A---B---C---D'---E' (feature)
#interview #git