5 хибних уявлень про JS, від яких може боліти голова
Було у вас таке, що ви ніяк не можете зрозуміти, звідки взявся той 0 в розмітці? Чи перебираєте ключі обʼєкта, а воно видає вам ще якісь ліві значення? Тупий JS? Чи усе-таки ви стали жертвою хибних уявлень про JS, які часто призводять до дрібних, але противних багів? Давайте глянемо до дрібниць, які ми усі забуваємо по різному, але страждаємо ми від того однаково:
a && b() це те саме, що й if (a) b()
З цим ви точно стикались — a && b()
часто використовують
як скорочену форму if (a) b()
через подібність результату
в більшості випадків.
Однак вони працюють по-різному. Логічний оператор &&
перевіряє операнди зліва направо та виконує наступний операнд лише тоді,
коли попередній є truthy.
Він зупиняється при першому falsy значенні, повертаючи його, або, якщо всі операнди truthy, повертає значення останнього операнду.
Object.assign створює повну копію обʼєкта
Object.assign створює поверхневу копію (shallow copy), тобто копіює лише верхній рівень властивостей об’єкта.
Якщо об’єкт містить вкладені об’єкти або масиви, вони копіюються за посиланням, а не створюються заново.
Коли ж вкладених структур немає, результат дійсно буде схожий на повну копію.
for...in перебирає тільки власні властивості обʼєкта
Цикл for...in
перебирає усі перелічувані (enumerable) властивості, включаючи успадковані від прототипу.
Якщо об’єкт має властивості в прототипному ланцюжку, вони також будуть перебрані.
Якщо потрібно перебрати тільки власні властивості, необхідно використовувати методи, такі
як Object.hasOwnProperty()
або Object.keys()
[].length завжди показує кількість елементів у масиві
Насправді властивість length
показує найбільший індекс + 1,
але не обов’язково фактичну кількість елементів у масиві.
Якщо масив містить «дірки» (порожні елементи), вони
не враховуються
як реальні елементи.
Також значення length
можна змінити вручну, що може призвести до втрати елементів або створення «дір».
console.log виводить «зліпок» обʼєкта на момент виклику
console.log виводить посилання на об’єкт, а не його поточний стан на момент виклику.
Якщо об’єкт змінюється після виклику console.log,
в консолі буде відображено оновлені значення при розгортанні.
Щоб отримати «зліпок» (фіксовану копію об’єкта), потрібно серіалізувати його, наприклад, за допомогою JSON.stringify
.
***
Дякую за увагу! Сподіваюсь, що вдалося нагадати вам про такі дрібні нюанси, через які можна витратити кілька годин на пошук бага, а тепер ви не будете витрачати кілька годин на пошук бага )
Гарного вам усім дня!
P.S. Автор дуже недоброзичливо ставиться до коментарів російською мовою.
39 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів