رقصنده با کد
782 subscribers
1.69K photos
850 videos
207 files
666 links
Here are some interesting things I've come across during my learning process. That's it. Admin ID:
@alithecodeguy
Download Telegram
اجرا نکرده جواب بدید : خروجی چی میشه؟


async function run() {
console.log('1');
await Promise.resolve();
console.log('2');
}
run();
console.log('3');


#interview #js
اجرا نکرده جواب بدید : خروجی چی میشه؟


let a = { x: 1 };
let b = a;
a.x = 2;
a = { x: 3 };
console.log(b.x);


#interview #js
سوالات مصاحبه‌ای پارت ۱

Q1:

for (var i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}


3
3
3

Q2:

for (let i = 0; i < 3; i++) {
setTimeout(() => console.log(i), 1000);
}


0
1
2

Q3:

const obj = {
name: 'Ali',
sayHi: function () {
setTimeout(function () {
console.log(`Hi ${this.name}`);
}, 1000);
}
};

obj.sayHi();


Hi undefined

Q4:

console.log([] + []);
console.log([] + {});
console.log({} + []);
console.log({} + {});


""
[object Object]
[object Object]
NaN

Q5:

let x = 1;

if (function f() {}) {
x += typeof f;
}

console.log(x);


1undefined

Q6:

console.log([] == ![]);


true

Q7:

console.log([] == []);


false

Q8:

let x = 0;

console.log(x++);
console.log(++x);


0
2

Q9:

console.log(1 < 2 < 3);
console.log(3 > 2 > 1);


true
false

Q10:

const a = {};
const b = { key: 'b' };
const c = { key: 'c' };

a[b] = 123;
a[c] = 456;

console.log(a[b]);


456

Q11:

let obj = {
a: 10,
b: () => console.log(this.a)
};

obj.b();


undefined

Q12:

console.log("5" + 1);
console.log("5" - 1);


'51'
4

Q13:

let a = 1;
let b = a++;
console.log(a, b);


2 1

Q14:

console.log([1, 2, 3] + [4, 5, 6]);


'1,2,34,5,6'

Q15:

function test(x = y, y = 2) {
console.log(x, y);
}
test();


ReferenceError: Cannot access 'y' before initialization

Q16:

console.log('1');
setTimeout(() => console.log('2'), 0);
Promise.resolve().then(() => console.log('3')).then(() => console.log('4'));
console.log('5');


1
5
3
4
2

Q17:

async function test() {
return 5;
}

test().then(console.log);


5

Q18:

Promise.resolve()
.then(() => console.log('A'))
.then(() => console.log('B'));

Promise.resolve().then(() => console.log('C'));


A
C
B

Q19:

var name = "Ali";
(function () {
console.log(name + " the code guy");
name = "Reza";
console.log(name + " the pilot");
})();


Ali the code guy
Reza the pilot

Q20:

var name = "Ali";
(function () {
console.log(name + " the code guy");
var name = "Reza";
console.log(name + " the pilot");
})();


undefinedthe code guy
Reza the pilot

Q21:

var name = "Ali";
(function () {
console.log(name + " the code guy");
let name = "Reza";
console.log(name + " the pilot");
})();


Uncaught ReferenceError: Cannot access 'name' before initialization

Q22:

if (2 == '2') {
var a = 'a';
let b = 'b';
const c = 'c';
}

function func() {
var d = 'd';
let e = 'e';
const f = 'f';
}
func();

console.log(a);
console.log(b);
console.log(c);
console.log(d);
console.log(e);
console.log(f);


console.log(a); // prints: a
console.log(b); // ReferenceError: b is not defined
console.log(c); // ReferenceError: c is not defined
console.log(d); // ReferenceError: d is not defined
console.log(e); // ReferenceError: e is not defined
console.log(f); // ReferenceError: f is not defined

Q23:

a()
b()
c()

function a () {
console.log('a')
}

const b = () => {
console.log('b')
}

var c = function() {
console.log('c')
}


a
TypeError: b is not a function

Q24:

const funcs = [];
for (var i = 0; i < 5; i++) {
funcs.push(() => i);
}
console.log(funcs.map(f => f()));


[5, 5, 5, 5, 5]

Q25:

Promise.resolve().then(() => console.log(1));
queueMicrotask(() => console.log(2));
setTimeout(() => console.log(3), 0);
console.log(4);
new Promise(() => console.log(5));
(async () => console.log(6))();


