2012-01-09 132 views
1

在我的第一个JS应用程序BlackJack上工作,并且一直在这一点上停留了一段时间:我想要做的是如果从数组中调用var a,它可能= 11或1,具体取决于总值。设置所述数组后,没有办法更改数组中项目的值吗?如何在数组创建后将其转换为var?

var j = 10; 
    var q = 10; 
    var k = 10; 
    var a; 
    var totalPlayer = 12; 
    var cards = [2, 2, ..., a, a, a]; 
function processIt() { 
    playerCard1 = cards[48]; //this is calling for var a form the array 
    if (totalPlayer > 11) { 
     a = 1; 
    } else { 
     a = 11; 
    } 
    var cpu1 = document.getElementById("cpu1"); 
    cpu1.innerHTML = playerCard1; //this is calling for var a form the array 
    } 

我也试过把它转换成刺,然后回到var,失败。

+2

有,但数组中的值不是'a';它们是'a'的值的副本。 – 2012-01-09 16:50:07

+0

请澄清你到底想要达到什么,为什么。 – PointedEars 2012-01-09 17:41:26

回答

2

如果我读正确,你已经设置了数组

var cards = [2, 2, ..., a, a, a]; 

,现在你要改变所有这些a的?

不幸的是(因为a是一个原语),您必须手动更改当前等于a的数组中的值,并将它们设置为更新后的值。

for (var i = 0, max = cards.length; i < max; i++) 
    if(cards[i] === a) 
     cards[i] = newValue; 

编辑

至于跳所指出的,要知道,如果a等于2,然后所有指标阵列中等于2将被替换,那些最初的几个指标是您手动设置为2,并且还将这些索引设置为a。但是既然你说a将会是1或者11,那么看起来你已经设置好了,这样不会成为问题。

+1

我不同意。这将取代其他具有相同值的索引! – hop 2012-01-09 17:06:07

+0

@hop - 是的,它会。我会更新我的答案,确保用户知道这一点。 – 2012-01-09 17:06:51

0

以下行:

var cards = [2, 2, ..., a, a, a]; 

... 副本价值a到最后三个阵列位置。这些值与a本身没有任何关系。更改a后面有对阵列没有影响。它必须手动更新:

if (totalPlayer > 11) { 
    a = 1; 
} else { 
    a = 11; 
} 
cards.splice(-3, 3, a, a, a); 
1

你不能做你所期望的这种方式。

var a = 1; 
var cards = [2, 2, a, a, a]; 
a = 5; 
alert(cards); // This should print 2,2,5,5,5 is what you expect. 
       // But, it will only print 2,2,1,1,1 

您可以存储您为其设置值为'a'的所有索引。毕竟,你正在构建数组,它应该不会成为你的障碍。

在我们的例子中,你将有另一个数组

var aIndexes = [2,3,4]; 

然后您可以更改卡阵列的价值像下面。

if (totalPlayer > 11) { 
    a = 1; 
} else { 
    a = 11; 
} 
for(var i =0; i< aIndexes.length; i++){ 
cards[i] = a; 
} 
0
var a; 
… 
var cards = [2, 2, ..., a, a, a]; 

值的aArray实例作为该阵列的元件的创作的时间,不某种指针的a。它相当于这里

var cards = [2, 2, ..., undefined, undefined, undefined]; 

您可以直接修改数组,正如其他人所指出的,或存储引用数组中的一个Object实例(引用值)。然后修改该实例的属性将修改所有对Object实例的引用。

var a = { 
    toString: function() { return String(this.valueOf()); }, 
    valueOf: function() { return this.value; } 
}; 

// … 

var cards = [2, 2, ..., a, a, a]; 

function processIt() 
{ 
    var playerCard1 = cards[48]; 

    if (totalPlayer > 11) 
    { 
    a.value = 1; 
    } 
    else 
    { 
    a.value = 11; 
    } 

    var cpu1 = document.getElementById("cpu1"); 
    cpu1.innerHTML = playerCard1; 
} 

访问字符串或数字表达式中a然后将通过a产生提到的Object实例的value属性的值:

/* y + a.valueOf() */ 
var x = y + a; 

/* z + a.toString() */ 
var y = z + String(a); 

你必须决定这两种方法是否有意义你因为我不太了解二十一点,所以你的问题很困惑。

顺便说一句,你忘记声明playerCard1这会导致它泄漏到外部执行上下文或导致运行时错误(ES 5.x严格模式)。我已经为你修好了。一般而言,您希望将全局变量的数量减少到绝对必要的最小值。