2016-10-02 72 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中比较字符串的正确方法。如果两个操作数都是字符串,则使用哪一个并不重要。如果任何一个操作数可能是也可能不是字符串,如果您希望抽象的相等转换规则(很复杂)或===(如果您希望在操作数不是相同类型时比较为假)使用==