Warning: mkdir(): No space left on device in /var/www/hottg/post.php on line 59

Warning: file_put_contents(aCache/aDaily/2025-07-15/post/easy_javascript_ru/--): Failed to open stream: No such file or directory in /var/www/hottg/post.php on line 72
πŸ€” КакиС особСнности слСТСния Π·Π° "Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΌΠΈ" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ? @Frontend | Вопросы собСсов
TG Telegram Group & Channel
Frontend | Вопросы собСсов | United States America (US)
Create: Update:

πŸ€” КакиС особСнности слСТСния Π·Π° "Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΌΠΈ" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ?

Когда ΠΌΡ‹ отслСТиваСм измСнСния Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² React, Vue ΠΈΠ»ΠΈ MobX), Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ JavaScript Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ автоматичСски ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ свойствами. Π­Ρ‚ΠΎ называСтся Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ слСТСниС (deep watching).

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: повСрхностноС слСТСниС (`shallow watching`)

JavaScript сравниваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° Π½Π΅ ΠΈΡ… содСрТимоС.

const obj = { user: { name: "Иван" } };
const copy = obj;

copy.user.name = "ΠŸΠ΅Ρ‚Ρ€";
console.log(obj.user.name); // "ΠŸΠ΅Ρ‚Ρ€" (ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅)


πŸš©Π“Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ vs повСрхностноС

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Object.assign() ΠΈΠ»ΠΈ spread-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ({ ...obj }) Π΄Π΅Π»Π°ΡŽΡ‚ повСрхностноС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:
const obj = { user: { name: "Иван" } };
const shallowCopy = { ...obj };

shallowCopy.user.name = "ΠŸΠ΅Ρ‚Ρ€";
console.log(obj.user.name); // "ΠŸΠ΅Ρ‚Ρ€" 😱 (измСнился ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»!)


Для Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ копирования ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ structuredClone() ΠΈΠ»ΠΈ JSON.parse(JSON.stringify(obj)):
const deepCopy = structuredClone(obj);
deepCopy.user.name = "ΠŸΠ΅Ρ‚Ρ€";

console.log(obj.user.name); // "Иван" βœ… (ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» Π½Π΅ измСнился)


🚩Как ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ?

🟠React: слСдим Ρ‡Π΅Ρ€Π΅Π· `useState` ΠΈ `useEffect`
Π’ React состояниС обновляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ссылки (shallow compare).
const [user, setUser] = useState({ name: "Иван" });

useEffect(() => {
console.log("Имя измСнилось:", user.name);
}, [user]); // Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли user β€” Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚!

// НЕ сработаСт:
user.name = "ΠŸΠ΅Ρ‚Ρ€"; // user остался Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ


РСшСниС – ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ:
setUser(prev => ({ ...prev, name: "ΠŸΠ΅Ρ‚Ρ€" }));


🟠Vue: `watch` vs `watchEffect` (Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ слСТСниС)

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ watch слСдит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ
watch(user, (newValue) => {
console.log("ИзмСнСно:", newValue);
});


Π“Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ слСТСниС (deep: true)
watch(user, (newValue) => {
console.log("ИзмСнСно:", newValue);
}, { deep: true });


Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ

πŸ€” КакиС особСнности слСТСния Π·Π° "Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΌΠΈ" ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ?

Когда ΠΌΡ‹ отслСТиваСм измСнСния Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°Ρ… (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² React, Vue ΠΈΠ»ΠΈ MobX), Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ JavaScript Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ автоматичСски ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ свойствами. Π­Ρ‚ΠΎ называСтся Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ слСТСниС (deep watching).

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: повСрхностноС слСТСниС (`shallow watching`)

JavaScript сравниваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ссылки Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, Π° Π½Π΅ ΠΈΡ… содСрТимоС.
const obj = { user: { name: "Иван" } };
const copy = obj;

copy.user.name = "ΠŸΠ΅Ρ‚Ρ€";
console.log(obj.user.name); // "ΠŸΠ΅Ρ‚Ρ€" (ΠΎΠ±Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅)


πŸš©Π“Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ vs повСрхностноС

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ Object.assign() ΠΈΠ»ΠΈ spread-ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ({ ...obj }) Π΄Π΅Π»Π°ΡŽΡ‚ повСрхностноС ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅:
const obj = { user: { name: "Иван" } };
const shallowCopy = { ...obj };

shallowCopy.user.name = "ΠŸΠ΅Ρ‚Ρ€";
console.log(obj.user.name); // "ΠŸΠ΅Ρ‚Ρ€" 😱 (измСнился ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»!)


Для Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ³ΠΎ копирования ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ structuredClone() ΠΈΠ»ΠΈ JSON.parse(JSON.stringify(obj)):
const deepCopy = structuredClone(obj);
deepCopy.user.name = "ΠŸΠ΅Ρ‚Ρ€";

console.log(obj.user.name); // "Иван" βœ… (ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π» Π½Π΅ измСнился)


🚩Как ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Π³Π»ΡƒΠ±ΠΎΠΊΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ?

🟠React: слСдим Ρ‡Π΅Ρ€Π΅Π· `useState` ΠΈ `useEffect`
Π’ React состояниС обновляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ссылки (shallow compare).
const [user, setUser] = useState({ name: "Иван" });

useEffect(() => {
console.log("Имя измСнилось:", user.name);
}, [user]); // Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ссли user β€” Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚!

// НЕ сработаСт:
user.name = "ΠŸΠ΅Ρ‚Ρ€"; // user остался Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ


РСшСниС – ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ:
setUser(prev => ({ ...prev, name: "ΠŸΠ΅Ρ‚Ρ€" }));


🟠Vue: `watch` vs `watchEffect` (Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ слСТСниС)

ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ watch слСдит Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ Π²Π»ΠΎΠΆΠ΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ
watch(user, (newValue) => {
console.log("ИзмСнСно:", newValue);
});


Π“Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ слСТСниС (deep: true)
watch(user, (newValue) => {
console.log("ИзмСнСно:", newValue);
}, { deep: true });


Π‘Ρ‚Π°Π²ΡŒ πŸ‘ ΠΈ Π·Π°Π±ΠΈΡ€Π°ΠΉ πŸ“š Π‘Π°Π·Ρƒ Π·Π½Π°Π½ΠΈΠΉ
Please open Telegram to view this post
VIEW IN TELEGRAM
πŸ‘10πŸ’Š1


>>Click here to continue<<

Frontend | Вопросы собСсов




Share with your best friend
VIEW MORE

United States America Popular Telegram Group (US)


Warning: Undefined array key 3 in /var/www/hottg/function.php on line 115

Fatal error: Uncaught mysqli_sql_exception: Can't create/write to file '/tmp/#sql-temptable-a06e-3f0908-7c1.MAI' (Errcode: 28 "No space left on device") in /var/www/hottg/function.php:216 Stack trace: #0 /var/www/hottg/function.php(216): mysqli_query() #1 /var/www/hottg/function.php(115): select() #2 /var/www/hottg/post.php(351): daCache() #3 /var/www/hottg/route.php(63): include_once('...') #4 {main} thrown in /var/www/hottg/function.php on line 216