2011-12-22 37 views
2

我有這樣的代碼:使用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與遊戲ID「的Game1」實例化,但是蜱gameId'game1'

如果打印正確的'game1'作爲兩個屬性的值,它會如何失敗?作爲測試,我做了這其中工程:

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

任何人不會有我的===如何失敗,但錯誤信息打印相同的文本theoritical解釋的想法?這兩個值的類型都是對象。

提前謝謝。

UPDATE:

技術問題

原來,作爲所有答覆指出的(和三江源爲該),該類型是不相同的。其中一個不是導致===評估爲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

是同一類型的兩個變量?因爲那是'==='在那裏檢查 –

+0

忘記了g2的分號。我會編輯並添加它;但我不知道你是否從原始代碼複製/粘貼。 – Dave

+0

你確定他們都是字符串嗎? – Cameron

回答

6

你說他們是對象,所以他們當然是不一樣的:

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

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

的變量「持物」實際上是對象只是引用。除非兩個變量都指向內存中完全相同的對象,否則無論內容如何,​​除非您比較g.toString() === g2.toString() //true,否則它們將不相等。

注意,當你做"hello"+varvar自動轉換toString形式:

null + "hello" === "nullhello" 
+0

嘿,你的例子比我的例子簡單:D +1 – Amadan

2

三重等於意味着類型必須相等。顯然,你的變量id1id2不是同一類型。

在您的示例中,您將gg2定義爲都是值爲「game1」的字符串,所以三等於在此情況下適用。

您需要檢查playerTick.gameIdthat.gameId的類型。其中之一不是一個字符串。

+1

[It means no such thing。](http://stackoverflow.com/questions/7615214/in-javascript-why-is-0-equal-to-false-but-not-false-by-itself/7615342# 7615342)這不是JavaScript的工作原理。 – Incognito

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators#Identity_.2F_strict_equality_(.3D.3D.3D)對我來說這似乎相當準確。 –

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 

基本上,你有兩件事情,都呈現相同的字符串,但也不盡相同。