给对象属性一个数组值?

Tim*_*Tim 6 javascript

我有以下代码,我想让甲板阵列充满52个不同的卡.每当我运行代码并且卡片对象被警告时,它显示为"[对象对象]".

有人可以向我解释为什么会这样做并解决这个问题?

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

Mat*_*ron 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

注意

您应该考虑使用console.log()而不是alert()因为它更不那么烦人且更容易在控制台中调试(点击F12).但是要小心运行IE9或更低版本的生产代码,因为当开发者控制台没有打开时,他们的javascript引擎会崩溃.