Skip to content

Instantly share code, notes, and snippets.

@AntonGorelov
Last active April 1, 2020 11:51
Show Gist options
  • Save AntonGorelov/6be567400ef1d03b67763362e8f58b78 to your computer and use it in GitHub Desktop.
Save AntonGorelov/6be567400ef1d03b67763362e8f58b78 to your computer and use it in GitHub Desktop.
JS questions
  1. Что покажут эти два alert()?
var foo = 'Hello';
(function() {
  var bar = ' World';
  alert(foo + bar);
})();
alert(foo + bar);
Ответ:

'Hello World' и ReferenceError: bar is not defined.

  1. Что вернет следующий код?
var Employee = {
  company: 'xyz'
}
var emp1 = Object.create(Employee);
delete emp1.company
console.log(emp1.company);

Ответ: Код выше будет выводить xyz в качестве вывода. Здесь объект emp1 получил компанию в качестве прототипа. Оператор удаления не удаляет свойство прототипа.

  1. Что вернет следующий код?
var trees = ["xyz", "xxxx", "test", "ryan", "apple"];
delete trees[3];
console.log(trees.length);

Ответ: 5. delete() не влияет на длину массива.

  1. Что будет в консоли?
let number = 0;
console.log(number++);
console.log(++number);
console.log(number);

Ответ: 0 2 2

Постфиксный унарный оператор ++:

  1. Возвращает значение (0)
  2. Инкрементирует значение (теперь число равно 1)

Префиксный унарный оператор ++:

  1. Инкрементирует значение (число теперь равно 2)
  2. Возвращает значение (2)
  1. Что произойдет при выполнении следующего куска кода?
myname = "global"; 
function func() { 
    console.log(myname); 
    var myname = "local"; 
    console.log(myname); 
} 
func(); 

Ответ: undefined local. Интерпретатор JavaScript всегда перемещает («поднимает») объявления функций и переменных в начало области видимости (вверх текущего скрипта или функции). Код в вопросе аналогичен следующему:

myname = "global"; 
function func() { 
    var myname; 
    console.log(myname); // "undefined" 
    myname = "local"; 
    console.log(myname); // "local" 
} 
func(); 
  1. Что вернет следующие строки?
!function(){}()
!function(){}

Ответ: true, false

  1. Чему равно foo.x ?
var foo = {n: 1};
var bar = foo;
foo.x = foo = {n: 2};

Главное на что здесь стоит обратить внимание, так это то, что foo на которую ссылается foo.x “устанавливается” перед тем как foo изменится. foo.x ссылается на старое значение foo. Это значит, что в старом foo появиться новое свойство x равное {n: 2} . А в новое foo запишется {n: 2} .

// bar
{
  n: 1,
  x: {
    n: 2
  }
}

Так как при дальнейшем выводе foo.x наше foo ссылается на его новое значение, в котором отсутствует x , то соответственно foo.x будет не определенно — undefined . Ответ: undefined.

  1. Валидный код?
<figure>
   <picture>
      <source media="(min-width: 40em)"
      srcset="large.jpg 1024w, medium.jpg 640w, small.jpg 320y">
      <img src="medium.jpg" alt="London by night">
   </picture>
   <figcaption>A landscape of London by night</figcaption>
</figure>

В разметке используется тэг picture, который совсем недавно вошел в спецификацию. Код валидный вплоть до последнего изображения в атрибуте srcset; 320y — невалидное значение. Если изменить y на w, то код будет валидным полностью.

  1. Что такое атрибут longdesc?

Ответ: Этот атрибут был сделан для того, чтобы позволить более детально описывать изображения, нежели это позволяет сделать атрибут alt. Интересная вещь: вместо того, чтобы являть собой описание изображения (как это делает атрибут alt), longdesc указывает на гиперссылку, содержащую описание.

  1. 018 - 017 = ?

Ответ: 3. В JavaScript префикс 0 преобразует число в восьмеричное. Однако 8 не используется в восьмеричном виде, и любое число, содержащее 8, будет автоматически преобразовано в десятичное число. Следовательно, 018 - 017 по сути эквивалентно десятичному выражению 18 - 15, потому что 017 – восьмеричное число, а 018 – десятичное.

  1. Основное отличие стрелочных функцию