4
5
6

Q26:

async function foo() {
setTimeout(() => {
return 'done';
}, 1000);
}
foo().then(res => console.log(res));


undefined

Q27:

setTimeout(() => {
console.log('Macrotask - Timer');
}, 0);

Promise.resolve().then(() => {
console.log('Microtask - Promise');
});

console.log('End');


End
Microtask - Promise
Macrotask - Timer

پارت ۲ سوالات:
https://t.iss.one/danceswithcode/4618

@danceswithcode

#interview #js
این یک نکته خاص از ریکت هستش که توی مصاحبه‌ها پرسیده شده ازم:

https://youtube.com/shorts/CAEuTN4qYqI?si=6bo_D8rp8YtYxu_x

#interview
۲۰ تا سوال زیر رو سعی کنید بدون هوش مصنوعی و کمک و فقط با فکر کردن ، به روش recursive حل کنید

🟢 Easy

1. Write a recursive function to calculate the sum of numbers from 1 to n.

2. Write a recursive function to compute the factorial of n.

3. Write a recursive function to print each element of an array.

4. Write a recursive function to count down from n to 1.

5. Write a recursive function to reverse a string.

6. Write a recursive function that returns the length of a string (without using .length).

7. Write a recursive function to check if a number is even.

8. Write a recursive function that prints numbers from 1 up to n.

9. Write a recursive function to count the number of vowels in a string.

10 .Write a recursive function to calculate the power base^exponent.

🟡 Medium

11. Write a recursive function to compute the nth Fibonacci number.

12. Write a recursive function to check if a string is a palindrome.

13. Write a recursive function to sum all elements in a nested array (deep sum).

14. Write a recursive function to flatten a nested array into a single array.

15. Write a recursive function to find the maximum number in an array.

16. Write a recursive function that capitalizes the first letter of each word in an array of strings.

17. Write a recursive function to multiply all numbers in an array.

18. Write a recursive function that removes all occurrences of a given character from a string.

19. Write a recursive function to find the GCD (greatest common divisor) of two numbers.

20. Write a recursive function to merge two sorted arrays into one sorted array (without using loops).

@alithecodeguy #recursive #interview
رقصنده با کد
سوالات مصاحبه‌ای پارت ۱ Q1: for (var i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1000); } 3 3 3 Q2: for (let i = 0; i < 3; i++) { setTimeout(() => console.log(i), 1000); } 0 1 2 Q3: const obj = { name: 'Ali', sayHi: function () {…
پارت ۲ سوالات مصاحبه‌ای

پارت ۱:
https://t.iss.one/danceswithcode/4445

این پست به مرور زمان تکمیل میشه

Q28:

const myPromise = new Promise((resolveOuter) => {
console.log("*One*");
resolveOuter(
new Promise((resolveInner) => {
console.log("*Two*");
setTimeout(() => resolveInner("*Three*"), 0);
})
);
});

const func1 = () => {
myPromise.then((res) => res).then((res2) => console.log(res2));
};

console.log("*Four*");

func1();


*One*
*Two*
*Four*
*Three*

Q29:

const myPromise = new Promise((resolveOuter) => {
console.log("*One*");
resolveOuter(
new Promise((resolveInner) => {
console.log("*Two*");
setTimeout(() => resolveInner("*Three*"), 0);
})
);
});

const func1 = () => {
myPromise.then((res) => res).then((res2) => console.log(res2));
};

console.log("*Four*");



*One*
*Two*
*Four*

Q30:

پیاده سازی Promise.all


function promiseAll(promises) {
return new Promise((resolve, reject) => {
if (!Array.isArray(promises)) {
return reject(new TypeError('Input must be an array'));
}

const results = [];
let completed = 0;

if (promises.length === 0) {
return resolve([]);
}

promises.forEach((p, index) => {
Promise.resolve(p)
.then((value) => {
results[index] = value;
completed++;

if (completed === promises.length) {
resolve(results);
}
})
.catch((err) => reject(err));
});
});
}


Q31:

Debounce in JavaScript


function debounce(func, delay) {
let timer;

return function (...args) {
clearTimeout(timer);

timer = setTimeout(() => {
func.apply(this, args);
}, delay);
};
}


Q32:

Throttling in JavaScript


function throttle(func, delay) {
let lastCall = 0;

return function (...args) {
const now = Date.now();

if (now - lastCall >= delay) {
lastCall = now;
func.apply(this, args);
}
};
}


Q33:

DeepClone using recursion


function deepClone(obj, hash = new WeakMap()) {
if (Object(obj) !== obj) return obj; // primitives
if (obj instanceof Date) return new Date(obj);
if (obj instanceof RegExp) return new RegExp(obj);
if (hash.has(obj)) return hash.get(obj); // circular

const result = Array.isArray(obj) ? [] : {};
hash.set(obj, result);

for (const key in obj) {
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key], hash);
}
}
return result;
}


