Ответы пользователя по тегу JavaScript
  • Почему этот код не работает с 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
    Делай добро и бросай его в воду.
    Первый алерт ставит на паузу дальнейшее выполнение скрипта, пока вы не нажмёте ОК.
    Как только вы закрываете первый алерт, происходит вывод в консоль, а сразу затем происходит второй алерт, который также ставит на паузу всю работу скрипта, но в консоли уже есть сообщение.
    Ответ написан
    Комментировать
  • Как передать значение в объект переменной, чтобы она стала и ключем, и значением?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Нужно заранее хранить где-либо название переменной в виде строки.
    let obj = {};
    let myVar = 123;
    let myVarName = "myVar";
    
    obj[myVarName] = myVar;


    Как вариант, можно изначально хранить данные в каком-то объекте в виде ключ-значение, тогда можно будет также извлекать в виде пары ключ-значение и передавать в другой объект.
    let some_obj = { myVar: 123 };
    //Object.keys(some_obj); // Все ключи
    let obj = {};
    for (let key in some_obj) obj[key] = some_obj[key];
    Ответ написан
    Комментировать