• Что такое и зачем нужен новый тип данный Symbol в ES15?

    sfi0zy
    @sfi0zy Куратор тега JavaScript
    Creative frontend developer
    Что такое

    Новый тип данных symbol - это попытка ввести уникальные идентификаторы. Все крутится вокруг функции Symbol. Это не конструктор в полном смысле слова, с new ее использовать не получится. Это скорее маленькая фабрика. Она просто возвращает новый символ каждый раз. Это важно. Каждый раз новый. В качестве аргумента можно передать строку, но она используется только для отладки.
    Symbol() === Symbol() // false

    Что такое глобальный символ? Какой еще реестр?

    Есть Symbol.for(), это еще один метод, который не просто возвращает символ, но и сохраняет информацию о том, для какого параметра он создавался. Внешне логика работы напоминает хеширование - для разных параметров символы получаются разные, а для одинаковых - одинаковые.
    Symbol.for('my-string') === Symbol.for('my-string') // true
    Symbol.for('my-string') === Symbol.for('another-string') // false


    Зачем это надо?

    Применение этого типа данных - предмет для споров. Большая часть кейсов из интернета - это попытки поиспользовать новую фишку только ради того, чтобы ее поиспользовать. Самые популярные и практически применимые варианты:
    • В качестве ключа для доступа к свойству объекта. Грубо говоря вместо obj[key] использовать obj[some-magic-unique-key]. Позволяет избежать коллизии этих самых ключей если вы расширяете существующий объект из сторонней библиотеки. На практике встречается не очень часто, особенно в небольших проектах, но по всей видимости это - причина появления символов в языке.
    • Некоторая иллюзия приватных свойств. Символы по-своему работают с циклами и многими методами, связанными со свойствами объекта, становясь невидимыми для них. В результате можно разделить "все свойства с обычными ключами" и "все свойства с ключами-символами". А еще можно запутать код до безобразия.
    • Также, пользуясь предыдущей мыслью, можно сделать что-то вроде метаданных для любого объекта, которые опять же не сломают существующий код, но могут быть использованы для хранения какой-то информации и мередачи ее между отдельными модулями. Штука довольно интересная.
    Ответ написан
    Комментировать
  • Как ускорить функцию подсчёта суммы от 0 до заданного числа js?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    const n3 = Math.floor(n / 3);
    const n5 = Math.floor(n / 5);
    const n15 = Math.floor(n / 15)
    const sum = (n3 * 3 * (n3 + 1)  + n5 * 5 * (n5 + 1) - n15 * 15 * (n15 + 1)) / 2;
    Ответ написан
  • Как найти уникальный элемент в массиве?

    @iGanza
    function uniq (arr) {
      const store = arr.reduce((acc, cur) => {
        !acc[cur] ? acc[cur] = 1 : acc[cur]++
        return acc
      }, {})
      return Object.keys(store).filter(key => store[key] === 1)
    }
    Ответ написан
    Комментировать
  • Как найти уникальный элемент в массиве?

    @ReactLover
    opis.filter((el, i, arr) => arr.indexOf(el) === arr.lastIndexOf(el))
    Ответ написан
    Комментировать