Q34:

Check if a string is a palindrome (ignoring cases and spaces).

function isPalindrome(str){
.....
}

use two-pointer to solve it


function isPalindrome(str) {
// Normalize the string: remove non-alphanumerics and make lowercase
const cleanStr = str.replace(/[^a-z0-9]/gi, '').toLowerCase();

let left = 0;
let right = cleanStr.length - 1;

while (left < right) {
if (cleanStr[left] !== cleanStr[right]) {
return false; // mismatch found
}
left++;
right--;
}
return true;
}


@danceswithcode

#interview #js
💡 اصول SOLID چیست؟ (به زبان ساده و با مثال‌های جاوااسکریپتی)

اصول SOLID پنج اصل کلیدی در طراحی شی‌ء‌گرا (Object-Oriented Design) هست که کمک می‌کنه کدت:

• قابل توسعه باشه (افزودن ویژگی جدید راحت باشه)
• قابل نگهداری باشه (تغییرات خراب نکنه)
• قابل تست باشه (نوشتن تست ساده‌تر بشه)
• و خواناتر و منظم‌تر باشه

این اصول توسط Robert C. Martin (Uncle Bob) معرفی شدند، و پایه‌ای برای نوشتن کد تمیز (Clean Code) هستند.

کلمه SOLID مخفف ۵ اصل زیره:

------------------------

🔹 1 — Single Responsibility Principle (SRP)

اصل مسئولیت یکتا

A class should have one, and only one, reason to change.

🔸 یعنی هر کلاس یا ماژول فقط یک وظیفه‌ی مشخص باید داشته باشه. اگر چند کار مختلف انجام بده، تغییر در یکی ممکنه کل کلاس رو خراب کنه.

مثال صحیح :


class User {
constructor(name, email) {
this.name = name;
this.email = email;
}
}

class UserRepository {
save(user) {
// save to database
}
}


------------------------

🔹 2 — Open/Closed Principle (OCP)

اصل باز برای توسعه، بسته برای تغییر

Software entities should be open for extension, but closed for modification.

🔸 یعنی باید بتونی بدون تغییر دادن کد قبلی، رفتار جدیدی بهش اضافه کنی (مثلاً با ارث‌بری یا ترکیب کلاس‌ها).

مثال صحیح :


class Discount {
calculate(price) {
return price;
}
}

class GoldDiscount extends Discount {
calculate(price) {
return price * 0.8;
}
}


------------------------

🔹 3 — Liskov Substitution Principle (LSP)

اصل جایگزینی لیسکوف

Subtypes must be substitutable for their base types without breaking the program.

🔸 یعنی کلاس فرزند باید بتونه بدون خراب کردن منطق برنامه، جای کلاس والد استفاده بشه.

مثال صحیح :


class Bird {
makeSound() {
console.log("chirp");
}
}

class Parrot extends Bird {}

function playSound(bird) {
bird.makeSound();
}

playSound(new Parrot()); // درست کار می‌کنه


مثال نادرست:


class Ostrich extends Bird {
fly() {
throw new Error("Can't fly");
}
}


------------------------

🔹 4 — Interface Segregation Principle (ISP)

اصل تفکیک واسط‌ها

Clients should not be forced to depend on interfaces they do not use.

🔸 یعنی به جای ساختن یک کلاس یا اینترفیس بزرگ، چند تای کوچکتر بساز که فقط نیازهای خاص رو پوشش بده.

مثال صحیح :


class Printer {
print() {}
}

class Scanner {
scan() {}
}

class AllInOneMachine {
constructor(printer, scanner) {
this.printer = printer;
this.scanner = scanner;
}
}


------------------------

🔹 5 — Dependency Inversion Principle (DIP)

اصل وارونگی وابستگی

