我有这段代码:
...
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
}
答案 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)
三等于意味着类型也必须相等。显然,您的变量id1
和id2
的类型不同。
在您的示例中,您将g
和g2
都定义为值为“game1”的字符串,因此在这种情况下三等号有效。
您需要检查playerTick.gameId
和that.gameId
的类型。其中一个不是字符串。