我有以下代码,我想让甲板阵列装满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 :(得分: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()
,因为它在控制台中调试更加烦人且更容易(点击F12)。但是要小心运行IE9或更低版本的生产代码,因为当开发者控制台没有打开时,他们的javascript引擎会崩溃。
答案 1 :(得分:2)
这是因为您指定要提醒的整个对象,并且警报不知道哪些属性是相关的。如果您想要一个可扩展的对象视图,可以使用console.log(card)
,这会将您的对象作为树视图输出到浏览器开发人员控制台。
答案 2 :(得分:0)
这是一个对象的显示方式,它的toString
方法输出就是这样,看看它的内容使用
alert(JSON.stringify(card));
答案 3 :(得分:0)
使用此 - &gt;提醒(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))
}
}
JSON.stringify将JavaScript数据结构转换为JSON文本.Json文本只是关键:文本的值对。它不能变得更简单。
答案 4 :(得分:0)
您应该将警报更改为:
alert(JSON.stringify(card))