High-level modules should not depend on low-level modules. Both should depend on abstractions.

🔸 یعنی کدهای سطح بالا نباید مستقیماً به جزئیات پیاده‌سازی وابسته باشن؛ باید به abstraction (مثل interface) وابسته باشن.

مثال صحیح :


class EmailService {
send(msg) {
console.log("Sending email:", msg);
}
}

class Notifier {
constructor(service) {
this.service = service;
}

notify(message) {
this.service.send(message);
}
}

const email = new EmailService();
const notifier = new Notifier(email);
notifier.notify("Hello!");


مطالب بیشتر در کانال رقصنده با کد:
https://t.iss.one/danceswithcode

#interview #solid @alithecodeguy
💡مفهوم Design Pattern چیه؟ (توضیح ساده با مثال‌های جاوااسکریپتی)

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

🎯 دسته‌بندی کلی:
1. Creational (ایجادکننده) → ساختن آبجکت‌ها به شکل درست
2. Structural (ساختاری) → ساختار و ارتباط بین کلاس‌ها و آبجکت‌ها
3. Behavioral (رفتاری) → نحوه تعامل و رفتار آبجکت‌ها با هم

-------------------------------------

1. Singleton Pattern

فقط یک نمونه (instance) از یک کلاس داشته باشیم

مثال:


const Singleton = (function () {
let instance;

function createInstance() {
return { id: Date.now() };
}

return {
getInstance() {
if (!instance) {
instance = createInstance();
}
return instance;
}
};
})();

const a = Singleton.getInstance();
const b = Singleton.getInstance();
console.log(a === b); // true


-------------------------------------

2. Factory Pattern

ساختن آبجکت بدون مشخص کردن کلاس دقیق

مثال:


function UserFactory(role) {
if (role === "admin") {
return { role: "admin", permissions: ["read", "write", "delete"] };
}
if (role === "user") {
return { role: "user", permissions: ["read"] };
}
}

const admin = UserFactory("admin");
const user = UserFactory("user");


-------------------------------------

3. Module Pattern

پنهان‌سازی دیتا با استفاده از Scope


const Counter = (function () {
let count = 0;

return {
increment() {
count++;
return count;
},
reset() {
count = 0;
}
};
})();

Counter.increment(); // 1
Counter.increment()


-------------------------------------

4. Observer Pattern

آبجکت‌ها می‌تونن به تغییرات یه آبجکت دیگه واکنش نشون بدن (مثل Event system)

مثال:


class Subject {
constructor() {
this.observers = [];
}

subscribe(fn) {
this.observers.push(fn);
}

notify(data) {
this.observers.forEach(fn => fn(data));
}
}

const news = new Subject();

news.subscribe((msg) => console.log("Listener 1:", msg));
news.subscribe((msg) => console.log("Listener 2:", msg));

news.notify("New Article Published!");


-------------------------------------

5. Strategy Pattern

تغییر رفتار با جایگزینی الگوریتم در زمان اجرا

مثال:


class PaymentProcessor {
constructor(strategy) {
this.strategy = strategy;
}

pay(amount) {
this.strategy.pay(amount);
}
}

class PayPal {
pay(amount) {
console.log("Paying with PayPal:", amount);
}
}

class Stripe {
pay(amount) {
console.log("Paying with Stripe:", amount);
}
}

const processor = new PaymentProcessor(new PayPal());
processor.pay(100); // Paying with PayPal: 100

processor.strategy = new Stripe();
processor.pay(200); // Paying with Stripe: 200


-------------------------------------

6. Decorator Pattern

اضافه‌کردن ویژگی به آبجکت، بدون تغییر ساختارش


function user(name) {
return { name };
}

function withEmail(user, email) {
return { ...user, email };
}

const ali = user("Ali");
const aliWithEmail = withEmail(ali, "[email protected]");


-------------------------------------

7. Proxy Pattern

کنترل دسترسی یا تغییر رفتار دسترسی به آبجکت

مثال:


const user = {
name: "Ali",
password: "1234"
};

const securedUser = new Proxy(user, {
get(target, prop) {
if (prop === "password") {
return "****"; // مخفی کردن پسورد
}
return target[prop];
}
});

console.log(securedUser.name); // Ali
console.log(securedUser.password); // ****


-------------------------------------

8. Command Pattern

اجرای دستورات با قابلیت undo/redo

مثال:


