Рубрики
Без рубрики

Примитивы против объектов в JavaScript: Позвонить, поделившись

Ранее в этой серии мы обсуждали, как ведут себя примитивы и объекты, когда мы пытаемся мутировать или … Tagged with JavaScript, WebDev, новички, программирование.

Ранее в этой серии мы обсуждали, как ведут себя примитивы и объекты, когда мы пытаемся их мутировать или копировать. Теперь в последней статье в этой серии мы увидим, как они ведут себя, когда мы передаем их функциям.

Первая статья мы говорили о измененности, которая меняет свойства чего -либо, не меняя ее в целом И мы сказали, что объекты изменяются, а примитивы нет, вот быстрый пример, чтобы продемонстрировать то, что я только что сказал

Вторая статья была посвящена копированию, когда вы копируете примитив, вы копируете его значение, но когда вы копируете объект, вы копируете его ссылку (его адрес в памяти), вот еще один быстрый пример:

Переход к тому, чтобы поговорить о том, как ведут себя как примитивы, так и объекты, когда мы передаем их функциям в качестве аргументов, но во -первых, давайте поговорим о функциях.

Начиная с действительно типичной функции, функция Добавить Теперь давайте пройдемся по этому коду, чтобы увидеть, как запускается JavaScript. Две основные вещи, которые делает двигатель JavaScript, – это хранение материала и выполнение заказов, давайте посмотрим на это в действии. Двигатель JavaScript считывает код сверху вниз, поэтому в нашем примере здесь первое, что он видит, это следующее:

function add(x , y){
  return x + y;
}

Это называется Объявление функции , когда двигатель видит Объявление функции. Он сохраняет весь свой код внутри Глобальная память и он не выполняет ни одного из вещей внутри функции, потому что функция не была вызвана пока (помните Мы говорим о первых 3 строках)

Переход к строке 4 и 5, в которых переменные num_1 и num_2 соответственно также хранятся в глобальной памяти

Заметки:

  • На картинке над буквой f короткий для кода функции
  • num_1 и num_2 хранятся в демонстрации, что двигатель также сохраняет переменные, а не функции Только

Контекст исполнения

Прямо сейчас мы ничего не сделали, кроме как хранить вещи в глобальной памяти, достигнув линии добавить (2,6) функция Добавить начинает выполнять. Когда вызывается функция, создается контекст выполнения, а контекст выполнения – это место, в котором хранится информация о функции. Он хранит такие вещи, как локальные переменные функции, на какой линии программа сейчас. Итак, как вы видите на следующем изображении функция Добавить имеет две локальные переменные x и у и они хранят номера, которые мы предоставили, когда вызываем функцию В настоящее время мы находимся внутри корпуса функции, которая является линией вернуть x+y; Программа рассчитывает значение x + y который 2 + 6 В этом случае, и это равно 8 Анкет Затем функция возвращает это значение (8), и как только мы вернемся, контекст выполнения функции исчезает, она исчезает И если мы снова назвали функцию, будет создан новый контекст выполнения, и это правило: Для каждой функции вызов создается новый контекст выполнения, и как только мы нажмеем оператор возврата Этот контекст исполнения исчезает

Примечание: Вещи, хранящиеся в глобальной памяти, доступны везде в нашей программе. С другой стороны, локальные переменные доступны только внутри функции

И это все для функций в этой статье, есть еще одна вещь о функциях за кулисами, которые являются стеком вызовов Если вы хотите узнать об этом, посмотрите это видео или читать эта статья

Рассмотрим следующий пример Вопрос: будут ли значения x и Язык сдача ? Посмотрим, что нам скажет консоль

Как вы можете видеть, ничего не изменилось, потому что когда мы передаем примитив к функции, мы передаем копия его значения так численность и str иметь те же значения, что и x и язык Но это разные переменные.

Важно отметить, что значения num и str изменяются, и мы видим, что если мы положим Консоль.log внутри функции

Когда вы передаете примитиву функции, его значение копируется в аргумент функции, поэтому примитив и аргумент имеет одинаковое значение, но они две разные переменные, вот что называется звонок по значению Анкет

Помните, что объекты хранятся с помощью ссылки, который является адресом памяти объекта, поэтому, когда вы говорите Пусть obj = {}; Вы храните адрес {} Внутри obj Анкет

Теперь посмотрим, что произойдет, когда мы передаем объект функции Вы ожидаете obj изменить или остаться прежним? Ну, есть только один способ узнать Как сказала наша консоль, obj действительно меняется. Но что, если мы попробовали следующее:

В этом случае ничего не изменится, и вот вывод для демонстрации что

почему это ?

Когда вы передаете объект функции, вы передаете копию ссылки, и вы можете использовать эту копию для доступа и изменения объекта Но вы не можете изменить ссылку, используя функцию

Если вы передаете объект функции, вы можете мутат объект внутри функции Но ты не можешь * переназнайте * Это. Это называется Call, обмениваясь, многие люди говорят, что объекты называются ссылкой, которая не правила, потому что вызов по ссылке означает передачу самой ссылки, и, следовательно, вы можете оба мутировать и переназначить объект, используя функцию, и это не так в JavaScript. Мы передаем копию ссылки, а не саму ссылку, Это как примитивы, когда мы передаем копию значения, а не само значение.

Надеюсь, это имеет смысл для вас, вы можете прочитать о Call, поделившись, используя следующие ссылки:

И это все для этой статьи и всей серии, надеюсь, вы, ребята, наслаждались сериалом!

Оригинал: “https://dev.to/anwarr_________/primitives-vs-objects-in-javascript-function-arguments-2d0g”