Привет! Добро пожаловать обратно в очередную статью о вопросах на собеседовании. Сегодня мы имеем дело с 10 сложными вопросами по Javacript.

1. Что вернет typeof NaN и почему?

typeof NaN вернет число. Это сложно и несколько нелогично, поскольку NaN означает «Не число». Однако в Javascript NaN считается специальным числом и поэтому его типом является number.

2. Можете ли вы объяснить замыкания на примере?

Замыкание — это функция, которая имеет доступ к своей собственной области видимости, области внешней функции и глобальной области видимости. Это часто сбивает с толку людей, плохо знакомых с JavaScript, поскольку в этом отношении он ведет себя иначе, чем другие языки программирования.

function outer() {
  let outerVar = "I am from outer function!";
  
  function inner() {
    let innerVar = "I am from inner function!";
    console.log(outerVar);  // I can access outerVar!
    console.log(innerVar);  // I can access innerVar!
  }
  
  return inner;
}

const myClosure = outer();
myClosure();  // Outputs: "I am from outer function!" and "I am from inner function!"

Здесь inner() — это замыкание, охватывающее собственную область действия, область действия outer() и глобальную область видимости.

3. Что делает метод .bind()?

Метод .bind() создает новую функцию, при вызове которой для ключевого слова this устанавливается указанное значение, с заданной последовательностью аргументов, предшествующей любому предоставленному при вызывается новая функция. Это сложно, поскольку необходимо понять, как работает ключевое слово this и как его можно явно задать.

const obj = {
  x: 42,
  getX: function() {
    return this.x;
  }
};

const unboundGetX = obj.getX;
console.log(unboundGetX());  // Output: undefined

const boundGetX = unboundGetX.bind(obj);
console.log(boundGetX());  // Output: 42

4. Что вернет [2] == [2] и почему?

Это выражение вернет false. Это связано с тем, что в Javascript массивы являются объектами, а объекты сравниваются по ссылке, а не по значению. Каждый литерал массива создает новую ссылку, поэтому они не равны, даже если их содержимое одинаково.

5. Чему равно 0,1 + 0,2 === 0,3 и почему?

Это выражение оценивается как false в JavaScript. Это может быть весьма загадочным для новичков в языке или даже для некоторых опытных разработчиков. Причина кроется в том, как числа с плавающей запятой представляются в двоичном формате согласно стандарту IEEE 754. И 0,1, и 0,2 не могут быть точно представлены в двоичном формате, а ошибки округления из-за приближений приводят к сумме, которая не совсем равна 0,3. Таким образом, 0–1 + 0,2 оказывается числом, очень близким, но не совсем к 0,3, что делает выражение ложным.

6. Что вернут «5» + 3 и «5» — 3?

  • «5» + 3 возвращает строку «53». Это связано с тем, что когда вы пытаетесь использовать оператор «+» со строкой и числом, JS выполняет приведение типа, преобразуя число в строку и объединяя его с исходной строкой.
  • «5» — 3 возвращает число 2. Интересно, что оператор «—» не выполняет конкатенацию строк. Вместо этого он приводит оба операнда к числам и выполняет вычитание.

7. Какие существуют способы создания объекта в JavaScript?

Вы можете создавать объекты в JavaScript несколькими способами:

  • Литералы объектов
const obj1 = { key: "value" };
  • Функция конструктора
function Person(name) {
  this.name = name;
}
const obj2 = new Person("Alice");
  • Метод Object.create
const obj3 = Object.create({ key: "value" });
  • Синтаксис «нового объекта()»
const obj4 = new Object();
  • Синтаксис «класса» ES6
class Animal {
  constructor(name) {
    this.name = name;
  }
}
const obj5 = new Animal("Dog");

8. Что делает оператор экземпляра?

Оператор instanceof проверяет, появляется ли свойство прототипа конструктора где-нибудь в цепочке прототипов объекта. Оператор возвращает логическое значение, указывающее, наследуется ли объект от определенного класса или нет.

const arr = [1, 2, 3];

console.log(arr instanceof Array);  // Output: true
console.log(arr instanceof Object);  // Output: true
console.log(arr instanceof Number);  // Output: false

Это может быть сложно, поскольку instanceof просматривает цепочку прототипов, поэтому объект может быть экземпляром нескольких конструкторов/объектов, которые появляются в его цепочке прототипов.

9. Что такое прототип в JavaScript?

В JavaScript прототип — это объект, свойства и методы которого наследуют другие объекты. Система прототипов является ключевой частью модели объектно-ориентированного программирования (ООП) JavaScript и служит механизмом повторного использования и наследования кода.

Цепочка прототипов

Каждый объект в JavaScript имеет внутреннюю ссылку на другой объект, его «прототип», от которого он может наследовать свойства и методы. Это звено образует цепочку, известную как «цепочка прототипов». Когда вы пытаетесь получить доступ к свойству или методу объекта, JavaScript сначала ищет это свойство или метод в самом объекте. Если он не найдет его там, он будет просматривать прототип объекта и т. д. вверх по цепочке прототипов, пока либо не найдет запрошенное свойство/метод, либо не достигнет объекта с нулевым прототипом. (обычно Object.prototype), указывающий конец цепочки.

function Person(name) {
  this.name = name;
}

// Add a method to the Person prototype
Person.prototype.sayHello = function() {
  console.log(`Hello, my name is ${this.name}`);
};

const alice = new Person('Alice');

// Use the sayHello method from the Person prototype
alice.sayHello();  // Output: "Hello, my name is Alice"

Здесь мы определяем функцию-конструктор Person. Затем мы добавляем метод sayHello к прототипу Person. Когда мы создаем новый объект Алиса, используя new Person('Alice'), Алиса будет иметь доступ ко всем свойствам и методам, определенным в Person.prototype. >.

10. В чем разница между null и unfinded?

И null, и undefined являются специальными значениями в JavaScript, которые указывают на отсутствие значения или «дырку» в объекте или массиве. Однако они используются в несколько разных контекстах:

не определено:

Переменной, которая объявлена, но не инициализирована, автоматически присваивается неопределенное значение:

let x;
console.log(x);  // Output: undefined

Если параметр функции не указан, его значение внутри функции становится неопределенным.

function greet(name) {
  console.log(`Hello, ${name}!`);
}
greet();  // Output: Hello, undefined!

Доступ к несуществующему свойству объекта возвращает неопределенное значение.

const obj = {};
console.log(obj.someProp);  // Output: undefined

В разреженных массивах отсутствующие элементы не определены.

const arr = [1,,3];
console.log(arr[1]);  // Output: undefined

ноль:

null используется для обозначения намеренного отсутствия какого-либо значения или объекта.

const x = null;

Когда вы хотите «очистить» переменную, которая ранее могла содержать значение, часто используется значение null.

let x = 'some value';
x = null;  // Explicitly setting it to null

Возвращаемое значение:Некоторые встроенные методы и функции JavaScript возвращают null, указывая на то, что объект, который вы пытались получить, не существует. Например, document.getElementById() возвращает null, если элемент не найден.

Вот и все. Мы сделали это. Если вы не хотите пропустить ни одну подобную статью, подписывайтесь на меня :)