6

次のコードがあり、デッキ配列を 52 枚の異なるカードでいっぱいにしたいと考えています。コードを実行してカード オブジェクトにアラートが表示されるたびに、'[object Object]' と表示されます。

誰かがなぜこれを行うのか、この問題の解決策を説明できますか?

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"];
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"];
var deck = []; 

for (var i = 0; i < suits.length; i++) {
    for (var j = 0; j < ranks.length; j++) {
        var card = {rank: ranks[j], suit: suits[i]};
        deck.push(card);
        alert(card)
    }
}
4

5 に答える 5

6

なぜこれを行うのか

これは完全に正常です。作成したカード オブジェクトは、単にメソッドの実装alert()がないため、を実行するときにそれ自体を表現する方法を知りません。toString()

あなたの問題の解決策

次のように、各カード オブジェクトに無名toString()関数の実装を指定してみてください。

var suits = ["Clubs", "Diamonds", "Hearts", "Spades"];
var ranks = ["A", 2, 3, 4, 5, 6, 7, 8, 9, 10, "J", "Q", "K"];
var deck = []; 

for (var i = 0; i < suits.length; i++) {
    for (var j = 0; j < ranks.length; j++) {

        var card = {
                       rank: ranks[j], 
                       suit: suits[i],
                       toString : function() { return this.rank + ' ' + this.suit; }
                   };

        deck.push(card);

        //alert(card); // console.log doesn't block code execution
        console.log(card.toString());
    }
}

ノート

煩わしくなく、コンソール (F12 を押す) でデバッグしやすいため、console.log()代わりに使用することを検討する必要があります。alert()ただし、開発者コンソールが開かれていない場合、JavaScript エンジンがクラッシュするため、IE9 以下を実行する製品コードには注意してください。

于 2013-07-16T19:11:50.897 に答える