2013-07-16 150 views
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) 
    } 
} 
+0

您可以提醒'card.rank'或'card.suit',但不能'card'。 – DevlshOne

+0

[如何提醒JavaScript对象](http://stackoverflow.com/questions/3580754/how-to-alert-javascript-object)或[打印JavaScript对象的内容?](http:// stackoverflow。 com/questions/1625208/print-content-of-javascript-object) – Bergi

回答

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()); 
    } 
} 

注意

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

+0

我要么使用'alert(card)'(显式'alert(card.toString())')*或*'console。日志(卡)',而不是它们的组合:-) – Bergi

+0

当然,这就是为什么我在示例中评论了alert()调用。 ;) –

+0

谢谢,我对console.log()和alert()感到困惑,现在都在工作。 – Tim

0

这是一个对象如何表现,其toString方法产出了这一点,以查看其内容使用

alert(JSON.stringify(card)); 
+0

声明:当你有一个相当新的浏览器时,JSON.stringify非常适合调试。令人失望的公众使用的浏览器不支持它,所以只要确保有后备,或删除生产代码的日志记录即可。 – Katana314

0

FIDDLE DEMO

这个替换您的警报 - >警报(JSON .stringify(card))

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(JSON.stringify(card))//CHANGE THIS... 
     console.log(JSON.stringify(card)) 
    } 
} 

EXPLANATION

JSON.stringify将JavaScript数据结构转换为JSON文本.Json文本不过是关键:值对text.It不能变得更简单。

2

发生这种情况是因为您指定整个对象进行警报,并且警报不知道哪些属性是相关的。如果你想要一个可扩展的对象视图,你可以使用console.log(card),这会将你的对象作为树形视图输出到浏览器开发者控制台中。

0

你应该快讯改成这样:

alert(JSON.stringify(card)) 
相关问题