class Light {
on() {
console.log("Light ON");
}

off() {
console.log("Light OFF");
}
}

class Command {
constructor(action) {
this.action = action;
}

execute() {
this.action();
}
}

const light = new Light();
const turnOn = new Command(() => light.on());
const turnOff = new Command(() => light.off());

turnOn.execute();
turnOff.execute();


مطالب بیشتر در کانال رقصنده با کد:
https://t.iss.one/danceswithcode

#interview #designpattern @alithecodeguy
همه پارامترهای ممکن برای یک کوکی به زبان ساده

1. Name
نام کوکی رشته‌ای است که برای شناسایی کوکی استفاده می‌شود و نباید شامل کاراکترهای غیرمجاز مثل ; یا فاصله باشد، این مقدار صرفاً برچسب شناسایی است و رفتار خاصی ایجاد نمی‌کند.

2. Value
مقدار کوکی رشته‌ای است که داده اصلی را ذخیره می‌کند و اگر شامل کاراکترهای خاص باشد باید URL encoded شود، این مقدار همان چیزی است که سرور یا مرورگر در درخواست‌ها می‌خوانند یا تغییر می‌دهند.

3. Domain
دامنه کوکی تعیین می‌کند کوکی به کجا ارسال شود، اگر مقدار به صورت example. com باشد کوکی فقط به همین دامنه ارسال می‌شود و اگر به صورت .example .com باشد علاوه بر دامنه اصلی به همه زیردامنه‌ها هم ارسال خواهد شد، در صورت عدم تعیین فقط به دامنه فعلی ارسال می‌شود.

4. Path
مسیر کوکی مشخص می‌کند کوکی فقط برای همان مسیر و زیرمسیرهایش ارسال شود، به عنوان مثال اگر مقدار / باشد در تمام مسیرها ارسال می‌شود ولی اگر /account/ باشد فقط در آن مسیر و زیرمسیرهایش ارسال خواهد شد.

5. Expires
تاریخ انقضای کوکی زمان دقیق حذف آن را تعیین می‌کند و باید به فرمت GMT باشد، اگر این مقدار تنظیم شود کوکی تا آن تاریخ باقی می‌ماند و بعد از آن به طور خودکار حذف می‌شود و اگر تنظیم نشود کوکی به صورت session عمل کرده و با بستن مرورگر حذف خواهد شد.

6. Max-Age
مدت عمر کوکی به ثانیه مشخص می‌شود و اگر مقدار مثبت مثل 3600 باشد کوکی تا آن مدت باقی می‌ماند، اگر صفر یا منفی باشد بلافاصله حذف می‌شود و اگر این ویژگی همراه با Expires باشد مرورگر Max-Age را در اولویت قرار می‌دهد.

7. Secure
ویژگی Secure که نیازی به مقدار ندارد باعث می‌شود کوکی فقط روی اتصال HTTPS ارسال شود و در HTTP ساده هرگز فرستاده نشود.

8. HttpOnly
ویژگی HttpOnly که نیازی به مقدار ندارد باعث می‌شود کوکی از طریق JavaScript در مرورگر قابل دسترسی نباشد و تنها سرور بتواند آن را بخواند یا بنویسد، این کار برای جلوگیری از حملات XSS مفید است.

9. SameSite
ویژگی SameSite رفتار ارسال کوکی در درخواست‌های cross-site را تعیین می‌کند، مقدار Strict یعنی کوکی فقط وقتی ارسال می‌شود که درخواست از همان دامنه باشد، مقدار Lax یعنی کوکی در بیشتر درخواست‌ها ارسال می‌شود اما برخی درخواست‌های cross-site حساس مثل POST را محدود می‌کند و مقدار None یعنی کوکی در همه درخواست‌ها ارسال می‌شود ولی در این حالت Secure باید فعال باشد.

10. Priority
ویژگی Priority اهمیت کوکی را هنگام کمبود فضای ذخیره مرورگر تعیین می‌کند، مقدار Low یعنی کوکی کم‌اهمیت است و زودتر حذف می‌شود، مقدار Medium پیش‌فرض است و مقدار High یعنی کوکی مهم است و آخرین موردی خواهد بود که حذف می‌شود.

11. Partitioned
ویژگی Partitioned که نیازی به مقدار ندارد باعث می‌شود کوکی در یک فضای جداگانه ذخیره شود و بین سایت‌ها به اشتراک گذاشته نشود که این کار برای حفظ حریم خصوصی کاربر استفاده می‌شود.

