HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>Переменные (и константы) в JavaScript могут хранить два вида данных: примитивные и ссылочные. К примитивным относятся все примитивные типы: числа, строки, булеан и так далее. К ссылочным - объекты. Объекты, в общем смысле, изучаются только в следующем курсе, но массив внутри - это тоже объект:</p>
1 <p>Переменные (и константы) в JavaScript могут хранить два вида данных: примитивные и ссылочные. К примитивным относятся все примитивные типы: числа, строки, булеан и так далее. К ссылочным - объекты. Объекты, в общем смысле, изучаются только в следующем курсе, но массив внутри - это тоже объект:</p>
2 <p>В чем разница между ссылочными и примитивными типами данных и почему об этом нужно знать?</p>
2 <p>В чем разница между ссылочными и примитивными типами данных и почему об этом нужно знать?</p>
3 <p>С точки зрения прикладного программиста, разница проявляется при изменении данных, их передаче и возврате из функций. Мы уже знаем, что массив можно менять, даже если он записан в константу. Здесь как раз и проявляется ссылочная природа. Константа хранит ссылку на массив, а не сам массив, и эта ссылка не меняется. А вот массив поменяться может. С примитивными типами такой трюк не пройдет.</p>
3 <p>С точки зрения прикладного программиста, разница проявляется при изменении данных, их передаче и возврате из функций. Мы уже знаем, что массив можно менять, даже если он записан в константу. Здесь как раз и проявляется ссылочная природа. Константа хранит ссылку на массив, а не сам массив, и эта ссылка не меняется. А вот массив поменяться может. С примитивными типами такой трюк не пройдет.</p>
4 <p>Другой способ убедиться в том, что массивы являются ссылками - создать несколько констант, содержащих один массив, и посмотреть, как они меняются:</p>
4 <p>Другой способ убедиться в том, что массивы являются ссылками - создать несколько констант, содержащих один массив, и посмотреть, как они меняются:</p>
5 <p>Сравнение массивов тоже происходит по ссылке. Это может быть очень неожиданно с непривычки. Одинаковые по структуре массивы имеют разные ссылки и не равны друг другу:</p>
5 <p>Сравнение массивов тоже происходит по ссылке. Это может быть очень неожиданно с непривычки. Одинаковые по структуре массивы имеют разные ссылки и не равны друг другу:</p>
6 <p>Более того, если передать массив в какую-то функцию, которая его изменяет, то массив тоже изменится. Ведь в функцию передается именно ссылка на массив. Посмотрите на примеры:</p>
6 <p>Более того, если передать массив в какую-то функцию, которая его изменяет, то массив тоже изменится. Ведь в функцию передается именно ссылка на массив. Посмотрите на примеры:</p>
7 <h2>Проектирование функций</h2>
7 <h2>Проектирование функций</h2>
8 <p>Проектируя функции, работающие с массивами, есть два пути: менять исходный массив или формировать внутри новый и возвращать его наружу. Какой лучше? В подавляющем большинстве стоит предпочитать второй. Это безопасно. Функции, возвращающие новые значения, удобнее в работе, а поведение программы становится в целом более предсказуемым, так как отсутствуют неконтролируемые изменения данных.</p>
8 <p>Проектируя функции, работающие с массивами, есть два пути: менять исходный массив или формировать внутри новый и возвращать его наружу. Какой лучше? В подавляющем большинстве стоит предпочитать второй. Это безопасно. Функции, возвращающие новые значения, удобнее в работе, а поведение программы становится в целом более предсказуемым, так как отсутствуют неконтролируемые изменения данных.</p>
9 <p>Изменение массива может повлечь за собой неожиданные эффекты. Представьте себе функцию last(), которая извлекает последний элемент из массива. Она могла бы быть написана так:</p>
9 <p>Изменение массива может повлечь за собой неожиданные эффекты. Представьте себе функцию last(), которая извлекает последний элемент из массива. Она могла бы быть написана так:</p>
10 <p>Где-то в коде, вы просто хотели посмотреть последний элемент. А в дополнение к этому, функция для извлечения этого элемента, взяла и удалила его оттуда. Это поведение очень неожиданно для подобной функции. Оно противоречит большому количеству принципов построения хорошего кода (например cqs, этот принцип рассматривается в курсе по функциям). Правильная реализация данной функции выглядит так:</p>
10 <p>Где-то в коде, вы просто хотели посмотреть последний элемент. А в дополнение к этому, функция для извлечения этого элемента, взяла и удалила его оттуда. Это поведение очень неожиданно для подобной функции. Оно противоречит большому количеству принципов построения хорошего кода (например cqs, этот принцип рассматривается в курсе по функциям). Правильная реализация данной функции выглядит так:</p>
11 <p>В каких же случаях стоит менять сам массив? Есть ровно одна причина, по которой так делают - производительность. Именно поэтому некоторые встроенные методы массивов меняют их, например reverse() или sort():</p>
11 <p>В каких же случаях стоит менять сам массив? Есть ровно одна причина, по которой так делают - производительность. Именно поэтому некоторые встроенные методы массивов меняют их, например reverse() или sort():</p>
12 <p>Обычно в документации каждой функции отдельно подчеркивают, изменяет ли она исходный массив или возвращает результатом новый массив, не модифицируя исходный. Например, метод<a>concat()</a>, в отличие от sort(), возвращает новый массив, о чем написано в документации.</p>
12 <p>Обычно в документации каждой функции отдельно подчеркивают, изменяет ли она исходный массив или возвращает результатом новый массив, не модифицируя исходный. Например, метод<a>concat()</a>, в отличие от sort(), возвращает новый массив, о чем написано в документации.</p>
13 <p>Несмотря на то, что подход, меняющий массивы напрямую, сложнее в отладке, его используют в некоторых языках для увеличения эффективности работы. Если массив достаточно большой, то полное копирование окажется дорогой операцией. В реальной жизни (веб-разработчика) это почти никогда не является проблемой, но знать об этом полезно.</p>
13 <p>Несмотря на то, что подход, меняющий массивы напрямую, сложнее в отладке, его используют в некоторых языках для увеличения эффективности работы. Если массив достаточно большой, то полное копирование окажется дорогой операцией. В реальной жизни (веб-разработчика) это почти никогда не является проблемой, но знать об этом полезно.</p>