for..in в Javascript дает неопределенное значение

Я работаю над расширением для Chrome, и мне просто интересно, как использовать «for..in» в Javascript. Позвольте мне объяснить проблему, которую я нашел, на примере:

Предположим, у меня есть volatile объект типа {prop1: "foo", prop2: "bar", ...}. Я хочу сохранить этот объект в строке с некоторым синтаксисом, например, "prop1=foo;prop2=bar;...". Вот код, который я использовал:

var fun = function(data) {
  var str = "";
  for (var i in data) {
    str += i + "=" + data[i] + ";";
  }
  return str;
};
log(fun({x:1, y:2}));

Этот fun возвращает следующую строку: undefinedx=1;y=2;.

Я действительно не понимаю, почему он следует такому поведению. Я знаю, что могу использовать JSON, чтобы «сформулировать» что-то подобное, но на самом деле я просто хочу понять, почему это происходит.


person Finalfire    schedule 23.07.2013    source источник
comment
За исключением двух синтаксических ошибок (опечатки, я думаю), код работает для меня.   -  person Niccolò Campolungo    schedule 24.07.2013
comment
@LightStyle Три, если вы посчитаете отсутствующий ; в конце инициализации fun, но вставка точки с запятой маскирует это. ;)   -  person cdhowie    schedule 24.07.2013
comment
Ну, это не совсем синтаксическая ошибка: P   -  person Niccolò Campolungo    schedule 24.07.2013
comment
Правильный. Я считаю это ошибкой, так же как считаю ошибкой случайное или неаккуратное использование глобальной переменной. (Но, конечно, парсер этого не делает.)   -  person cdhowie    schedule 24.07.2013
comment
рассмотрите возможность использования JSON.stringify() вместо ручной упаковки объектов в строки для последующего использования...   -  person dandavis    schedule 24.07.2013
comment
@LightStyle проверь мой комментарий в первом ответе.   -  person Finalfire    schedule 24.07.2013


Ответы (1)


Это точный код, который вы используете? Отсутствие + перед data[i] наводит меня на мысль, что это не так. Похоже, что str запускается неинициализированным, например:

var fun = function(data) {
  var str;
  for (var i in data) {
    str += i + "=" + data[i] + ";";
  }
  return str;
}
person John Kugelman    schedule 23.07.2013
comment
Да, именно так, я просто исправил опечатки в исходном вопросе. Извиняюсь. Во всяком случае, код у меня не работает, я продолжаю получать неопределенное значение в строке. Изменить: более простой код, который вызывает такое же поведение, выглядит следующим образом: var a = {x:1, y:2}; for(var i in a) { console.log(a[i]); } и он регистрирует 1, 2, а затем возвращает (?) undefined. - person Finalfire; 24.07.2013
comment
stackoverflow.com/questions/11108953/ ‹-- если вы используете Chrome, это проблема (я думаю, что то же самое в Firefox и других браузерах) - person Niccolò Campolungo; 24.07.2013
comment
@LightStyle о, хорошо, спасибо! Я подумал, что это странное поведение цикла for..in. - person Finalfire; 24.07.2013
comment
Нет, не волнуйтесь, это подтверждается этим простым примером: function foo() {return "foo";}. В консоли введите foo() --› foo, введите console.log(foo()) --› foo, а затем новую строку и undefined. @JohnKugelman Я имел в виду последнюю проблему, обнаруженную Finalfire, ваш ответ правильный;) - person Niccolò Campolungo; 24.07.2013
comment
@LightStyle А, теперь я следую. Коммент удален :) - person John Kugelman; 24.07.2013