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的工作方式。对我来说似乎很准确。