Разбор финала конкурса-квиза на стенде hh.ru на #HolyJS18
Привет, это последняя часть разборов вопросов с нашего стенда.
Вопросы по React тут.
Разбор первых четырех туров тут.
Здесь вопросы по темам практически не сгруппированы, разбираем все по одному.
Поехали:
Что будет получено в результате?
let i = 0;
let a = 1;
for (; a >= 0; i++) {
a -= 0.1;
}
console.log(i);
a) 1
b) 11
c) ничего
d) 10
b) 11
Тут все достаточно просто. Это больше вопрос на внимательность. Цикл будет выполнен 11 раз, т.к. у нас не строгое
больше >
, а больше или равно >=
.
Что будет получено в результате?
{} + [];
a) 0
b) null
c) '[object Object]'
d) NaN
a) 0
Тут весь фокус в том, что {}
будет интерпретирован не как объект, а как пустой блок кода. Поэтому выражение преобразовывается в +[]
, а это 0
, т.к. +
перед значением преобразовывает его к числу. Хочется заметить, что если код записать как console.log({} + []);
, то будет уже [object Object]
, т.к. тут {}
будет интерпретирован как объект.
Что будет получено в результате?
[] + {};
a) 0
b) null
c) '[object Object]'
d) NaN
c) '[object Object]'
Тут оба операнда по правилам приводятся к строке у пустого массива — это пустая строка, а у объекта [object Object]
Что выведет этот код?
let response = {
data: '',
errors: { code: 403 }
};
console.log(typeof response.data.link);
a) undefined
b) object
c) string
d) function
d) function
У прототипа строки есть метод link, поэтому правильный ответ function
Что выведет этот код?
const button = document.querySelector('button');
button.addEventListener('click', () => {
console.log('FUS');
});
button.addEventListener('click', () => Promise.resolve('RO').then((x) => console.log(x)));
button.addEventListener('click', () => {
console.log('DAH!');
});
button.click();
a) FUS RO DAH!
b) FUS DAH! RO
c) RO FUS DAH!
d) DAH! RO FUS
b) FUS DAH! RO
Мы тут триггерим click
программно, и он попадает в стек вызовов, срабатывает первый обработчик — выводим FUS
, попадаем во второй — добавляем в очередь RO
, т.к. click
еще в стеке — не вызываем промис. Попадаем в следующий обработчик — выводим DAH!
. click
отработал, очередь пустая, срабатывает промис.
Что выведет этот код при клике на кнопку?
const button = document.querySelector('button');
button.addEventListener('click', () => {
console.log('FUS');
});
button.addEventListener('click', () => Promise.resolve('RO').then((x) => console.log(x)));
button.addEventListener('click', () => {
console.log('DAH!');
});
button.click();
a) FUS RO DAH!
b) FUS DAH! RO
c) RO FUS DAH!
d) DAH! RO FUS
a) FUS RO DAH!
Тут пользователь нажимает на кнопку, поэтому в стеке нет click
, и во втором обработчике промис сработает сразу.
Что выведет этот код?
console.log(typeof Function````);
a) TypeError
b) SyntaxError
c) 'function'
d) 'undefined'
d) 'undefined'
При использовании шаблонных литералов после имени функции, она вызывается с массивом, где есть переданное значение и массив c raw
значением. Function
, то же самое что и new Function
— конструктор функции. При передаче в него пустой строки мы получим функцию вида (){}
, соответственно с каким бы аргументом мы ее не вызвали, она вернет undefined
, здесь она вызывается с с массивом — ['', raw: ['']]
. Это примерно аналогично записи Function('')('')
Что выведет этот код?
function f(a, b, c) {
'use strict';
return f.length;
}
console.log(f(100, 2));
a) undefined
b) 2
c) 3
d) ошибка
c) 3
Исчерпывающее описание с MDN:
Свойство length является свойством объекта функции и указывает, сколько аргументов ожидает функция, то есть, количество формальных параметров. Это количество не включает остаточные параметры.
Что будет получено в результате?
const dict = {};
dict[[1]] = 2;
dict[dict] = 3;
dict[1 / 0] = 4;
a) {'1': 2, '[object Object]': 3, 'Infinity': 4}
b) Assignment to constant variable
c) {'[1]': 2, 'dict': 3, '1/0': 4}
d) {'1': 4, '[object Object]': 3}
a) {'1': 2, '[object Object]': 3, 'Infinity': 4}
Ошибки Assignment to constant variable
тут не будет т.к. const
не позволяет менять ссылку, а модифицировать объект можно. Все ключи объекта должны быть строками, поэтому для каждого из из них вызывается toString
. Массив приводится к 1
, объект к [object Object]
, а при делении на ноль получается Infinity
.
Что выведет этот код?
console.log(!![] > [], ![] == []);
a) false false
b) false true
c) true true
d) true false
c) true true
Сравнения > >= <= <
— вызывают арифметическое сравнение, сначала мы приводим массив к булевому значению и получаем true, и далее получается сравнение 1 > 0, что очевидно дает true. Во второй части вопроса мы приводим массив к false
, далее false
приводится к 0
, а массив приводится к примитиву, получается пустая строка ''
, а они равны.
На этом завершаем наши разборы, спасибо за внимание!