Главная » Хабрахабр » Разбор финала конкурса-квиза на стенде hh.ru на #HolyJS18

Разбор финала конкурса-квиза на стенде 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

Ответ + разбор

Поэтому выражение преобразовывается в +[], а это 0, т.к. a) 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

Ответ + разбор

RO
Мы тут триггерим click программно, и он попадает в стек вызовов, срабатывает первый обработчик — выводим FUS, попадаем во второй — добавляем в очередь RO, т.к. b) FUS DAH! Попадаем в следующий обработчик — выводим DAH!. click еще в стеке — не вызываем промис. 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'

Ответ + разбор

Function, то же самое что и new Function — конструктор функции. d) 'undefined'
При использовании шаблонных литералов после имени функции, она вызывается с массивом, где есть переданное значение и массив c raw значением. Это примерно аналогично записи Function('')('') При передаче в него пустой строки мы получим функцию вида (){}, соответственно с каким бы аргументом мы ее не вызвали, она вернет undefined, здесь она вызывается с с массивом — ['', raw: ['']].

Что выведет этот код?

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}

Ответ + разбор

const не позволяет менять ссылку, а модифицировать объект можно. a) {'1': 2, '[object Object]': 3, 'Infinity': 4}
Ошибки Assignment to constant variable тут не будет т.к. Массив приводится к 1, объект к [object Object], а при делении на ноль получается Infinity. Все ключи объекта должны быть строками, поэтому для каждого из из них вызывается toString.

Что выведет этот код?

console.log(!![] > [], ![] == []); a) false false b) false true c) true true d) true false

Ответ + разбор

Во второй части вопроса мы приводим массив к false, далее false приводится к 0, а массив приводится к примитиву, получается пустая строка '', а они равны. c) true true
Сравнения > >= <= < — вызывают арифметическое сравнение, сначала мы приводим массив к булевому значению и получаем true, и далее получается сравнение 1 > 0, что очевидно дает true.

На этом завершаем наши разборы, спасибо за внимание!


Оставить комментарий

Ваш email нигде не будет показан
Обязательные для заполнения поля помечены *

*

x

Ещё Hi-Tech Интересное!

[Перевод] CG-моделинг 80 уровня: фотореалистичные персонажи real-time в Unreal

На днях тестировали новую графику в War Robots и получили уйму положительного фидбека от игроков. И хотя речь о мобильной графике, места для роста там очень много. С десктопом еще интереснее. Если раньше на рендер качественной сцены с фотореалистичными моделями ...

[Перевод] IntelliCode теперь и в TypeScript/JavaScript

На Build 2018 мы анонсировали Visual Studio IntelliCode: набор AI-инструментов, которые способствуют более качественной разработке. В сотрудничестве с командой IntelliCode мы рады сообщить, что теперь IntelliCode доступен пользователям TypeScript/JavaScript через расширение IntelliCode для VS Code. Что такое IntelliCode? IntelliCode дополняет ...