Я создаю GreaseMonkey script, чтобы улучшить пользовательский интерфейс 10k инструментов Stack Overflow. Я столкнулся с невоспроизводимой и откровенно странной проблемой, которая запутала меня и других в JavaScript-зале в SO Chat. Нам еще предстоит найти причину после нескольких длительных отладки сеансов.
Проблематичный script можно найти здесь. Источник - Установить
Проблема возникает в строке 85, строка после комментария "vodoo":
return (t + ' (' + +(+f.offensive + +f.spam) + ')');
Это может показаться немного странным, но +
перед двумя переменными, а внутренняя скобка - для принудительного типа, внутренняя средняя +
- для добавления, а другая для конкатенации.
Ничего особенного, но наблюдательный читатель может заметить, что принуждение типа на внутреннем скобке не является необходимым, поскольку оба типа уже привязаны к числам, а результат принудительного ввода бесполезен, когда они все равно конкатенируются в строку. Не так! Удаление +
прерывает script, в результате чего 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 не появляется эта проблема, поэтому мне кажется, что это может быть проблемой с движком Firefox JavaScript или надстройкой Greasemonkey. Я прав?
Я могу найти в JavaScript-комнате, если вы хотите более подробно и/или хотите обсудить это.