• Зачем в данном примере this, если с именем обьекта тоже работает?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    В вашем примере разницы нет и this удобнее только тем, что при переименовании "arr" не придётся ещё две замены делать.

    Хотя, если дальше вы используете наследование, то разница принципиальна. Например, создать новый объект, используя arr как прототип:
    var arr = {
      "name" : "Stive",
      "age" : 29,
      "all" : function() { return this.name + " " + this.age; }
    };
    var b = Object.create(arr);
    b.name = "Bill";
    b.age = 39;
    b.all();

    С this в arr код для b выполнится нормально и вернёт "Bill 39", а если в arr вместо this было прямое указание на arr, то вернёт "Stive 29".
    Ответ написан
    Комментировать
  • Почему неправильно работают операторы с 64 битным числом?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Самое большое целое в JS: (253 - 1)

    Минимальное целое: (-(253 - 1))

    (источник)

    Операнды всех битовых операций конвертируются в 32-х битовые целые со знаком представленные в дополнительном коде и с использованием порядка битов от "старшего к младшему".

    Битовые операции с 64-битными – никак. Бейте на два 32-битных.
    Ответ написан
  • Суть 3 строки,если можно подробно "по символам грубо говоря"?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    ! ! ~ s.indexOf( substring) – такая короткая запись означает «есть ли подстрока?»

    Как это работает. Метод объекта строки indexOf() возвращает найденное положение подстроки в строке: число от 0 и больше; или –1, когда подстрока не найдена. На деле часто требуется из этого получить true или false – когда интересует лишь, есть подстрока или нет, а позиция её безразлична. Из –1 нам надо получить false, а из всего остального true.

    Для этого используются побитовое НЕ ~ и логическое НЕ !

    ~ обладает замечательным свойством: только из –1 получается 0 (а из нуля –1): ~(-1) === 0

    ! является логическим оператором и его результат – true или false. Например, !5 === false, а !0 === true.

    Это почти то, что нужно, с точностью до наоборот – в случае 0 нужен false, а не-нуля true. Поэтому добавляем ещё одно логическое НЕ. Вот и получается !!~:
    !!~5 === true;
    !!~0 === true;
    !!~-1 === false;


    В вашем примере не один indexOf(), а в скобках перечислены несколько вариантов: (~s.indexOf('AAA') || ~s.indexOf('BBB')).

    || – это логическое ИЛИ. Проверяется слева направо, пока не найдётся первое выражение, которое конвертируется в true, и возвращается его значение как есть, без конвертации в true/false. Например:
    ( false || 5) === 5;
    ( 0 || 0 || 1 || 0) === 1;
    ( 5 || 1 || true) === 5;
    ( false || 0) === 0;


    Значит, несколько ~s.indexOf(substr) будут проверяться до тех пор, пока какой-то не вернёт не-нулевое значение.
    Ответ написан
    Комментировать
  • Как создать своего бота для vk "FAQ"?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Только оптимизация:
    1. минимизировать число вызовов API ВКонтакте. Для ответа 1 пользователю нужно а) пометить прочитанным входящее сообщение и б) отправить ответ. Это 2 вызова API. До 25 вызовов API можно упаковать в один execute() – так получится отвечать 12 пользователям за 1 вызов execute() и при лимите в 3 вызова в секунду – 36 пользователям в секунду.
    2. следить за кол-вом вызовов в секунду и не превышать этот лимит: где-то, например, в Redis, держать времена трёх последних вызовов к API. При желании выполнить очередной доставать эти времена и принимать решение: выполнять сразу или подождать N миллисекунд.
    3. очередь – сообщения обрабатывать не мгновенно при получении сигнала от callback api, а помещать их в очередь. Рабочий процесс берёт из очереди задачи и выполняет – группирует в пачки по 24 и отправляет – с учётом времени предыдущих трёх овтетов.

    При такой организации вам хватит одного слабенького сервера и вы сможете приблизиться к теоретическому пределу в 36 сообщений в секунду.
    Ответ написан
    8 комментариев
  • Как правильно написать бота вк?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Не отвечайте мгновенно. Помещайте задания на ответ в очередь.

    Так вы всегда впишетесь в лимит вк по числу вызовов методов апи на 1 токен, в секунду.
    Ответ написан
    3 комментария
  • Что такое выражение, литерал и инициализация в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    По-простому я бы объяснил так:
    • выражение – это любой кусок кода, который в итоге даёт значение. Напр. цифра 0 или a===b
    • литерал – это буквально записанное значение. Напр. 10 или "строка" или объект {a:10, b:20}
    • инициализация – придание начального значения. Напр. переменной при создании: var a = 10
    Ответ написан
    3 комментария
  • Насколько легко(или сложно) будет злоумышленнику похитить access_token из local storage?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Подробный разбор этого вопроса на английском языке. Вкратце – советуют использовать Cookies.
    Ответ написан
  • Как отложить выполнение обещания (promise)?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно «разорвать тред», обернув в setTimeout( ()=>{...}, 0):

    var promise = new Promise( function (ok, fail) {
      setTimeout( function() {
        console.log('1');
        ok();
      }, 0);
    });
    // Здесь функция обещания ещё не выполнена.
    console.log('2');
    promise.then(function () {
      console.log('3');
    });
    // 2 1 3


    Promise, не содержащий в себе асинхронного вызова, синхронно возвращает значение. То же самое, как:var promise = Promise.resolve( value);
    Ответ написан
  • Str.IndexOf в JavaScript?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    1) – поиск начинается со 2-й позиции вправо:
    01234567890123
    Widget with id
    ..|=>.......^


    2)
    var str = "Widget with id";
    
    alert( str.indexOf("Widget") ); 
    // 0 – прямо с нулевой позиции найдено совпадение
    
    alert( str.indexOf("id") );
    // 1 – находится первое же совпадение, после "W" идёт "id":
    // 01234567890123
    // Widget with id
    // .^............
    
    alert( str.indexOf("widget") ); // –1 значит «не найдено». W не равно w
    Ответ написан
    Комментировать
  • Как вычислить точную разницу между датами в годах?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Создаём два объекта Date, день рождения и сейчас. Чтобы гарантированно правильно получить из текстовой строки объект даты, надо привести её сначала к формату ISO 8601 – самое простое, заменить пробел на букву "T". Но такая дата будет в часовом поясе UTC, надо её скорректировать, добавив минуты из getTimezoneOffset(). Например, дата "2014-09-12 00:00:00" по Мск, это 11 сентября 21:00 по UTC. При сравнении из «сейчас» будем брать время по UTC – getUTCMonth() и т.п.

    Получив две даты, сравним их месяца, даты. Если нужна бОльшая точность, то ещё и часы, минуты, секунды:
    var sqlDT = "2014-09-12 00:00:00";
    var BD = new Date( sqlDT.replace(' ','T'));
    var Now = new Date();
    BD.setMinutes( BD.getMinutes() + Now.getTimezoneOffset()); // в UTC
    
    if( BD.getMonth() === Now.getUTCMonth()
      && BD.getDate() === Now.getUTCDate()
    ) {
      // ура! День рождения!
    }


    P.s. альтернативный вариант – подключить здоровенную библиотеку для работы с датами и временем – MomentJS, и найти подходящие методы в ней.
    Ответ написан
    Комментировать
  • Какой тип монетизации выбрать для SAAS сервиса?

    Тут вряд ли находится ЦА сервиса слайдшоу.

    Почему бы не двигаться путём проб и ошибок предлагая сегментам аудитории разные планы оплаты – и сравнивая, смотреть, что лучше работает.

    Или взять 10–20 человек, которые могли бы быть вашими клиентами, и, индивидуально показав им сервис, проинтервьюировать – надо понять, что с их точки зрения обладает какой относительной ценностью среди фишек вашего продукта.
    Ответ написан
  • Почему градиент в photoshop полосатый?

    В опциях градиента включите галочку Dither
    Ответ написан
    Комментировать
  • В чём разница между background и background-color?

    sergiks
    @sergiks Куратор тега Веб-разработка
    ♬♬
    CSS свойство background – это просто сокращение, позволяющее одним значением установить сразу несколько из свойств background-*:
    • background-clip
    • background-color
    • background-image
    • background-origin
    • background-position
    • background-repeat
    • background-size
    • background-attachment

    Указанные значения (в любом порядке) устанавливают свойства точно так же, как и отдельные инструкции. Не указанные сохраняют значения по умолчанию.

    Таким образом, background: #F90 полностью эквивалентен background-color: #F90

    Например, background: #F90 url(fon.jpg) repeat-x равен
    background-color: #F90;
    background-image: url(fon.jpg);
    background-repeat: repeat-x;


    Цвета – разные цветовые модели бывают удобны для разных задач. Например, в модели HSL легко «гасить» свет, изменяя только его компоненту L (яркость), или только уменьшая насыщенность S. Или получить палитру из нескольких цветов, одинаково ярких-сочных, но равномерно разбросанных по кругу оттенков, равномерно раскидав их H по цветовому кругу, а S и L оставив одинаковыми.
    Ответ написан
    Комментировать
  • Самые крупные проекты на node.js?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    • Walmart
    • E-bay / PayPal
    • Microsoft (Azure)
    • LinkedIn
    • Yahoo
    • Google
    • Yammer (приобретён Microsoft)
    • Netflix
    • Uber
    источник
    Ответ написан
    2 комментария
  • Как организовать работу скрипта на другом ресурсе?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Можно сделать калькулятор на JS, чтобы он отправлял запросы к вам на сервер, и в ответ получал результат вычислений. При этом для выполнения кросс-доменного запроса от вашего сервера потребуется отдавать заголовок "Access-Control-Allow-Origin" с указанием домена, с которого поступил запрос, иначе браузер клиентов его не покажет - политика безопасности кросс-доменных запросов. И вам польза – сможете собирать статистику запросов.

    Т.о. при регистрации будете отдавать клиенту код с каким-то ключём, который на вашем сервере можно однозначно преобразовать в один из зарегистрированных доменов. И если такой нашёлся – вы в заголовках ответа будете отдавать "Access-Control-Allow-Origin: tot_domen.tld"
    Ответ написан
  • Как можно реализовать алгоритм шифрования TEA на php?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    Взять готовую реализацию и надеяться, что она хороша: rryqszq4/tea-php
    Ответ написан
    Комментировать
  • Есть ли рандомайзер вКонтакте среди репостов всей ленты (диапазону постов)?

    sergiks
    @sergiks Куратор тега ВКонтакте
    ♬♬
    Задача нетипична, поэтому вряд ли в сервисах предусмотрен такой сценарий. В то же время реализовать такой выбор несложно с помощью API ВКонтакте:
    1. получить список записей и отфильтровать, оставив только входящие в период
    2. найти репосты
    3. проверить каждый, оставляя только закреплённые (поле is_pinned)
    4. выделить их авторов
    5. отсеять не-участников группы groups.isMember()
    6. выбрать из них трёх случайных
    Ответ написан
    Комментировать
  • Как правильно вытащить цифры из скобок с помощью регулярок?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Плюс допишите после \\d чтобы "одна или несколько" цифр отлавливались и вместо флага "i" поставьте "g" – глобальную замену. "i" (игнорирование регистра) тут не нужно – это же только цифры.

    .replace( new RegExp("\\d+", "g"), j++ )
    Ответ написан
    Комментировать
  • Как сделать что бы не дублировать код в JS?

    sergiks
    @sergiks Куратор тега JavaScript
    ♬♬
    Можно добавить параметр в функцию, и биндить его:
    var showSE = function( isSuccess, el) {
        el.parentNode.classList.remove('error');
        el.parentNode.classList.add('success');
        el.nextElementSibling.InnerHTML = isSuccess ? "" :  el.dataset.error;
      }
    var showError = showSE.bind(null, false);
    var showSuccess = showSE.bind(null, true);
    Ответ написан
    Комментировать