Я создаю скрипт GreaseMonkey для улучшения пользовательского интерфейса инструментов 10k, которые использует Stack Overflow.Я столкнулся с невоспроизводимой и откровенно странной проблемой, которая смутила меня и других в комнате JavaScript в SO Chat.Мы еще не нашли причину после нескольких длительных отладки сессий .
Проблемный скрипт можно найти здесь . Источник - Установить
Проблема возникает в строке 85, строка после комментария 'vodoo':
return (t + ' (' + +(+f.offensive + +f.spam) + ')');
Этоможет показаться немного странным, но +
перед двумя переменными и внутренняя скобка - для приведения типов, внутренняя середина +
- для сложения, а остальные - для объединения.
Ничего особенного, но наблюдательный читатель может заметить, что приведение типов во внутренней скобке не нужно, поскольку оба типа уже приводятся к числам, а результат принудительного ввода типов бесполезен, когда они в любом случае объединяются в строку.Не так!Удаление +
нарушает работу сценария, в результате чего f.offensive
и f.spam
объединяются, а не складываются вместе.
Добавление дальше console.log
только делает вещи более запутанными:
console.log(f.offensive + f.spam); // 50
console.log('' + (+f.offensive + +f.spam)); // 5, but returning this yields 50 somehow
console.log('' + (+f.offensive + +f.spam) + ''); // 50
Источник: http://chat.stackoverflow.com/transcript/message/203261#203261
Проблема в том, что это невоспроизводимо- запуск сценариев, таких как
console.log('a' + (+'3' + +'1') + 'b');
в консоли Firebug, дает правильный результат, как и
(function(){
return 'a' + (+'3' + +'1') + 'b';
})();
Даже извлечение больших кусков кода и запуск их в консоли не приводит к воспроизведениюэта ошибка:
$('.post-menu a[id^=flag-post-]').each(function(){
var f = {offensive: '4', spam: '1'};
if(f){
$(this).text(function(i, t){
// Vodoo - please do not remove the '+' in front of the inner bracket
return (t + ' (' + +(+f.offensive + +f.spam) + ')');
});
}
});
Тим Стоун в чате имеет инструкцию по воспроизведению для тех, кто ниже 10k.
Эта ошибка появляется только в Firefox - похоже, что в Chrome эта проблема не возникает, что позволяет предположить, что это может быть проблема либо с движком JavaScript Firefox, либо с надстройкой Greasemonkey.Я прав?
Меня можно найти в комнате JavaScript , если вы хотите больше подробностей и / или хотите обсудить это.