为什么这个代码返回NaN
Why is this code returning NaN?
21点游戏:我做了下面的deal函数,它应该返回1-4之间的一个随机数,代表一套衣服,以及1-3之间的另一个随机数字,代表一个卡号。
当我通过调用console.log(getSuit(card1));
测试代码时,它返回NaN
有人知道为什么吗?
// Make your card constructor again here, but make sure to use private
// variables!
function Card(num, suit){
var num = num;
var suit = suit;
getSuit = function(){
return suit;
};
getNumber = function(){
return num;
};
getValue = function(card){
if (card > 10){
return 10;
}else if (card === 1){
return 11;
}else{
return card;
}
};
}
// Make a deal function here. It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13
var deal = function(){
var suit = Math.floor(Math.random * 4 + 1);
var number = Math.floor(Math.random * 13 + 1);
return new Card(number, suit);
};
// examples of the deal function in action
var card1 = deal();
var card2 = deal();
console.log(getSuit(card1));
只需在随机后添加()
var deal = function() {
var suit = Math.floor(Math.random() * 4 + 1);
var number = Math.floor(Math.random() * 13 + 1);
return new Card(number, suit);
};
你不应该打电话给吗
console.log(card1.getSuit());
您遇到了一些复合问题,但获得NaN的原因是使用了随机函数。请在对方法/函数的所有调用之后包含()
。
对Card类进行了其他更改。this.
将变量分配给该类实例。功能也是如此。因此,这将改变作为方法调用getSuit()
的方式。它以前工作过,因为您的getSuit()正被放入全局命名空间中。
function Card(num, suit){
this.num = num;
this.suit = suit;
this.getSuit = function(){
return suit;
};
this.getNumber = function(){
return num;
};
this.getValue = function(card){
if (card > 10){
return 10;
}else if (card === 1){
return 11;
}else{
return card;
}
};
}
var deal = function(){
var suit = Math.floor(Math.random() * 4 + 1);
var number = Math.floor(Math.random() * 13 + 1);
return new Card(number, suit);
};
// examples of the deal function in action
var card1 = deal();
var card2 = deal();
console.log(card1.getSuit());
更改:
var num = num;
var suit = suit;
至
this.num = num;
this.suit = suit;
等等。
此版本保留了私有变量的使用。请注意,函数参数自动是私有变量,因此不需要重新声明它们。
function Card(num, suit) {
this.getSuit = function() {
return suit;
};
this.getNumber = function() {
return num;
};
this.getValue = function() {
if (num > 10)
return 10;
if (num == 1)
return 11;
return num;
};
}
试试这个:
// Make your card constructor again here, but make sure to use private
// variables!
function Card(num, suit){
// NOTE: "this."
this.num = num;
this.suit = suit;
this.getSuit = function(){
return this.suit;
};
this.getNumber = function(){
return this.num;
};
this.getValue = function(card){
if (card > 10){
return 10;
}else if (card === 1){
return 11;
}else{
return card;
}
};
}
// Make a deal function here. It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13
var deal = function(){
// NOTE: Math.random()
var suit = Math.floor(Math.random() * 4 + 1);
var number = Math.floor(Math.random() * 13 + 1);
return new Card(number, suit);
};
// examples of the deal function in action
var card1 = deal();
var card2 = deal();
// NOTE: card1.getSuit()
console.log(card1.getSuit());
您需要解决三个独立的问题:
Math.random()
上需要parens- 你需要像这样叫
getSuit()
card1.getSuit()
,而不是你当时是怎么做的 - 您需要实际使
getSuit
、getNumber
和getValue
成为Card对象的方法。正如您迄今为止所声明的,它们只是Card构造函数内部的局部函数,不能从该构造函数外部调用
有两种常见的方法可以使这些函数成为方法。一种是将它们分配给Card原型对象。另一种是将它们分配给构造函数中的this
。
下面是将它们分配给原型对象的样子:
function Card(num, suit){
this.num = num;
this.suit = suit;
}
Card.prototype = {
getSuit: function() {
return suit;
},
getNumber: function() {
return num;
},
getValue: function(card) {
if (card > 10){
return 10;
}else if (card === 1){
return 11;
}else{
return card;
}
}
};
// Make a deal function here. It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13
var deal = function(){
var suit = Math.floor(Math.random() * 4 + 1);
var number = Math.floor(Math.random() * 13 + 1);
return new Card(number, suit);
};
// examples of the deal function in action
var card1 = deal();
var card2 = deal();
console.log(card1.getSuit());
如果你想让num
和suit
保持私有变量,那么你必须在Card内部定义这样的方法:
// Make your card constructor again here, but make sure to use private
// variables!
function Card(num, suit){
var num = num;
var suit = suit;
this.getSuit = function(){
return suit;
};
this.getNumber = function(){
return num;
};
this.getValue = function(card){
if (card > 10){
return 10;
}else if (card === 1){
return 11;
}else{
return card;
}
};
}
// Make a deal function here. It should return a new card with a suit
// that is a random number from 1 to 4, and a number that is a random
// number between 1 and 13
var deal = function(){
var suit = Math.floor(Math.random() * 4 + 1);
var number = Math.floor(Math.random() * 13 + 1);
return new Card(number, suit);
};
// examples of the deal function in action
var card1 = deal();
var card2 = deal();
console.log(card1.getSuit());
相关文章:
- 如何防止Math.max()返回NaN
- 尝试求和时,在我的表的页脚中返回$NaN
- 为什么Math.pow(1,无穷大)返回NaN
- JavaScript:返回NaN(第2部分)
- 为什么这个代码返回NaN
- Protractor-分配给element.all.locator.count的变量返回NaN why
- javascript 在求和时返回 NaN
- 计算地理位置距离返回 NaN
- nan在C++中是什么意思?为什么pow(-4,-2.1)返回-nan
- 货币字段上的 parseInt 返回 NaN
- Javascript:解析csv中的字符串返回NaN(不是数字)
- JS脚本返回NaN
- 解析html td返回NaN
- Javascript函数返回NaN
- 在Javascript中计算日期会返回NaN-NaN-NaN
- 如果我对索引进行硬编码,它会按预期工作,为什么这个增量器会返回NAN
- new Date返回NaN或从服务器日期()开始的错误时间
- 变量递增返回 NaN
- 为什么我的基于约简的平均值函数返回 NaN
- Javascript-将字符串转换为Int会返回NaN错误