partyzanx
@partyzanx

Почему 07 это строка, а не число?

Побочный эффект цикла for (var code in codes) такой, что если ключи объекта являются числами, то он их сортирует по порядку. Но почему "07" это строка, а "7" это число?



var codes = {
"07": "Россия",
"038": "Украина",
"01": "США"
};

for (var code in codes) {
var value = codes[code];
code = +code;

alert( code + ": " + value ); // 7, 38, 1 во всех браузерах
}


var codes = {
"7": "Россия",
"38": "Украина",
"1": "США"
};

for (var code in codes) {
var value = codes[code];
code = +code;

alert( code + ": " + value );   // 1, 7, 38 во всех браузерах
}
  • Вопрос задан
  • 314 просмотров
Решения вопроса 1
Ключи свойств объекта это всегда строки. Но, поскольку объекты, по задумке разраба могут быть итерируемими, как в твоем примере - реализация javascript-a подрузамевает для них всякие финтиплюшки, в том числе и такую вот сортировку. Которая работает только для свойств с целочисленными ключами! Как движок, перебирая свойства поймет, что очередной ключ, по смыслу, представляет из себя целое число? Он конвертнет его в number, округлит, и преобразует обратно в string. Если процедура никак не изменила значение ключа, то это целое число, и алгоритм отрабатывает корректно.

String(Math.trunc(Number("7"))) // 7
String(Math.trunc(Number("07"))) // 7

Как видишь, после такой конвертации, исходная 07 превращается в 7, поэтому движок при сортировке такой ключ за целое число не сочтет и проигнорирует.

Подробнее здесь: https://learn.javascript.ru/object#tsikl-for-in
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы