2016-10-02 3 views
0

Я сравниваю две строки. По какой-то причине, независимо от того, как я пытаюсь их сравнить, кажется, что они не равны, но они есть.Сравнение строк в JavaScript не удается в узле

logger.trace("eval Str: "+util.inspect(evalStr)); 
logger.trace("Is next():" + evalStr == "next()"); 
logger.trace("Is next():" + evalStr.valueOf() == "next()".valueOf()); 
logger.trace(toHex(evalStr)); 
logger.trace(toHex("next()")); 

2016-10-02T12:10:55.446-04:00 - trace: eval Str: 'next()' 
2016-10-02T12:10:55.447-04:00 - trace: false 
2016-10-02T12:10:55.448-04:00 - trace: false 
2016-10-02T12:10:55.448-04:00 - trace: 6e6578742829 
2016-10-02T12:10:55.449-04:00 - trace: 6e6578742829 


function toHex(str) { 
    var hex = ''; 
    for(var i=0;i<str.length;i++) { 
     hex += ''+str.charCodeAt(i).toString(16); 
    } 
    return hex; 
} 

ответ

3

Проблема заключается в trace вызовах +, вы не сравнивая то, что вы думаете, что вы сравниваете. Вы хотите добавить явный () поэтому вы группируете так, как вы хотите, чтобы группа:

logger.trace("Is next():" + (evalStr == "next()")); 
// Note --------------------^-------------------^ 

Почему:

Вашего оригинальный код:

logger.trace("Is next():" + evalStr == "next()"); 

... оцениваются следующим образом:

logger.trace(("Is next():" + evalStr) == "next()"); 
// Note -----^----------------------^ 

... поэтому вы не видите Is next(): на выходе. "Is next():next()" == "next()" является ложным, так что ... :-)


== А или === являются правильным способом сравнения строк в JavaScript. Если оба операнда являются строками, не имеет значения, что вы используете. Если любой из операндов может быть или не быть строкой, используйте ==, если вы хотите, чтобы правила абстрактного преобразования равенства (которые были сложными) или ===, если вы хотите, чтобы сравнение было ложным, если операнды не являются одним и тем же типом.