Фрагменты для проверки ваших знаний Javascript

В этой статье мы увидим некоторые из самых известных фрагментов кода интервью, которые просят проверить ваши знания о концепциях Javascript.

Давайте начнем

Предсказать вывод приведенного ниже кода

const user = {
  name: 'Raj',
  location: {
    city: 'NY',
    state: 'NY'
  }
};
const copy = Object.assign({}, user);
// OR
// const copy = { ...user };
copy.location.city = 'Albany';
console.log('original: ', user.location);
console.log('copy:', copy.location);

Результатом приведенного выше кода является

original:  {
  city: 'Albany',
  state: 'NY'
}
copy: {
  city: 'Albany',
  state: 'NY'
}

Причина изменения исходного объекта заключается в том, что когда мы используем Object.assign или spread operator,, он делает только shallow copy, что означает, что при создании копии объекта копируются свойства только первого уровня, а если есть вложенные свойства, то копируется только их ссылка Это означает, что скопированная ссылка по-прежнему относится к исходному месту, где хранится объект.

Таким образом, в нашем случае свойство location по-прежнему будет относиться к исходному объекту, который в нашем случае является объектом user.

Чтобы лучше понять это, прочтите мою предыдущую статью ЗДЕСЬ.

var number = 10;
var display = function () {
  console.log(number);
  var number = 20;
};
display();

Результатом приведенного выше кода будет не 10, а undefined.

Почему?

Это из-за hoisting в Javascript.

Таким образом, приведенный выше код будет преобразован в приведенный ниже код

var number = 10;
var display = function () {
  var number;
  console.log(number);
  number = 20;
};
display();

Как вы можете видеть, только declaration перемещается в начало функции, а value не поднимается, поэтому console.log печатает undefined, потому что number не имеет значения, назначенного внутри функции перед оператором console.log.

const number = 1;
const result = (function () {
  delete number;
  return number;
})();
console.log(result);

Этот код не выдаст никакой ошибки, потому что мы используем delete для number, но он напечатает значение 1 в качестве вывода.

Этот синтаксис прямого вызова функции известен как IIFE (выражение немедленного вызова функции).

Оператор delete используется для удаления свойства объекта. Здесь number не объект, а примитивный тип, поэтому он не выдаст ошибку, но функция вернет исходное значение переменной, равной 1, которая находится в области действия оператора console.log.

const number = 1;
const result = (function (number) {
  delete number;
  return number;
})(10);
console.log(result);

Результатом приведенного выше кода является 10

В этом коде мы передаем значение 10 в качестве входных данных функции. Но опять же, внутри функции number находится просто переменная локального примитивного типа, поэтому delete не будет вносить никаких изменений в число, а значение 10, переданное в функцию, будет возвращено из функции.

function display() {
  var a = b = 10;
}
display();
console.log('b', typeof b === 'undefined');
console.log('a', typeof a === 'undefined');

Результатом приведенного выше кода является

b false
a true

Это связано с тем, что оператор присваивания имеет right to left associativity в Javascript, что означает, что он будет оцениваться справа налево, поэтому сначала b будет присвоено значение 10, а затем ему будет присвоено значение a. Следовательно

function display() {
  var a = b = 10;
}

такой же как

function display() {
  var a = (b = 10);
}

что то же самое как

function display() {
 b = 10; 
 var a = b;
}

Таким образом, b становится глобальной переменной, потому что перед ним нет ключевого слова var, а a становится локальной переменной. Следовательно, вне функции доступно только b, поэтому typeof a === 'undefined' идет как true, а typeof b === 'undefined' - как false.

Если мы выполним приведенный выше код в strict mode, как показано ниже,

'use strict';
function display() {
  var a = b = 10;
}
display();
console.log('b', typeof b === 'undefined');
console.log('a', typeof a === 'undefined');

Это вызовет ошибку, потому что b становится глобальной переменной, а strict mode не позволяет создавать глобальные переменные, поэтому вы получите сообщение об ошибке при выполнении этого кода.

На сегодня все. Надеюсь, вы узнали что-то новое.

Не забудьте подписаться, чтобы получать мою еженедельную рассылку с замечательными советами, приемами и статьями прямо в свой почтовый ящик здесь.