Ответы пользователя по тегу JavaScript
  • Для чего if (chr == null) и почему мы пишем if (chr < '0' || chr > '9'), а не if (chr < 0 || chr > 9) и в чем суть?

    @nonamemovich
    2) почему мы пишем if (chr < '0' || chr > '9'), а не if (chr < 0 || chr > 9) и в чем суть
    Численное преобразование происходит в математических функциях и выражениях, а также при сравнении данных различных типов (кроме сравнений ===, !==)
    https://learn.javascript.ru/types-conversion
    https://habr.com/company/ruvds/blog/347866/
    так что вы правы. Просто в данном случае if (chr < '0' || chr > '9') отработает корректно. Имхо, лучше всё-таки учитывать преобразование различных типов при сравнении.

    3) для чего данная строка и зачем условие e = e || event;
    e = e || event;
    ~
    e = e || window.event;
    если event не был явно определён выше. Т.е. допустим так
    var event = new Event('keypress');
    document.getElementsByTagName('input')[0].onkeypress = function(e) {
          e = e || event;
    ...

    event == window.event; e!=event;
    и код будет работать не совсем корректно.
    через window.event также можно получить объект события. (javascript.ru/tutorial/events/properties здесь такой же код используется)
    Имхо, опять же, присваивание e = e || event; не нужно и корректно работает только в текущей ситуации. Функция обработчик даже в чистом js всегда с event во входных параметрах. Даже если в функции явно не задана переменная для входящего объекта события, его можно получить через arguments.
    Ответ написан
    Комментировать
  • Как распарсить данные с json?

    @nonamemovich
    если нужно преобразовать строку в json, тогда воспользоваться json.parse
    var jsonData = {};
    try {
      jsonData = JSON.parse(inputStr);
    } catch (e) {
      // обработать ошибку парсинга
    }
    Ответ написан
    Комментировать
  • Почему в данном случае в массив добавляется только последнее значение?

    @nonamemovich
    Важно понимать отличие ссылочных типов данных(object) от значимых типов данных(number, string, boolean, undefined, null, symbol (в ECMAScript 6)) в javascript.

    var a=6;
    var b = a;


    a и b будут указывать на разные участки памяти, изменение b не скажется на a.

    var obj = {
      prop1: "value1",
      prop2: 123
    }
    var refObj = obj;


    теперь obj и refObj это разные ссылки на один и тот же участок в памяти, присвоив refObj.prop1 = "valueChanged" вы измените содержимое участка памяти где размещено свойство объекта, и потому obj.prop1 == "valueChanged".
    Однако важно понимать что refObj и obj разные ссылки пусть хоть и ссылаются на один и тот же объект, переназначение одной из ссылок никак не скажется на другой ссылке refObj = [1,2,3,4,5] (массивы в js тоже объекты определённой структуры),
    obj всё также будет равен { prop1: "value1", prop2: 123}.

    При
    typeof dataJson[i].date != 'object'
    или вам нужно было сохранить ссылки в массив arrInfo
    можно просто пушить dataJson[i].date в массив.

    var ignoreObj = new Map(); // Map может использовать в качестве key всё что угодно( number, string, object)
    for(let i = 0; i < dataJson.length; i++) {
    	if(!ignoreObj.has(dataJson[i].date)) {       // ignoreObj.has(obj) скажет был ли obj добавлен в ignoreObj
    		arrInfo.push(dataJson[i].date);
    		ignoreObj.set(dataJson[i].date, 1);    // запоминаем объект, чтобы повторно не добавлять в массив
    	}
    }

    при typeof dataJson[i].date == 'object' изменение свойств dataJson[i].date скажется и на arrInfo.

    Либо если вы хотели "запомнить" объекты в текущем состоянии выполнить копирование свойств dataJson[i].date в новый объект.

    var ignoreObj = new Map(); 
    
    for(let i = 0; i < dataJson.length; i++) {
    	if(!ignoreObj.has(dataJson[i].date)) { 
    		var clone = { date:{} };                     // объект для "клонирования"
    		var clone.date = Object.assign({}, dataJson[i].date);         // непосредственно клонирование свойств <b>первого уровня</b> dataJson[i].date.
    		arrInfo.push(clone);
    		ignoreObj.set(dataJson[i].date, 1);  
    	}
    }

    при таком варианте изменение свойств dataJson[i].date не изменит содержимого arrInfo.

    Надеюсь я смог вам помочь, а не запутал ещё больше))).
    Ответ написан
    Комментировать