Сравнение строк JavaScript не удается случайно - PullRequest
7 голосов
/ 10 октября 2011

У меня довольно странная ошибка, возникающая в моем приложении JS на случайной основе.По сути, скрипт не может точно сравнить две строки.Точнее говоря, время от времени не видит две одинаковые строки как идентичные: ('blah' == 'blah') возвращает false.

Самое смешное, что при другой попытке эти две строки могут быть признаны идентичными (оператор возвращаетtrue).Мне так и не удалось выяснить закономерность.Я также пытался использовать === вместо ==;это не помогло.

Я не мог придумать лучшего способа продемонстрировать и доказать эту нелепую ошибку, кроме как сделать запись скриншота.Итак, вот оно: http://www.screenr.com/klOs. Я продолжаю давать правильные ответы на каждый тест в этом видео, но ближе к концу вы узнаете, как мои ответы для «Японии» и «Тайваня» будут считаться «неправильными»;консоль также покажет заданную строку ответа, правильную строку ответа и результат их сравнения (false? !!).

Так что может быть причиной такого странного поведения и какЯ могу исправить это?

Вы можете увидеть код с оператором сравнения в скринкасте.«Params.givenAnswer» происходит непосредственно от текстовой метки кнопки:

//*** Options for answering the card quiz
quizOptions = new Ext.Panel({
        id: 'quizOptions',
        […………]
        listeners: {
            el: {
                scope: this,
                tap: this.checkAnswer
            }
        }
});


checkAnswer: function(container, element) {

    // Get the text value of the button clicked
    var answer = Ext.fly(element).dom.innerText;

    Ext.dispatch({
        controller: 'Practice',
        action: 'checkAnswer',
        givenAnswer: answer
    }); 
},

ОБНОВЛЕНИЕ Спасибо @JAAulde и @Mike!Я попытался включить в лог кавычки и тип var, и я получил такой результат:

enter image description here

Теперь понятно, почему сравнение строк не удается: кажется, чтодополнительный разрыв строки в первой строке.Это все еще очень странно, поскольку в предыдущей записи оно не появилось в виде пустой новой строки, и, что наиболее важно, оно появляется там случайным образом (обратите внимание, как на этот раз «Тайвань» был принят без проблем).

Я включил простое правило удаления разрыва строки для строк ответа, и теперь все, кажется, работает нормально.Большое спасибо всем!

1 Ответ

0 голосов
/ 16 ноября 2011

Использование === является строгим сравнением равенства. Это означает, что тип данных и содержимое сравниваются. Они оба (данные и тип) должны совпадать и возвращать значение true.

Когда вы переключили свое строгое сравнение на ==, тест должен был работать, даже если типы данных были другими. Однако это не удалось из-за лишних пробелов.

...