12. Comment
ویژگی Comment که امروزه منسوخ شده یک متن ساده به عنوان توضیح کوکی ذخیره می‌کند و هیچ اثری روی نحوه ارسال یا رفتار کوکی ندارد و بیشتر برای مستندسازی داخلی کاربرد داشت.

13. Version
ویژگی Version نسخه پروتکل کوکی را تعیین می‌کند، مقدار 0 نشان‌دهنده نسخه قدیمی Netscape است و مقدار 1 نشان‌دهنده نسخه RFC 2965 می‌باشد که پشتیبانی محدودی دارد.

14. Extension Attributes
ویژگی Extension Attributes امکان تعریف کلید و مقدارهای سفارشی را می‌دهد و هر مقدار بسته به پیاده‌سازی معنای خاص خود را دارد، مثلاً می‌تواند برای قابلیت‌های امنیتی یا محدودیت‌های اختصاصی استفاده شود.

مطالب بیشتر در کانال رقصنده با کد:
https://t.iss.one/danceswithcode

#cookie #interview
تفاوت revert و reset در git

git revert
یک کامیت جدید ایجاد می‌کند که تغییرات کامیت مشخص‌شده را برعکس (undo) می‌کند

git revert abc123


git reset
شاخه (branch) را به یک نقطه قبلی در تاریخچه برمی‌گرداند. این یعنی تاریخچه بازنویسی می‌شود.

git reset --hard abc123


#git #interview
ویژگی satisfied در TypeScript از نسخه 4.9 معرفی شده و برای بررسی نوع در زمان کامپایل بدون تغییر نوع اصلی متغیر استفاده می‌شود.

کاربرد اصلی 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 زیاد).


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
تفاوت بین Promise.all و Promise.allSettled در جاوااسکریپت

--------

💡Promise.all

• همه‌ی پرامیس‌ها رو به صورت موازی اجرا می‌کنه.
• اگر حتی یکی از پرامیس‌ها reject بشه، کل Promise.all رد (reject) می‌شه.
• مقدار خروجی: آرایه‌ای از نتایج resolve شده (اگه همه موفق باشن).


const p1 = Promise.resolve(10);
const p2 = Promise.reject("Error");
const p3 = Promise.resolve(30);

Promise.all([p1, p2, p3])
.then(result => console.log(result))
.catch(error => console.log("Rejected:", error));
// خروجی: Rejected: Error


• فقط اولین خطا رو برمی‌گردونه، بقیه رو نادیده می‌گیره.

--------

💡Promise.allSettled

• همه‌ی پرامیس‌ها رو به صورت موازی اجرا می‌کنه.
• منتظر می‌مونه تا همه settle بشن (چه resolve چه reject).
• هیچ‌وقت reject نمی‌شه. همیشه resolve می‌شه با آرایه‌ای از نتایج.
• هر نتیجه یک آبجکت با این شکل:

{ status: "fulfilled", value: ... } یا
{ status: "rejected", reason: ... }


const p1 = Promise.resolve(10);
const p2 = Promise.reject("Error");
const p3 = Promise.resolve(30);

Promise.allSettled([p1, p2, p3])
.then(results => console.log(results));
/*
[
{ status: "fulfilled", value: 10 },
{ status: "rejected", reason: "Error" },
{ status: "fulfilled", value: 30 }
]
*/


هیچ خطایی throw نمی‌کنه، چون همه رو گزارش می‌ده.

#js #interview
تفاوت unknown و any در TypeScript

--------------

💡 any

• وقتی از any استفاده می‌کنی، TypeScript همه‌ی چک‌های تایپ را غیرفعال می‌کند.
• هر کاری می‌تونی با اون مقدار انجام بدی بدون خطا:


let x: any = "Hello";

x.toUpperCase(); // بدون خطا
x.push(123); // حتی اگه string باشه


• مشکل: Type safety از بین می‌ره. عملاً مثل جاوااسکریپت عادی می‌شه.

--------------

💡 unknown

• شبیه any هست از نظر اینکه می‌تونی هر مقداری بهش اختصاص بدی.
• اما برعکس any، نمی‌تونی مستقیماً باهاش عملیات انجام بدی مگر اینکه اول تایپش رو چک کنی (type narrowing).


