为什么这个代码返回NaN

Why is this code returning NaN?

本文关键字:返回 NaN 代码 为什么      更新时间:2023-09-26

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

您需要解决三个独立的问题:

  1. Math.random()上需要parens
  2. 你需要像这样叫getSuit() card1.getSuit(),而不是你当时是怎么做的
  3. 您需要实际使getSuitgetNumbergetValue成为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());

如果你想让numsuit保持私有变量,那么你必须在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());