Ответ: Основное отличие стрелочных функций от обычных функций, даже если не смотреть на то, что они короче, заключается в том, что стрелочные функции не задают собственное значение для this. Вместо этого они используют значение this блока, в который они включены. В вышеприведённом примере при обращении к this.x каждую секунду будут выводиться числа 1, 2, 3, и так далее. При использовании в похожей ситуации обычной функции, this имело бы значение undefined, что привело бы к выводу NaN. Тело стрелочной функции представляет собой её возвращаемое значение. Это делает особенно удобным использование стрелочных функций в промисах. Обычные функции, в отличие от стрелочных, должны явно возвращать некое значение, иначе автоматически будет возвращено undefined.

  1. Что выведется в консоль?
const a = {};
const b = { key: "b" };
const c = { key: "c" };

a[b] = 123;
a[c] = 456;

console.log(a[b]);
  • A: 123
  • B: 456
  • C: undefined
  • D: ReferenceError

Ответ: B Ключи объекта автоматически конвертируются в строки. Мы собираемся добавить объект в качестве ключа к объекту a со значением 123.

Тем не менее, когда мы приводим объект к строке, он становится "[object Object]". Таким образом, мы говорим, что a["Object object"] = 123. Потом мы делаем то же самое. c это другой объект, который мы неявно приводим к строке. Поэтому a["Object object"] = 456.

Затем, когда мы выводим a[b], мы имеем в виду a["Object object"]. Мы только что установили туда значение 456, поэтому в результате получаем 456.

  1. Что возвращает метод setInterval?
setInterval(() => console.log("Hi"), 1000);
  • A: уникальный id
  • B: указанное количество миллисекунд
  • C: переданную функцию
  • D: undefined

Ответ: A Это метод возвращает уникальный id. Этот id может быть использован для очищения интервала с помощью функции clearInterval().

  1. Что будет в консоли?
async function getData() {
  return await Promise.resolve("I made it!");
}

const data = getData();
console.log(data);
  • A: "I made it!"
  • B: Promise {<resolved>: "I made it!"}
  • C: Promise {<pending>}
  • D: undefined

Ответ: C Асинхронная функция всегда возвращает обещание. await все еще должен ждать разрешения обещания: ожидаемое обещание возвращается, когда мы вызываем getData(), чтобы установить data равным ему.

Если бы мы хотели получить доступ к разрешенному значению "I made it", мы могли бы использовать метод .then() для data:

data.then(res => console.log(res))

Тогда это бы вывело "I made it!"

  1. Есть ли разница между window и document?

Ответ: Да. У JavaScript есть глобальный объект и всё происходит через него. window – тот самый объект, который хранит глобальные переменные, функции, местоположение, историю. Всё находится внутри него, setTimeout, XMLHttpRequest, console и localStorage также являются частью window. Аналогично дело обстоит и с document, который является свойством объекта window и представляет DOM. Все ноды – это часть document, следовательно, вы можете использовать getElementById или addEventListener для document. Но обратите внимание, что этих методов нет в объекте window.

  1. Что будет в консоли?
function printMessage() {
  return "JS weekdays"
}

const printEventMessage = () => "Event was finest!"

console.log(printMessage.prototype)
console.log(printEventMessage.prototype)
  • A: { constructor: ...} { constructor: ...}
  • B: {} { constructor: ...}
  • С: { constructor: ...} undefined

Ответ: Обычные функции, такие как функция printMessage, имеют свойство prototype, которое является объектом (прототипом объекта) со свойством constructor. Однако функции со стрелками, такие как функция printEventMessage, не имеют этого свойства prototype. undefined возвращается при попытке доступа к свойству prototype с использованием printEventMessage.prototype.

  1. Напишите, что выведется в консоли?

console.log([] - [], [] + [], {} - {}, {} + {} );

Ответ: 0 "" NaN "[object Object][object Object]"

  1. Напишите, что выведется в консоли?
console.log(
	Math.floor(999.99) === ~~999.99,
	Math.floor(-999.99) === ~~-999.99,
	~function(){}(),
	~~function(){}(),
	~~null,
	~~undefined,
	~~[],
	~~{},
	~~'Test'
);

Ответ: true false -1 0 0 0 0 0 0

  1. Чему равно?
0 || "" || 2 || undefined || true || falsе

Ответ: 2

  1. Что увидит пользователь?
f.call(null);

function f() {
  alert(this);
}
  • null
  • undefined

Ответ: null

  1. Если ли разница между выражениями?
!!( a && b )
(a && b)

Ответ: да.

var a = 0;
var b = 1;
var c = !!( a && b ); // false
var d = (a && b); // 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment