Проблема с приведением типов и конкатенацией строк в JavaScript в скрипте Greasemonkey в Firefox

Я создаю сценарий 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) + ')');
        });
    }
});

Тим Стоун в чате имеет инструкцию воспроизведения для тех, кому меньше 10к.


Эта ошибка появляется только в Firefox - Chrome, похоже, не проявляет этой проблемы, что наводит меня на мысль, что это может быть проблема либо в движке Firefox JavaScript, либо в надстройке Greasemonkey. Я прав?

Меня можно найти в комнате JavaScript , если вы хотите получить более подробную информацию и / или обсудить это.

12
задан Sean Patrick Floyd 17 December 2010 в 10:30
поделиться