Я заметил, что определенный код, который оценивает некоторые размеры обуви для сайта электронной коммерции и выводит их на экран, испортил заказ в 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 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 есть оптимизация, которая предпочитает Свойства объекта, которые являются числовыми, возможно, это связано с Branch Prediction или любым другим.
Если вы префикс клавиш объекта с любым символом, порядок остается незатронутым и работает по назначению - FIFO
Мне кажется, я помню, что я читал, что нет никаких гарантий относительно порядка свойств объекта, но в то же время это досадно до крайности и потребует значительных усилий для его фиксации только для пользователей хрома.
Любые идеи? это, вероятно, ошибка, которая будет исправлена?
отредактировать, теперь я обнаружил это как проблему в трекере ошибок v8:
http://code.google.com/p/v8/issues/detail?id=164
Похоже, что Blink не хочет исправлять это и останется единственным браузером, который это сделает.
обновить любая оптимизация хеш-таблицы webkit/blink, теперь пробилась в gecko (FF 27.0.1) - http://jsfiddle.net/9Htmq/ приводит к
7,8,9,7.5,8.5,9.5
. применяя_
, прежде чем ключи вернут правильный/ожидаемый порядок.обновление 2017 Люди по-прежнему сохраняют и редактируют это так. Это НЕ влияет на
Map
/WeakMap
,Set
и т.д. (как показано в обновленном основном примере)