【问题标题】:Javascript String Compare == sometimes failsJavascript 字符串比较 == 有时会失败
【发布时间】:2009-05-14 14:08:32
【问题描述】:

以下代码有时如何评估为假?

(transport.responseText == '1' || 
 transport.responseText == 'CARD_VALID')

我的 JavaScript 代码:

if (transport.responseText == '1' || 
    transport.responseText == 'CARD_VALID') {
    // do something.
}
else if (transport.responseText == 'CARD_INVALID' || 
             transport.responseText == 'INVALID_CHECKSUM') {
    // do something else....
}
else {
    new Ajax.Request('/report_error.php?responseText='+transport.responseText);
    // report error to user
}

当字符串相同时,什么会导致 JavaScript 字符串比较 == 返回 false?

【问题讨论】:

  • JavaScript 相等运算符 == 没有错误,它不会失败。如果左侧和右侧的字符串内容相同,则返回 true。如果它返回 false 那么: 1. 字符串不一样。 2.一个字符串前后有空格,或3.一个字符串中有隐藏的控制字符或unicode字符。
  • 我通过添加.trim() 解决了,但在比较其他值时也可以使用.toString()

标签: javascript string compare


【解决方案1】:

双等号是 Javascript 中比较字符串的合适方法,它返回 false,然后一个字符串的左右可能有空格。

在字符串末尾加上.trim(),我的比较应该开始起作用了:

var panel = response.substr(0, response.indexOf("<")).trim();
if(panel == "combo"){
    //do something
}

【讨论】:

  • 哇,这个问题太老了,但感谢您的回答。我可能试过了,但谁知道……那是三年多以前的事了。对于遇到此问题的其他人:请尝试此操作。如果可行,请在此处发表评论,我会将此答案标记为正确!
  • 是的。这是一个很好的提示。我也在比较“相同”(即使是可见的空格)字符串,但它们不匹配,因为其中一个有换行符或回车符(或其他东西),当我试图弄清楚什么时没有打印出来错了。
  • 应该真正使用等价比较:if (panel === "combo")。
  • 我有相反的问题,两个截然不同的字符串返回相等,这让我大吃一惊。
  • 你拯救了我的理智 - 快速检查 .length 证明我的两个看起来相同的字符串实际上并不相同!
【解决方案2】:

我有一个类似的问题,两个明显相同的字符串不相等,我正在拔头发试图解决它,所以我这样做了:

for (var c=0; c<string_1.length; c++) {
    if (string_1.charCodeAt(c) != string_2.charCodeAt(c)) {
        alert('c:'+c+' '+string_1.charCodeAt(c)+'!='+string_2.charCodeAt(c));
        valid = false;
    }
}

我发现一个字符串的最后一个字符是 10,而另一个字符串的最后一个字符是 13,我以为两个字符串都是空终止的,但事实并非如此。

【讨论】:

    【解决方案3】:
    A1 = "speed"
    A2 = "speed" 
    
    if(A1 == A2)  => Error !!!
    

    在控制台中使用此测试:

    escape("speed")
    

    结果:“速度”

    escape(A1)
    

    result: "speed%0D" => 这是问题 %0D !!!

    escape(A2)
    

    结果:“速度”=> 好的!!!

    使用正确的代码:

    if(A1.slice(0, -1) == A2) This is OK!
    

    【讨论】:

    • 欢迎来到 SO。格式化您的答案并尝试提供一些 cmets。尽可能提供实际答案而不是伪代码(包括现在)。您的答案应该为其他用户提供的宝贵答案添加一些内容。一个新的方法或点,否则它是多余的。
    • 他们说一张图片等于1000字!源代码也可以这样说!人们写他们的想法,但有时很难理解这个想法以及如何检查它。就我个人而言,我总是更容易看到三行代码,而不是理解人们用大量文字解释时的想法。当然,一旦利益看不出来,我就不多写评论了。问候!
    • 当心!现在 escape 已被弃用并被 encodeURI w3schools.com/jsref/jsref_encodeuri.asp 取代
    【解决方案4】:

    我遇到了同样的问题,我注意到我正在比较两个对象

    为了解决这个问题,我不得不使用

    JSON.stringify(user._id) === JSON.stringify(userId) // true 
    

    【讨论】:

    • 避免使用图片。文本更适合复制和搜索。
    【解决方案5】:

    尝试使用=== 精确匹配(类型和值)。这是 javascript 中推荐的比较运算符。

    检查字符串的数据类型以确保,并在两个字符串中查找隐藏的 unicode 或控制字符。

    【讨论】:

      【解决方案6】:

      如果您想要一些不那么复杂的东西并且您正在处理数字值,请使用

      parseFloat()
      

      像魅力一样工作

      【讨论】:

        【解决方案7】:

        我建议您使用normalization 最好使用“NFKC”或“NFKD”,因为它们似乎将不间断空间标准化为常规空间。

        所以你可以把你的代码写成:-

        string1.normalize("NFKC") === string2.normalize("NFKC")
        

        【讨论】:

          【解决方案8】:

          在输入该代码块之前尝试将responseText 的值捕获到不同的变量中,以防该变量在那里的某处被更新。

          我没有太多直接使用 XmlHttpRequest 的经验,但我知道 javascript 有很多地方使用对接口对象的可变引用,这些引用在执行期间会发生变化,而不是简单的值。

          【讨论】:

          • 好主意,但这可能吗?我以为 JS 是单线程的。
          • 感谢您的回答。这对我来说很有意义,所以我尝试了一下。但是,我们仍然收到错误日志“CARD_VALID”,暗示 JS 评估 ('CARD_VALID' == 'CARD_VALID') 为假。还有其他想法吗?这是数百个成功案例中的一两个。唯一的“模式”是大多数用户代理似乎是 IE7 或 IE7,但是有一个是 IE6...
          【解决方案9】:

          Java servlet 可以发送字符串,即

          out.println("CARD_VALID");

          out.print("CARD_VALID");

          这些在 Javascript 中可能看起来相同,但在第一种情况下,末尾有空格。

          【讨论】:

            【解决方案10】:

            选角对我有用

            if (timeSlots[j].id + '' == product.timeSlots[k].id + '') {
            }
            

            【讨论】:

              猜你喜欢
              • 2012-06-04
              • 1970-01-01
              • 1970-01-01
              • 2016-07-05
              • 2023-04-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多