JavaScript 节点中的字符串比较失败

JavaScript string comparison fails in Node

我正在比较两个字符串。出于某种原因,无论我如何尝试比较它们,看起来它们似乎不相等,但它们确实相等。

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;
}

问题是 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中字符串的正确方法。如果两个操作数都是字符串,那么使用哪个都没有关系。如果其中一个操作数可能是也可能不是字符串,如果您想要抽象相等转换规则(这很复杂),请使用 == 或如果您希望在操作数不是时比较为假,请使用 ===不是同一类型。