Analysis of the final of the quiz competition at the hh.ru stand at # HolyJS18

    Hello, this is the last part of the analysis of issues from our booth.


    Questions on React here .


    Analysis of the first four rounds here .



    Here questions on the topics are practically not grouped, we sort everything one by one.


    Go:


    What will be the result?

    let i = 0;
    let a = 1;
    for (; a >= 0; i++) {
        a -= 0.1;
    }
    console.log(i);
    a) 1  
    b) 11   
    c) ничего  
    d) 10

    Answer + parse

    b) 11
    Тут все достаточно просто. Это больше вопрос на внимательность. Цикл будет выполнен 11 раз, т.к. у нас не строгое
    больше >, а больше или равно >=.


    What will be the result?

    {} + [];
    a) 0      
    b) null  
    c) '[object Object]'  
    d) NaN

    Answer + parse

    a) 0
    Тут весь фокус в том, что {} будет интерпретирован не как объект, а как пустой блок кода. Поэтому выражение преобразовывается в +[], а это 0, т.к. + перед значением преобразовывает его к числу. Хочется заметить, что если код записать как console.log({} + []);, то будет уже [object Object], т.к. тут {} будет интерпретирован как объект.


    What will be the result?

    [] + {};

    a) 0
    b) null
    c) '[object Object]'
    d) NaN


    Answer + parse

    c) '[object Object]'
    Тут оба операнда по правилам приводятся к строке у пустого массива — это пустая строка, а у объекта [object Object]


    What will this code output?

    let response = {
      data: '',
      errors: { code: 403 }
    };
    console.log(typeof response.data.link);
    a) undefined
    b) object
    c) string
    d) function

    Answer + parse

    d) function
    У прототипа строки есть метод link, поэтому правильный ответ function


    What will this code output?

    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

    Answer + parse

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


    What will this code display when clicking on a button?

    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 

    Answer + parse

    a) FUS RO DAH!
    Тут пользователь нажимает на кнопку, поэтому в стеке нет click, и во втором обработчике промис сработает сразу.


    What will this code output?

    console.log(typeofFunction````);
    a) TypeError  
    b) SyntaxError  
    c) 'function'  
    d) 'undefined'

    Answer + parse

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


    What will this code output?

    functionf(a, b, c) {
        'use strict';
        return f.length;
    }
    console.log(f(100, 2));
    a) undefined  
    b) 2  
    c) 3     
    d) ошибка  

    Answer + parse

    c) 3
    Исчерпывающее описание с MDN:
    Свойство length является свойством объекта функции и указывает, сколько аргументов ожидает функция, то есть, количество формальных параметров. Это количество не включает остаточные параметры.


    What will be the result?

    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}

    Answer + parse

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


    What will this code output?

    console.log(!![] > [], ![] == []);
    a) falsefalse  
    b) falsetrue  
    c) truetrue  
    d) truefalse

    Answer + parse

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


    This concludes our analysis, thank you for your attention!


    Also popular now: