Ответы пользователя по тегу JavaScript
  • Лексическое окружение, контекст вызова. Почему это разные понятия?

    @undefined_title
    Лексическое окружение - это все локальные переменные функции, Определяется во время создания функции, есть еще понятие скоуп - это переменные которые доступны из другой функции и они берутся из замыкания.
    Контекст вызова - это ссылка на объект из которого вызывается метод, это определяется во время вызова( кроме es6 arrow), то есть `a.b.c.call()` a.b.c будет контекстом вызова для метода call.
    Ответ написан
    Комментировать
  • В чём разница между Array и Array.prototype?

    @undefined_title
    Array - Функция конструктор которая нужна для создания массивов.
    Array.prototype - Объект прототип, с набором методов, нужен для реализации прототипного наследования, к тому же имеется исключительно у функций, по умолчанию там храниться поле constructor, которое хранит ссылку на класс который создал этот объект.
    При создании объекта через оператор new в том числе и массива, объекту присваивается .__proto__ = Array.prototype. __proto__, это и есть сам прототип, объект хранилище методов, в нем ищется поле когда не находиться у самого объекта.
    Ответ написан
    Комментировать
  • Простым языком о замыканиях?

    @undefined_title
    Это когда ты при объявлении функции имеешь доступ к переменным окружающей функции, именно и для этого доступа к переменным замыкание и используется
    Ответ написан
    Комментировать
  • Как правильно узнать ли надлежит один промежуток времени другому?

    @undefined_title Автор вопроса
    !(returnDateTime <= startDate || pickupDateTime >= endDate)
    Ответ написан
    Комментировать
  • Что такое и зачем нужен новый тип данный Symbol в ES15?

    @undefined_title
    это надо для создания уникальных свойств, для избежания конфликта имен. Глобальный символ это тот который у тебя будет доступен с любого места программы, потому что символ объявленный переменной через var будет доступен только в текущей лексической области видимости, если ты объявил имя поля в объекте через символ, то достучаться к значению этого поля ты сможешь только через этот символ.

    Symbol - уникальный примитивный тип данных который был добавлен в ES6, каждый созданый символ никогда не будут равен друг другу, только если не сравнивается одна и та же ссылка символа, то есть поведение сравнения как и в объектов, но использовать объекты как уникальные поля мы не сможем, при объявлении имя поля как объект он будет переведет в примитив, потому что именами полей объекта могут быть только примитивы(строки), создать символ как объект через его конструктор не выйдет, для этого можно использовать конструктор Object, символ принимает строку, которая понадобится при дебаге. также символ это единствинный тип у которого нет литерала. символы позволяли бы создавать настоящие приватные свойства если бы не было метода Object.getOwnPropertySymbols который возвращает список всех символов объекта. Символы в основном используются не для создания приватных свойств, а для их уникальности, что бы имена не конфликтовали с именами сторонних разработчиков. Symbol.for('name') возвращает символ из глобального контекста, если такого нет создает и потом возвращает
    Ответ написан
    Комментировать
  • Два вопроса по props и PureComponent react?

    @undefined_title
    super - это функция(класс) от которой ты наследуешься, super(props) это функциональное наледование которое добавляет пропсы как поля в контекст функции то есть твоему новому объекту
    Ответ написан
    Комментировать
  • С чего начать создание калькулятора?

    @undefined_title
    начни с интерфейса через который пользователь будет вводит цифры
    Ответ написан
    Комментировать
  • Как проверить есть ли в ассоциативном массиве определённое значение JavaScript?

    @undefined_title
    в js {} - это обычный объект, в этом языке объекты играют две роли, как переносчики данных и как обычный объект

    Object.values(obj).some(value => !value);
    вернет true если есть хоть одно пустое значение, null, undefined, "", false и тд.
    (Object.values(obj).filter(value => !value)).length

    вернет количество пустых значений
    Ответ написан
    Комментировать
  • Как поставить условие?

    @undefined_title
    function toggleFullScreen() {
          if (!document.fullscreenElement &&    // alternative standard method
              !document.mozFullScreenElement && !document.webkitFullscreenElement) {  // current working methods
            if (document.documentElement.requestFullscreen) {
              document.documentElement.requestFullscreen();
            } else if (document.documentElement.mozRequestFullScreen) {
              document.documentElement.mozRequestFullScreen();
            } else if (document.documentElement.webkitRequestFullscreen) {
              document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
            }
            return true
          } else {
            if (document.cancelFullScreen) {
              document.cancelFullScreen();
            } else if (document.mozCancelFullScreen) {
              document.mozCancelFullScreen();
            } else if (document.webkitCancelFullScreen) {
              document.webkitCancelFullScreen();
            }
            return false
          }
        }
    
    toggleFullScreen() && document.body.style.display = ('none');


    или
    function toggleFullScreen() {
          if (!document.fullscreenElement &&    // alternative standard method
              !document.mozFullScreenElement && !document.webkitFullscreenElement) {  // current working methods
            if (document.documentElement.requestFullscreen) {
              document.documentElement.requestFullscreen() && return true;
            } else if (document.documentElement.mozRequestFullScreen) {
              document.documentElement.mozRequestFullScreen() && return true;
            } else if (document.documentElement.webkitRequestFullscreen) {
              document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT) && return true;
            }
          } else {
            if (document.cancelFullScreen) {
              document.cancelFullScreen() && return false;
            } else if (document.mozCancelFullScreen) {
              document.mozCancelFullScreen() && return false;
            } else if (document.webkitCancelFullScreen) {
              document.webkitCancelFullScreen() && return false
            }
          }
        }
    
    toggleFullScreen() && document.body.style.display = ('none');
    Ответ написан
  • Как перебрать массив?

    @undefined_title
    //var initialData = [1, 9, 4, 95, -3, 51, 6, 9, 4, 4,-9, 88, 27];
    var initialData = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2];
    
    var wayFirst = function(data) { 
      var sum = 0;
      data.forEach( (value) => {sum = sum + value} )
      return sum;
    }
    
    var waySecond = function(data) {
      var sum = 0;
      data.forEach( (value, i) => {
        i % 2 === 0 ?  sum = sum + value : false
      })
      return sum;
    }
    
    var wayThird = function(data) {
      var sum = 0;
      var iTemp = 0
      data.forEach( (value, i) => { 
        if (!iTemp || iTemp + 4 === i)  { 
          sum = sum + value;
          iTemp === 0 ? iTemp = 1 : iTemp = i;
        } 
      })
      return sum;
    }
    
    console.log(wayFirst(initialData));
    console.log(waySecond(initialData))
    console.log(wayThird(initialData))


    сделал через forEach но через reduce было бы немного компактнее

    или если надо получать не значения а засумированные элементы с интервалом
    const initialData = [2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
    
    let sumArrayWithInterval = (data, interval) => { 
      const sumWithIntervel = []; 
      let next = 0;
      data.forEach((value, i) => {
        if (next === i) { 
          const valueIndex = interval === 1 ? 1 + i : interval + 1 + i;
          
          data[valueIndex] ? sumWithIntervel.push(value + data[valueIndex]) : false
          interval === 1 ? next = i + interval + 1 : next = valueIndex + 1
        }
      })
      return sumWithIntervel;
    }
    console.log(
          sumArrayWithInterval(initialData, 1)
    );
    
    console.log( 
        sumArrayWithInterval(
          sumArrayWithInterval(initialData, 1)
        , 2)
    );
    
    console.log( 
      sumArrayWithInterval(
        sumArrayWithInterval(
          sumArrayWithInterval(initialData, 1)
        , 2)
      , 4)
    );
    Ответ написан
    Комментировать
  • Зачем нужен декоратор?

    @undefined_title Автор вопроса
    Пример из js. Писал для себя, еще не проверял с другими источниками на сколько это "правильный декоратор"
    testDecorator = function(func1, func2) { return function(a, b) { return func1( func2(a, b) ) } }
    func1 = a => return a * a
    func2 = (a, b) => { return a + b }
    countSome = testDecorator(func1, func2)
    countSome(2, 2); // 16
    countSome(2, 3); // 25

    желаю увидеть комментарии по поводу этого декоратора
    Ответ написан
  • Как уведомлять о новых записях в БД?

    @undefined_title
    реализовать что то типо паттерна observer
    Ответ написан
    Комментировать
  • Где разместить логику работы с Facebook API в React/Redux SPA?

    @undefined_title
    запрос делать в экшинах, менять состояние в редьюсерах, используй react-redux-middleware
    Ответ написан
    Комментировать
  • Как написать функцию конструткор которая возвращает один и тот же обьект?

    @undefined_title Автор вопроса
    var a = new F();
    var b = new F();
    
    alert(a == b);
    
    function F() {
    	if (F.instance) {
    		return F.instance
    	}
    	F.instance = this;
    }
    Ответ написан
    3 комментария