Пройти по значению или пройти по ссылке? JavaScript
В JavaScript у нас есть функции, и у нас есть аргументы, которые мы передаем этим функциям. Но как JavaScript обрабатывает то, что вы проходите, не всегда ясно. Нет никакой «передачи по ссылке» для любой переменной в JavaScript. Все переменные и аргументы назначаются значением, но для объектов значение переменной является ссылкой. Из-за этого, когда вы передаете объект и меняете его члены, эти изменения сохраняются вне функции. Это заставляет его выглядеть как ссылка. Итак, примитивные значения типа number, string, boolean передаются по значению, тогда как объекты и массивы передаются по ссылке, как указано выше.
С примитивными типами данных
В случае с примитивными типами данных, если вы измените значение примитивного типа данных внутри функции, это изменение не повлияет на переменную во внешней области. Это означает, что любые изменения этой переменной в функции полностью отделены от всего, что происходит вне функции. Давайте посмотрим на следующий пример:
var toDay = "Sunday"; function changeDay(tmpDay){ tmpDay = "Monday"; } alert(toDay); // "Воскресенье" changeDay(toDay); alert(toDay); // "Воскресенье"
В приведенном выше примере мы меняем переменную «toDay» внутри функции changeDay и отображаем ее после вызова функции, она по-прежнему имеет значение «воскресенье». Это происходит потому, что когда примитивные типы передаются по значению. Это означает, что любые изменения этой переменной в функции полностью отделены от всего, что происходит вне функции. Это то, что имеется в виду, когда мы говорим, что мы передаем значение в JavaScript.
С объектами
В случае объектов, если вы измените значение свойства Object внутри функции, это изменение повлияет на переменную во внешней области. Все переменные и аргументы передаются по значению, но для объектов значение переменной является ссылкой. Передача по ссылке включает в себя наличие двух ссылок на один и тот же объект в памяти. Это означает, что вы можете мутировать и объектировать или функционировать, назначая его другому объекту или передавая его как параметр функции. Давайте посмотрим на следующий пример:
var thisWeek = { toDay: "Sunday" }; function changeDay(tmpWeek){ tmpWeek.toDay = "Monday"; } alert(thisWeek.toDay); //Воскресенье changeDay(thisWeek); alert(thisWeek.toDay); //Понедельник
В приведенном выше примере мы меняем переменную «toDay» внутри функции changeDay и отображаем ее после вызова функции, значение toDay изменяется на «понедельник». Это связано с тем, что, когда вы передаете объект в функцию, вы не передаете копию. Вы передаете ссылку, указывающую на объект thisWeek. Поэтому, когда вы изменяете свойство этого объекта в функции, вы изменяете свойство объекта во внешней области.
Понимание разницы между передачей по значению и переходом по ссылке является ключом к пониманию того, как работают объекты JavaScript и примитивы.