• Объясните пожалуйста как работает l[...num+'']?

    WblCHA
    @WblCHA
    [...num+''] = [...`${num}`] = [...num.toString()] = num.toString().split('')

    Строка ─ это массив символов, так что это преобразование одного массива в другой.
    По поводу использования, хочешь ─ используй, не хочешь ─ не используй. Это стандартный синтаксис без ноухау.
    Единственное я хз как там с производительностью, но, думаю, она будет выше.

    И да, лучше используй этот вариант: [...`${num}`]. Просто нагляднее и современнее.
    Ответ написан
    1 комментарий
  • Как сделать чтобы активная страница подсвечивалась?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Достаточно добавить один символ... Или убрать. Вот здесь:

    if (item.innerText === currentPage) {

    Одно значение является строкой, другое числом. Число строке не может быть равно. Так что или выполняйте сравнение с приведением типов:

    item.innerText == currentPage

    Или превращайте строку в число явным образом:

    +item.innerText === currentPage
    Ответ написан
    Комментировать
  • Как переписать функцию через промисы?

    @f_ban
    const fs = require('fs');
    const path = require('path');
    
    let pathSupplied = './';
    let extFilter = 'js';
    
    let extension = (element) => {
        let extName = path.extname(element);
        return extName === '.' + extFilter;
    };
    
    let walk = function (dir) {
        const result = [];
    
        fs.readdir(dir, function (err, list) {
            list.forEach((item) => {
                let itemPath = path.join(dir, item);
                fs.stat(itemPath, (e, stats) => {
                    if (stats.isDirectory()) {
                        walk(itemPath);
                    } else {
                        if(extension(itemPath)){
                            console.log(itemPath)
                            result.push(itemPath);
                        }
                    }
                });
            });
        });
    
        return result;
    }
    
    walk(pathSupplied);
    
    walkAsync = (dir)=>{
        return new Promise((resolve)=>{
            resolve(walk(dir))
        });
    }
    Ответ написан
    Комментировать
  • Почему выбивает ошибку в функции?

    @ned4ded
    Верстка, Фронтенд
    Добрый день.

    Метод getItem возвращает либо Products, либо undefined, если продукт не найден. Сделайте терминальное условие и укажите строгую типизация для используемого массива далее.

    addToCart = (id: number) => {
      let tempProduct: Products[] = [...this.state.products];
      const item = this.getItem(id);
      if(item === undefined) {
        // ... инструкция при возникновении терминального условия, например, ошибка
        return;
      }
      const index = tempProduct.indexOf(item as Products); // строгая типизация для item
            
      // ...
    };


    Возможно, если вы укажите тип возвращаемого значения, то не потребуется терминальное условие (но это нужно проверить, я так навскидку не могу утверждать со 100% уверенностью). Такой подход подвержен багам при исполнении js.

    getItem = (id: number): Products => {
      return this.state.products.find(item => item.id === id);
    };


    BTW, я бы не стал называть на вашем месте тип Products во мн. ч. Просто Product, т.к. по сути это единичная сущность.
    Ответ написан
    5 комментариев
  • Как сделать слайдер зацикленным?

    0xD34F
    @0xD34F Куратор тега React
    Не надо закидывать картинки в стейт, пусть компонент получает их через props.

    Добавите в стейт свойство, содержащее индекс отображаемой картинки, делайте ему +/- 1, в зависимости от нажатой кнопки, выход за границы массива поправляйте через взятие остатка от деления на его длину:

    state = {
      active: 0,
    }
    
    nextSlideHandler = ({ target: { dataset: { step } } }) => {
      const len = this.props.images.length;
    
      this.setState(({ active }) => ({
        active: (active + len + +step) % len,
      }));
    }


    <button data-step="-1" onClick={this.nextSlideHandler} className="prev">prev</button>
    <button data-step="+1" onClick={this.nextSlideHandler} className="next">next</button>
    <img src={this.props.images[this.state.active]} />

    https://jsfiddle.net/e7vzm9kq/
    Ответ написан
    Комментировать
  • Как создать свои ошибки в JS?

    @f_ban
    Не совсем понял, когда проверка выполняется, если в конструкторе, то воспользуйтесь деструктуризацией аргументов, и делайте проверки до инициализации свойств объекта - это как минимум наглядно покажет все ограничения на входные параметры конструктора.
    class Point {
      constructor(x, y, ...other) {
          if(other.length > 0){
            throw 'Only 2 number arguments';
          }
          if(typeof x !== 'number'){
            throw TypeError(`The first argument must be number but have got ${typeof x}`);
          }
          if(typeof y !== 'number'){
            throw TypeError(`The second argument must be number but have got ${typeof y}`);
          }
          
          this.x = x;
          this.y = y;
      }
    }


    Да, в JS можно написать throw 'Текст ошибки'; И это создаст вполне себе нормальный объект исключения класса Error. Также существуют разные стандартные классы исключений. Если требуется кастомный типизированый класс исключения, то просто унаследуйте новый класс от Error и используйте его в кострукции throw.

    На самом деле, не совсем понимаю, зачем проверку свойств объекта выделили в отдельный метод. Это нужно дл какой-то валидации вне конструктора?
    Ответ написан
    1 комментарий
  • Как создать свои ошибки в JS?

    wagoodoogoo
    @wagoodoogoo
    prestashop, webix, phalcon, vue, slim, craft cms
    class Point {
              constructor(x, y) {
                  this.x = x;
                  this.y = y;
              }
    
              isNum()
              {
                  if(typeof this.x !== 'number' || typeof this.y !== 'number' ) {
                      throw new Error('point is not a number ')
                  }
              }
          }
    
    
          try{
                let exampleNum = new Point(1,2)
                exampleNum.isNum()
              } catch(e){          
              console.error(e)
          }
    Ответ написан
    2 комментария
  • Как найти в дереве узел с минимальным значением?

    0xD34F
    @0xD34F Куратор тега JavaScript
    const findMin = obj =>
      (obj.children || []).reduce((min, n) => (
        n = findMin(n),
        min.value < n.value ? min : n
      ), obj);
    Ответ написан
    2 комментария