Задать вопрос
  • Как отследить цепочку событий для функции в js?

    bingo347
    @bingo347 Куратор тега JavaScript
    И чем это поможет автору?
    Это событие срабатывает только на восстановление истории измененной через методы history.
    И стэк трейс будет ровно из 1 элемента - той самой функции, в которой вызван трейс.
  • Уместны ли каверзные вопросы на собеседовании?

    bingo347
    @bingo347 Куратор тега JavaScript
    Вполне нормальные вопросы, которые к тому же дают кандидату задать встречные технические вопросы. Например я бы спросил:
    На 1 вопрос - а знает ли собеседующий, что function expression может быть именованый или в проекте такая же лапша встречается?
    На 2 вопрос - а почему у собеседующих typescript не используется?

    Но особо я люблю такой пример:
    for (var i = 0; i < 10; i++) {
        setTimeout(() => console.log(i), 0);
    }
    Можно просветить собеседующих, как v8 хранит функции в памяти и почему создавать функции в цикле - это грех. А пару раз встречал, что собеседующие не знали, что setTimeout умеет передавать аргументы в свой колбэк.
  • Как упростить проверку числа на палиндром и увеличить скорость выполнения кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    WbICHA, если честно я подошел к задаче чисто с точки зрения алгоритмов, не делая бенчмарки и т.д.
    Встреться у меня подобная задача на реальном проекте, я бы вообще все переписал на Си или Раст и загнал бы в wasm. Есть особенность в x86-64 процах, что такие числодробилки в разы шустрее работают, если все вычисления будут в int32.
    Основная проблема в JS с вычислениями в том, что number это float64.
  • Как упростить проверку числа на палиндром и увеличить скорость выполнения кода?

    bingo347
    @bingo347 Куратор тега JavaScript
    WbICHA, хм, если числа только положительные, то можно Math.floor попробовать.
    И что-то мне подсказывает, что order нужно делить на 10, а не на 100 на каждом шаге.
    Еще как вариант, попробовать bigint использовать, с ним можно будет уйти от округлений и внутреннего перерасчета экспоненты числа при делении.
  • Как вывести сумму квадратов чётных чисел массива одной строкой?

    bingo347
    @bingo347 Куратор тега JavaScript
    0xD34F, лучше уж тогда (~n & 1), чтоб не делать лишних кастов
  • Как исправить ошибку типизации компонента?

    bingo347
    @bingo347 Куратор тега TypeScript
    А еще трабла может быть в том, что jsx код <Filter //... транспайлится в React.createElement(Filter, // .... Дженерики можно применять только к вызову функции, мне странно что с tsx такое вообще работает...
  • Как исправить ошибку типизации компонента?

    bingo347
    @bingo347 Куратор тега TypeScript
    Что-то мне подсказывает, что компонент Filter нужно с тем же параметром типа вызывать, то есть вместо <Filter<string | string[] | undefined> //... писать <Filter<T> //...

    А вообще, мне кажется что можно дженерик на setData перенести
    И вообще, typescript вполне нормально при вызове сам выводит дженерики из аргументов
  • Что нужно уточнить на собеседовании?

    CityCat4, ок, возможно я смотрю на ситуацию со своей колокольни... У меня никогда с этим проблем не было. Но джуну, который пробился через сотню конкурентов, думаю могут и сказать не выпендриваться. Хотя я бы задумался о работе в такой компании, которая с первых дней начинает ограничивать в законных правах.
  • Что нужно уточнить на собеседовании?

    CityCat4, конторе вообще должно быть пофиг, в какой банк деньги переводить. И этот вопрос можно вообще на собеседовании не поднимать, а сообщить о своем желании уже после подписания договора.
  • Как написать свой скриптовый язык?

    ChairfaceChippendale, если ко мне на собеседование придет джун, который осилил сделать собственный работающий ЯП, пусть даже не тьюринг полный, а некий DSL, то это резко выделит человека из толпы других, у которых в резюме типовые проекты с курсов под копирку...
    Как минимум он точно умеет:
    1. В обработку текста
    2. В деревья (ибо 99.9% даю на то, что он поработал с AST)
    3. В FSM/конечные автоматы (если язык интерпретируемый)
    4. В творческий подход и умение гуглить
    Кроме того, с таким кандидатом можно пообщаться на тему, а чем же его ЯП отличается от других и какие вообще языки он пробовал.
  • Что нужно уточнить на собеседовании?

    какой банк зарплатный (будет зарплатным банк #опа Мира Ltd. и будете мотыляться к единственному банкомату в городе)
    По современному законодательству работник сам вправе выбирать, на какой банк ему будут перечислять ЗП, а работодатель не в праве отказать в этом.
    Правда, как правило в банке, который предлагает работодатель у него зарплатный проект, а значит за услуги банка платит работодатель, а если указать свой банк, то все издержки за обслуживание счета будут на работнике.
  • Как в TypeScript правильно указать тип ключа?

    bingo347
    @bingo347 Куратор тега TypeScript
    WbICHA, мне кажется, это тянет на ответ
  • Почему Type 'Album' is missing the following properties from type 'Album[]': length, pop, push, concat, and 28 more?

    bingo347
    @bingo347 Куратор тега TypeScript
    Speakermen, а на что ругается? на инициализацию? Я не особо знаю ангуляр, но мне кажется он должен из вне прийти.
    В крайнем случае можно ts убедить в этом вот так:
    @Input() public album!: Album;
  • Как из FormData() получить массив данных?

    bingo347
    @bingo347 Куратор тега JavaScript
    Malashko, что-то мне подсказывает, что такая конструкция нигде работать не будет:
    let formData.entries
  • Как из FormData() получить массив данных?

    bingo347
    @bingo347 Куратор тега JavaScript
    Internet Explorer, только от Apple

    TheAndrey7, у Internet Explorer хотя бы никогда не было такого, что то что работало в версии N перестало работать в версии N + 1 из-за бага. К тому же у Internet Explorer всегда были альтернативы, да и вообще он сдох... А на iOS альтернатив нет, есть или Safari или Safari в webview, к которому еще и дебаггером не подрубиться...
  • Как в реакт глобально отслеживать пропсы?

    bingo347
    @bingo347 Куратор тега JavaScript
    Почему бы просто не написать свой хук для этой цели?
  • Fetch Как получить данные с сервера?

    bingo347
    @bingo347 Куратор тега JavaScript
    В await еще не вникал

    javaPepper, все что делает await - это вызывает на переданном объекте метод then (если он есть) и приостанавливает выполнение своей async функции до того момента, пока не будет вызван один из переданных в then колбэков. Вот наглядный пример:
    async function f() {
        const start = Date.now();
        const r = await {
            then(cb) {
                setTimeout(cb, 500, 'answer');
            },
        };
        console.log(Date.now() - start, r);
    }
  • TypeScript как правильно убрать ошибки?

    Антон Антон, если честно я не работал с vue3, могли бы Вы переделать мой пример с этим нововведением?
    Заодно думаю можно на setup переделать конфиг, тогда он будет проще
  • Как написать функцию которая возвращает класс в зависимости от параметра?

    bingo347
    @bingo347 Куратор тега TypeScript
    RAX7, проблема в том, что тип ReturnMap[T] представляет собой конкретный тип снаружи функции и обобщенный тип внутри функции, так как дженерики резолвятся в конкретные типы в момент вызова функции. TS не в состоянии сам сопоставить значение аргумента с конкретным классом, но ему можно об этом рассказать через type-guard
  • TypeScript как правильно убрать ошибки?

    Антон Воскобоев, ну начнем с того, что jsx - это не "HTML in JS", не получится просто вставить валидный HTML и прикрутить туда состояние, придется его еще править, начиная от банального class -> className и вплоть до закрытия всех одиночных тэгов.

    Ну и давайте на примерах:

    1. static + conditional class
    React:
    <div className={`static${state ? ' conditional' : ''}`}></div>

    Vue:
    <div class="static" :class="{conditional: state}"></div>

    Svelte:
    <div class="static" class:conditional={state}></div>

    Как по мне, вариант с react очень тяжело читать...

    2. Кинуть событие родителю, притом дать возможность родителю не подписываться или подписаться самому + прокинуть наверх.
    React: нет событий, поэтому делаем жуткий костыль в виде колбэка в пропсах
    const Parent = ({onEvent}) => {
      const myOnEvent = e => {
        onEvent?.(e); // хорошо что в es2020 появился такой синтаксис, а то пришлось бы if городить
        // ...
      };
      return <Child onEvent={myOnEvent} />;
    };
    
    const Child = ({onEvent}) => {
      const onClick = e => {
        onEvent?.(e);
      };
      return <button onClick={onClick}>click me</button>;
    };

    Vue:
    <!-- Parent -->
    <Child @event="someMethod" @event="$emit('event', $event)" />
    
    <!-- Child -->
    <button @click="$emit('event', $event)">click me</button>;

    Svelte:
    <!-- Parent -->
    <Child on:event={someFunction} on:event />
    
    <!-- Child -->
    <script lang="ts">
    import {createEventDispatcher} from 'svelte';
    // нужно из-за идеологии "тянем в бандл только то что реально используется"
    const dispatch = createEventDispatcher();
    </script>
    <button on:click={e => dispatch('event', e)}>click me</button>;


    3. Массив строк из пропсов отрисовать в виде переключателя (radio) + вывести выбранный
    React:
    import {useState} from 'react';
    export const Switcher = ({items = []}) => {
      const [selected, setSelected] = useState('');
      return <>
        {items.map(item => <label>
          <input type="radio" checked={selected === item} onChange={() => setSelected(item)} />
          {item}
        </label>)}
        <div>{selected}</div>
      </>
    };

    Vue, не умеет выводить больше 1 элемента в корень компонента, так что нужна обертка:
    <script>
    // вот тут конечно vue проиграет...
    export default {
      props: {
        items: {
          type: Array,
          default: () => [],
        },
      },
      data() {
        return {selected: ''};
      },
    };
    </script>
    <template>
    <div>
      <label v-for="item of items">
        <!-- зато насколько проще тут -->
        <input type="radio" :value="item" v-model="selected" >
        {{item}}
      </label>
      <div>{{selected}}</div>
    </div>
    </template>

    Svelte:
    <script lang="ts">
    export let items: string[] = [];
    let selected = '';
    </script>
    {#each items as item}
      <label>
        <input type="radio" value={item} bind:group={selected} >
        {item}
      </label>
    {/each}
    <div>{selected}</div>


    И это я еще варианты с react на функциональных компонентах писал (из-за которых, кстати, добавилась еще одна проверка в рантайме на каждый чих), в реальных проектах встречается огромное количество компонентов на классах, и с ними кода будет еще больше...