2011-12-22 10 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 + "'"; 
} 

をそして、私はそれを実行したとき、私はメッセージを取得します:gameId「game1」はダニでインスタンス化

GameControllerがありgameId「game1」

それはどのように両方のプロパティの値として正しく「game1」を印刷したときに失敗する===ことができますか?テストとして、私が働くこれを作っています

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

誰もが私の===は失敗することができますが、エラーメッセージは同じテキストを出力する方法のいずれかtheoritical説明のアイデアを持っていますか?両方の値の型はobjectです。

ありがとうございます。

UPDATE:すべての応答が指摘(及びそのためのありがとう)として

PROBLEM

これは種類が同一ではなかったことが、判明しました。 1つは文字列ではなく、= 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; 
} 

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"+varを行う際に、vartoString形式に自動的に変換されていること

注:

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

ちょっと、あなたの例は私の例より簡単です:D +1 – Amadan

2

トリプルに等しいタイプが同様に同じでなければならないことを意味します。つまり、変数id1id2は同じタイプではありません。

例では、両方の値が "game1"の文字列になるようにgg2を定義しているため、その場合は3倍の等価が機能します。

あなたはplayerTick.gameIdthat.gameIdの種類を確認する必要があります。それらの1つは文字列ではありません。型がオブジェクトである場合

+1

[それはそのようなことを意味しません。](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 

は基本的には、両方が同じ文字列にレンダリングする二つのことがありますが、同じではありません。