如何在创建数组后转换数组中的var

How to convert a var in an array after it is created?

本文关键字:数组 var 转换 创建      更新时间:2023-09-26

正在开发我的第一个JS应用程序BlackJack,并且已经在这一点上停滞了一段时间:我试图做的是,如果从数组中调用var a,它可能=11或1,这取决于总值。设置数组后,是否无法更改数组中某个项的值?

    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,但失败了。

如果我读得正确,您已经设置了阵列

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;

编辑

正如hop所指出的,请注意,如果a等于2,那么数组中等于2的所有索引都将被替换——手动设置为2的前几个索引,以及设置为a的末尾索引。但既然你说a将是1或11,那么看起来你已经以这样一种方式设置了,这不会成为一个问题。

你不能用这种方式做你期望的事情。

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

以下行:

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);
var a;
…
var cards = [2, 2, ..., a, a, a];

将创建Array实例时a设置为数组的元素,而不是某种指向a的指针。它在这里相当于

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

正如其他人所指出的,您可以直接修改数组,也可以在数组中存储对Object实例的引用(引用是值)。修改该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);

你必须决定这两种方法在你的情况下是否有意义,因为我不太了解21点,你的问题相当困惑。

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