Я заметил, что определенный код, который оценивает размеры обуви для сайта электронной коммерции и выводит их на экран, портит порядок в Chrome.
Данный JSON может быть:
{
"7": ["9149", "9139", "10455", "17208"],
"7.5": ["9140", "9150", "10456", "17209"],
"8": ["2684", "9141", "10457", "17210"],
"8.5": ["9142", "10444", "10458", "17211"],
"9": ["2685", "9143", "10459", "17212"],
"9.5": ["10443", "9144", "10460", "17213"]
}
... который увеличивает размеры пополам.
При преобразовании в объект и итерации по ключам естественный порядок соблюдается и выглядит следующим образом:
7, 7,5, 8, 8,5 и т. Д.
Но только в Chrome ключи, которые «выглядят» как круглые числа ВСЕГДА , сначала выходят из объекта, поэтому вывод цикла for ... in:
7, 8, 9, 7.5, 8.5, 9.5 ...
Object.keys(sizes); // ["7", "8", "9", "7.5", "8.5", "9.5"]
Вот пример теста: https://jsfiddle.net/wcapc46L/1/
Он влияет только на целые числаПохоже, что в Webkit / Blink есть оптимизация, в которой предпочитает Числовые свойства объекта, возможно, это связано с предсказанием ветвлений или чем-то еще.
Если вы префиксите ключи объекта каким-либо символом, порядок останется неизменным и будет работать как задумано - FIFO
Мне кажется, я помню, что читал, что нет никаких гарантий порядка свойств объектано в то же время это крайне раздражает и потребует значительных усилий для его устранения только для пользователей Chrome.
Есть идеи?это вероятно ошибка, которая будет исправлена?
edit Кроме того, теперь я обнаружил это как проблему на трекере ошибок v8:
http://code.google.com/p/v8/issues/detail?id=164
Похоже, Blink неЯ хочу исправить это и останусь единственным браузером, который это сделает.
update , какой бы ни был оптимизация хэш-таблицы, которую имел webkit / blink, теперь пробился в gecko (FF 27.0.1) - http://jsfiddle.net/9Htmq/ приводит к 7,8,9,7.5,8.5,9.5
.применение _
до того, как ключи вернут правильный / ожидаемый порядок.
обновление 2017 Люди все еще голосуют и редактируют это так - похоже, это НЕ влияет на Map
/ WeakMap
, Set
и т. Д. (Как показывает обновленный основной пример)