JavaScript字符串的奇怪比较

4
我有一个ajax函数,它发送电子邮件到某个地方,并从一个包含类型为success或error的json对象的服务器接收响应。
$("#submit_btn").click(function(event) { 
    event.preventDefault();

    var post_data = {
        'email': $("#email").val()
    };
    $.post( "sendEmail.php", post_data ).done(function(response){
        if(response.type == 'success'){
            $("#sentmail").fadeIn("slow")
            setTimeout(function(){
                $("#mail").val("Enter your email here");

                $("#sentmail").fadeOut("slow")  
            },3000);
        }
        else{
            $("#sentmailfail").fadeIn("slow")
            setTimeout(function(){
                $("#mail").val("Enter your email here");

                $("#sentmailfail").fadeOut("slow")  
            },3000);
        }
    },"json")
});

有趣的是,如果我使用console.log(response),例如我得到了{"type":"success","desc":"something"},然后紧接着console.log((response.type == "error")) // TRUE

但是,如果我将响应的控制台日志记录分配给一个变量,例如a = {"type":"success","desc":"something"},那么a.type == "error"则为false。

有人能解释一下吗?


1
我想问的是,你什么时候尝试使用 console.log(response) - amphetamachine
1
{"type":"success" ... type == "error" 嗯...很明显你漏掉了一些东西,因为你的例子完全不对。需要更详细的例子才能确定问题所在。 - user578895
1个回答

4

如果console.log(response)的输出结果为

{"type":"success","desc":"something"}

如果 response 仍然是一个字符串(包含 JSON),那么它就没有 type 属性:

> "foo".type == "error" // `undefined` is never equal to a string
false

在控制台中,对象通常看起来不同:

> console.log({"type":"success","desc":"something"})
Object {type: "success", desc: "something"} // in Chrome and Firefox at least

解决方案: 首先解析该字符串:

response = JSON.parse(response);

与jQuery相关:

我注意到您打算让jQuery为您解析JSON,但您正在向错误的函数传递"json"。您需要将其传递给$.post(...)而不是.done(...)

$.post("sendEmail.php", post_data, "json").done(...);
// instead of 
// $.post("sendEmail.php", post_data).done(..., "json");

那么您就不需要手动解析它了。
相关链接:如何在JavaScript中解析JSON?

我尝试手动解析JSON,但没有改变任何东西,将"json"移动到.post方法中也没有任何作用。在if语句之前,我使用console.log输出响应,然后我console.log(response.type) // "error",然后我console.log(response.type != "error") // true - Иван Божков
console.log(response.type.length) 输出什么? - Felix Kling
它输出了“找不到未定义的长度属性”。我只写了JSON.parse(response),没有将其分配给任何变量,这就是问题所在。谢谢! - Иван Божков

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接