Javascript - ===和字符串的奇怪问题

时间:2011-12-22 17:33:22

标签: javascript

我有这段代码:

...
var id1 = playerTick.gameId;
var id2 = that.gameId;
if(id1 === id2)
 {}else{
throw "GameController instantiated with gameId '" + id2 + "' but tick has gameId '" + id1 + "'";
}

当我运行它时,我收到消息:

GameController用gameId'game1'实例化但是tick有gameId'fame1'

如果正确打印'game1'作为两个属性的值,= =如何失败?作为测试,我已经做到了这个:

var g = "game1";
var g2 = "game1"
alert(g === g2); // Alerts true

有没有人知道我的===如何失败的任何理论解释但错误信息打印相同的文字?两个值的类型都是对象。

提前谢谢你。

更新

问题

事实证明,正如所有回复所指出的那样(并且对此而言),这些类型并不完全相同。其中一个不是导致===评估为false的字符串。

使用此函数检索查询参数后出现问题:

function querystring(key) {
       var re=new RegExp('(?:\\?|&)'+key+'=(.*?)(?=&|$)','gi');
       var r=[], m;
       while ((m=re.exec(document.location.search)) != null) r.push(m[1]);
       return r;
}

THE FIX

function querystring(key) {
           var re=new RegExp('(?:\\?|&)'+key+'=(.*?)(?=&|$)','gi');
           var r=[], m;
           while ((m=re.exec(document.location.search)) != null) r.push(m[1]);
           return r.toString(); // Ensures that a string is returned
    }

3 个答案:

答案 0 :(得分:6)

你说他们是对象,所以他们当然不一样:

var g = new String("game1"),
    g2 = new String("game1");

g===g2 //false
g==g2 //false

“保持对象”的变量实际上只是对象的引用。除非两个变量都引用内存中完全相同的对象,否则无论内容是什么,它们都不相等,除非您比较g.toString() === g2.toString() //true

请注意,当您执行"hello"+var时,var会自动转换为toString格式:

null + "hello" === "nullhello"

答案 1 :(得分:3)

理论上,如果类型是对象......

id1 = { toString: function() { return "game1" }, player: "monkey" };
id2 = { toString: function() { return "game1" }, player: "tiger" };

id1 === id2                        // false
"id1: " + id1 + "; id2: " + id2    // id1: game1; id2: game1
typeof(id1)                        // object

基本上,你有两件事都渲染到同一个字符串,但不一样。

答案 2 :(得分:2)

三等于意味着类型也必须相等。显然,您的变量id1id2的类型不同。

在您的示例中,您将gg2都定义为值为“game1”的字符串,因此在这种情况下三等号有效。

您需要检查playerTick.gameIdthat.gameId的类型。其中一个不是字符串。