2016-10-02 71 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中比較字符串的正確方法。如果兩個操作數都是字符串,則使用哪一個並不重要。如果任何一個操作數可能是也可能不是字符串,如果您希望抽象的相等轉換規則(很複雜)或===(如果您希望在操作數不是相同類型時比較爲假)使用==