Привет! Добро пожаловать обратно в очередную статью о вопросах на собеседовании. Сегодня мы имеем дело с 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, если элемент не найден.
Вот и все. Мы сделали это. Если вы не хотите пропустить ни одну подобную статью, подписывайтесь на меня :)