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

Javascript-===和字符串的奇怪问题,javascript,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具有gam

我有以下代码:

...
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“game1”

如果将“game1”正确打印为两个属性的值,那么===怎么会失败?作为一项测试,我做了以下工作:

var g = "game1";
var g2 = "game1"
alert(g === g2); // Alerts true
是否有人对my===如何失败但错误消息打印相同文本的理论解释有想法?这两个值的类型都是对象

先谢谢你

更新:

问题

事实证明,正如所有的回复所指出的(谢谢),这些类型并不完全相同。其中一个不是导致===计算为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;
}
修复

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
    }

三重相等表示类型也必须相等。显然,变量
id1
id2
的类型不同

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


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

理论上,如果类型是object

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

基本上,有两个东西都呈现为相同的字符串,但不相同。

您说它们是对象,所以它们当然不相同:

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

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

请注意,当您执行
“hello”+var
var
将自动转换为
字符串
格式:

null + "hello" === "nullhello"

这两个变量是同一类型的吗?因为这就是g2的分号。我会编辑并添加它;但是我不知道你是否复制/粘贴了原始代码。你确定它们都是字符串吗?当这些变量存在时,试着打开浏览器的控制台,看看
typeof id2
typeof id1
告诉你什么。嘿,你的例子比我的例子简单:D+1这不是JavaScript的工作方式。对我来说似乎很准确。