let y: unknown = "Hello";

y.toUpperCase(); // خطا


• باید قبلش بررسی کنی:


if (typeof y === "string") {
console.log(y.toUpperCase()); // حالا مجازه
}


#ts #interview
با هشتگ #interview می‌تونید به تمام سولات مصاحبه‌ای که توی این چند سال بهشون برخوردم ، دسترسی داشته باشید.
عاشق این سبک سوالاتم که دانش واقعی رو میسنجه.

مصاحبه کننده اگر خودش اینکاره باشه ، یه سوالی که ممکنه بپرسه اینه که میگه : میدونیم تیلویند کلی class name اضافه میکنه به المان‌ها و چون DOM رو بزرگ می‌کنه پس performance کم میشه. چطوری می‌تونیم از این قضیه جلوگیری کنیم؟

این سوال از ریشه غلطه. چون DOM رو اصلا بزرگ نمی‌کنه و تاثیری که میذاره بسیار ناچیزه. فقط خوندن سورس دام رو سخت می‌کنه. دلیلش هم به خاطر مفهوم بنیادینی توی render engine هست به اسم :

Critical rendering path

و به خاطر DOM و CCSOM و BOM این مشکل ذاتا پیش نمیاد.

چه موقع ممکنه این مشکل پیش بیاد؟ وقتی برای هر المان صدها utility class جدید و یونیک بسازید که در عمل هیچ وقت به اون نقطه نباید برسید و اگر روزی اونجا بودید ، برگردید ببینید کجای مسیر رو اشتباه رفتید.

@danceswithcode

#interview
انجین React Fiber چیه؟

فایبر همون موتور جدید رندر در React هست که از نسخه ۱۶ به بعد ساخته شد. کارش اینه که وقتی state یا props تغییر می‌کنه، تصمیم بگیره کدوم بخش‌های UI دوباره آپدیت بشن و چطوری این کار رو انجام بده.
قبل از Fiber، ریکت از یک الگوریتم ساده‌تر استفاده می‌کرد که بهش Stack Reconciler می‌گفتن. مشکل اون این بود که آپدیت‌های سنگین رو نمی‌شد به‌صورت قابل‌مدیریت اجرا کرد، و UI می‌تونست قفل بشه.

مشکل قبل از Fiber :

قبلا React آپدیت‌ها رو یکجا و پشت سر هم انجام می‌داد.
اگه درخت کامپوننت خیلی بزرگ بود (مثلاً جدول یا لیست سنگین)، مرورگر برای مدتی قفل می‌شد و کاربر نمی‌تونست راحت تایپ یا کلیک کنه.

ایده‌ی Fiber :

فایبر این مشکل رو حل کرد با سه کار مهم:
1. تقسیم کار: آپدیت‌ها رو به تکه‌های کوچیک تقسیم می‌کنه.
2. توقف و ادامه: وسط کار می‌تونه آپدیت رو متوقف کنه و بعداً ادامه بده.
3. اولویت‌بندی: کارهای فوری مثل تایپ یا کلیک کاربر رو جلوتر از کارهای سنگین اجرا می‌کنه.

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

• هر کامپوننت در React یک Fiber Node داره (مثل یک آبجکت ساده).
• این node اطلاعات کامپوننت (props, state, type) رو نگه می‌داره.
• ریکت با استفاده از این nodeها تصمیم می‌گیره کدوم قسمت‌ها تغییر کرده و باید دوباره رندر بشه.

نتیجه :

• رابط کاربری خیلی روان‌تر میشه.
• حتی وقتی آپدیت‌های بزرگ داری، کاربر حس لگ یا قفل شدن نمی‌کنه.
• این ساختار زمینه‌ساز قابلیت‌های جدید مثل Concurrent Rendering و Suspens هم هست.

#interview #react

https://t.iss.one/danceswithcode
انواع APIها:

Rest
SOAP
gRPC
GraphQl
webRTC
Webhooks
WebSocket

این ویدیو دید خوبی بهتون میده:
https://www.youtube.com/watch?v=pBASqUbZgkY

#api #web #interview
به عنوان یه پیشنهاد:

سی اس اس سلکتورها رو خوب بلد باشید.

خوندنش شاید بیشتر از نیم ساعت زمان نبره ولی توی نقاط حساسی از مصاحبه‌ها نجاتتون میده

#interview #tips
Amazon interview question

#js #interview