Ответы пользователя по тегу JavaScript
  • Не понимаю, как это работает?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Похоже, что используется недокументированная особенность функции Array.sort()
    Ведь согласно документации, сравнивающая функция должна однозначно давать порядок, а в вашем примере получается, что compareFunction(a,b)===compareFunction(b,a)

    Насчёт a и b - они как бы есть, но они не указаны в параметрах, потому что не используются. Их можно указать, чтобы как бы соблюсти формальность, но смысла нет конкретно для вашего хитрого примера:
    arr.sort((a,b) => -0.5);

    Можете также заняться отладкой, чтобы понять, что происходит под капотом:
    arr.sort((a,b) => {console.log(a,b); return -0.5});


    Ваш пример крайне не удачный для целей обучения. Начинать лучше с простого и/или фундаментального, затем переходить к более сложному и/или частному.
    Ответ написан
    Комментировать
  • Почему этот код не работает с let?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Код не может просто взять и отказаться работать. Потому что это код.

    Если он получил управление, то он будет работать до тех пор, пока не закончит работу, или пока не случится ошибка (runtime).

    Если же код не получил управление, то тому тоже должна быть причина (например, конкретная синтаксическая ошибка).
    Ответ написан
    Комментировать
  • Как сохранить данные в js?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    let count = localStorage.count !== undefined ? localStorage.count : 0;

    Либо императивно:
    let count = localStorage.count;
    if (count === undefined) count = 0;

    Сохранение (в другом месте после инициализации), очевидно, также:
    localStorage.count = count;
    Ответ написан
    Комментировать
  • Циклы, рекурсия и массивы в JAVASCRIPT?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Ничего, разве что ; расставить. Я бы ещё длинную строку кое-как разбил, но это вкусовшина. Ещё я бы писал arr вместо array, ибо в других языках это зарезервированное слово, да и в js есть Array (а также obj вместо object), но не уверен, что это улучшит читабельность именно для новичков.
    Ответ написан
    Комментировать
  • Как поменять картинку через JS?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    document.querySelector("#picture1").src = "images/logodark.png";
    Ответ написан
    Комментировать
  • Как отменить действие на странице у кнопки через расширения в Chome?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Классический костыль:
    t = setInterval(()=>{
      // какое-то непотребство
      if (is_success) clearInterval(t);
    }, 200);

    В качестве улучшения можно считать попытки и прекращать выполнение через минуту, ибо всё равно нет смысла долбиться в стену.
    if (cnt>300) clearInterval(t);

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

    P.S. Да, костыли - это плохо. Но зато быстро и без напряга.
    Ответ написан
    Комментировать
  • Как поставить задержку в цикле for?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Если i - это обычный индекс, то вместо 2000 просто напишите 2000*i
    как-то так
    for(i in array) {
    	console.log(array[i]);
    	let j = i;
    	setTimeout(function() {
    		change(array[j])
    	}, 2000*i);
    }

    Хотя если массив слишком большой, то лучше вообще убрать цикл for и переписать его на setInterval(), например.
    Ответ написан
  • Зачем нужны знак впороса при получении данных?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    (data?.data?.stats)
    то же, что и
    (data && data.data && data.data.stats)

    То есть просто более короткая и более красивая запись.
    Ответ написан
    Комментировать
  • Как изменить скрипт, чтобы он искал не по id, а по классу?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Думаю, что так:
    $("table.someTable:visible").each(function() {
    Ответ написан
    Комментировать
  • Как сохранить класс у выбранных элементов — на которые был сделан клик?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Например, localStorage.

    Сначала нужно как-то помечать элементы, чтобы каждый из них можно было найти после перезагрузки страницы. Например, можно каждому дать уникальный id. Если это элемент с товаром, например, то часть id можно сделать с артикулом или добавить ещё атрибут.

    После этого при клике запоминать кликнутые элементы в localStorage. После перезагрузки страницы ваш код сможет извлекать информацию о том, какие элементы были кликнуты до этого, и присвоить им нужный класс.
    Ответ написан
    Комментировать
  • На собеседовании сказали, что не все функции - замыкания. Так ли это?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Очевидно, что любая функция может использовать внешние переменные. Причём, это верно практически для любого ЯП.

    Также локальные переменные внутри функции живут только в интервале времени, пока функция выполняется. И как только она завершает работу ("}" или "return"), локальные переменные (на стеке) уничтожаются.

    Даже если функция содержит другую функцию (и конечно же вызывает её), это не противоречит данному правилу, которое работает по умолчанию (т.е. даже без замыканий).

    Здесь важно, что переменные внутри функции являются врéменными, то есть обязаны быть уничтожены автоматически по завершении функции, в отличие от глобального пространства.

    Суть замыкания в том, что возникает как бы петля на стеке, запрещающая удалять временные переменные, на которые всё ещё ссылаются из вышестоящей области видимости. Это возможно, только если ЯП поддерживает замыкания, иначе такое будет считаться просто ошибкой.

    Так что в вашем примере и правда нет замыкания.
    Ответ написан
  • Обязательно нужно минифицировать файлы?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Не обязательно.
    Ответ написан
    Комментировать
  • Как переделать регулярное выражение lookBehind?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    цель: удалить все запятые из кода, кроме первой

    Не используя lookBehind, переделать можно так:
    let str = "1,,0,0,";
    let arr = str.split(',');
    str = arr.splice(0,1) + ',' + arr.join(''); // 1,00
    console.log(str);

    Но если нужно, чтобы не спотыкалось на ",1,00" или "1", то нужно ещё чуть-чуть переделать, добавив немного кода.
    Ответ написан
    Комментировать
  • Как написать регулярное выражение для роутов?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Просмотр назад нужен, если по-простому исправлять:
    regex = /(?<=:)([a-z0-9_]*)/gi;

    Ещё можно через цикл сделать. А так вообще зависит от условий. Если структура всегда такая, ровно 4 секции, ровно две из них с двоеточием, и меняются только a-z, то решение я написал выше, иначе нужно будет усложнять регулярку и/или сопутствующий код.
    Ответ написан
    2 комментария
  • Как исправить ошибку Cannot set properties of null (setting 'className')?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Для начала:
    var textel = document.getElementById(id)
    if (!textel) return console.error("HTML id not found:", id);

    А дальше методом исключения пробуй и щупай в консоли.
    Ответ написан
    Комментировать
  • Почему значение переменной изменилось до вызова функции?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что консоль получает значение counter и кеширует его в тот момент, когда вы кликаете на [[Scopes]].

    Проведите простой эксперимент:
    1. Вручную console.dir(innerFunc); Но не раскрывайте пока что.
    2. Несколько раз вручную innerFunc();
    3. Раскройте [[Scopes]] и посмотрите значение. Закройте.
    4. Ещё несколько раз вручную innerFunc();
    5. Снова раскройте [[Scopes]] и посмотрите значение.
    Ответ написан
    Комментировать
  • Как написать регульярное выражение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    если существует любые буквы или буквы + \n или отдельно \n то текст валиден.

    Ответ: ^[a-zA-Z]*\n?$
    Примеры:
    /^[a-zA-Z]*\n?$/.test("asd") //true
    /^[a-zA-Z]*\n?$/.test("asd\n") //true
    /^[a-zA-Z]*\n?$/.test("asd\n\n") //false
    /^[a-zA-Z]*\n?$/.test("asd asd") //false
    /^[a-zA-Z]*\n?$/.test("123") //false
    /^[a-zA-Z]*\n?$/.test("asd123") //false
    /^[a-zA-Z]*\n?$/.test("\nasd") //false
    /^[a-zA-Z]*\n?$/.test("\n") //true
    /^[a-zA-Z]*\n?$/.test("") //true

    P.S. "Любые буквы" включает также и их отсутствие, т.к. на пустом множестве верно любое утверждение. Если пустота не валидна, то это нужно оговаривать (и проверять) отдельно.

    P.P.S. Обычно перед тем, как скармливать "грязный" текст регулярному выражению, полезно выполнить .trim(), чтобы убрать пробельные символы в начале и в конце текста (но не в середине). Это избавит от необходимости помнить, что в конце может быть \n или случайно нажатый пробел (например, при вводе логина или пароля) и т.п.
    Ответ написан
  • Почему отличаются данные в массиве объектов при простом выводе и обращении по индексу?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Попробуйте в консоли такое:
    obj={x:0}; console.log(obj); obj.x=123;

    Надеюсь, понятно, что здесь произошло.
    Ответ написан
    Комментировать
  • Почему не находит переменную?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Потому что на получение данных нужно время.
    Ответ написан
  • Как обновить экран между alert()?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Первый алерт ставит на паузу дальнейшее выполнение скрипта, пока вы не нажмёте ОК.
    Как только вы закрываете первый алерт, происходит вывод в консоль, а сразу затем происходит второй алерт, который также ставит на паузу всю работу скрипта, но в консоли уже есть сообщение.
    Ответ написан
    Комментировать