• Как получить счастливое число?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Тут всё плохо:
    function isHappy(array){
      // записываем пустой массив в array
      // (не важно что там мы получили, теперь этого нет)
      array = [] 
      // получаем 6 переменных с значением "ничего"(undefined)
      let[x,y,z,b,n,v] = array
      // сравниваем x+y+z == b+n и выкидываем, никак не используя
      // с помощью оператора запятая(,) в if попадает только v
      // как мы знаем во всех переменных undefined - if(undefined) - ложь
      if(x+y+z == b+n,v){
        console.log(`Число ${array} - счастливое!`);
      }
      else{
        console.log(`Число ${array} - несчастливое`);
      }
    }
    // вызываем isHappy с аргументом 000000, который является числом 0, 
    // просто записанным длинно, а не массивом
    isHappy(000000)
    Ответ написан
    8 комментариев
  • Почему данном случае теряется контекст this?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Простой ответ:
    Берём метод:
    метод = function(){
      console.log(this)
    };
    и(не важно как) пихаем его в какие-то объекты.
    Получаем:
    хрень.метод() // this - хрень
    хрень.кишки.метод() // this - хрень.кишки
    метод() // this - window
    
    хрень.метод.call(хрень.кишки) // this - хрень.кишки
    метод.call(хрень.кишки) // this - хрень.кишки
    метод.call(null) // this - null
    
    элемент.addEventListener('оппа', хрень.метод) //  this -элемент
    элемент.addEventListener('оппа', метод) //  this -элемент
    элемент.addEventListener('оппа', хрень.кишки.продукт.метод) //  this -элемент

    По сути this для фукции - это то, что идёт перед точкой, кроме тех случаев когда он переопределён явно. Всё, никакой эзотерики.)

    fn.call(!this ? this : obj) - это чушь скорее всего. Если this - falsy, то ставим его как this при вызове функции fn, иначе ставим obj. Falsy this может быть только при явном указании(или в strict режиме, при вызове функции напрямую("без точки перед ней")), и скорее всего передача пустого this в таком случае просто сломает выполнение fn.

    Ну ещё следует упомянуть стрелочную фукнцию:
    метод = () => {
      console.log(this)
    };
    это можно считать за явное указание this, потому что this тут всегда привязан тот, что был при создании стрелочной функции, независимо от того как и откуда её вызывают.
    Ответ написан
    3 комментария
  • Продуктивно ли подобное обучение?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Возьми более базовые книги: по алгоритмам, паттернам, структурам, подходам итд. Не привязанные к конкретному языку. Это всегда будет полезно, и не потребует кодинга для практики.
    Эффективное же изучение конкретного языка - это наоборот чистая практика, чтение там должно идти только параллельно по мере необходимости.
    Ответ написан
    4 комментария
  • Как "защитить" лендинг от скачивания html-кода всей страницы?

    Aetae
    @Aetae
    Тлен
    Никак.
    Ответ написан
    Комментировать
  • Как выровнять строки?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    на картинке шрифт не моноширинный — символы имеют разную ширину. Выровнять такой можно средствами HTML и CSS. Javascript тут не при чём.

    p.s. «выровнять» пишется через «я»
    Ответ написан
    9 комментариев
  • Как выровнять строки?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Если шрифт моноширинный, то, условно, так:
    const minGap = 3;
    const keys = ['name', 'price'];  
    const input = [
      {
        name: "абрикосы",
        price: 20
      },
      {
        name: "тыква",
        price: 50
      },
      {
        name: "уи",
        price: 1000
      }
    ];
    
    
    const maxLengths = keys.slice().fill(0);
    const normalizedInput = input.map(item => keys.reduce((acc, key, i) => {
      const current = String(item[key]);
      const currentLength = current.length;
    
      if(currentLength > maxLengths[i]) 
        maxLengths[i] = currentLength;
    
      acc[key] = current;   
      acc.length += currentLength;
    
      return acc;
    }, { length: 0 }));
    
    const maxLength = maxLengths.reduce(
      (sum, current) => sum + current, 
      minGap
    );
    
    const res = normalizedInput
      .map(({
        name, 
        price, 
        length
      }) => name + ' '.repeat(maxLength - length) + price)
      .join('\n');
    Ответ написан
    4 комментария