JavaScript变量内部函数定义不正确

时间:2018-11-01 12:04:56

标签: javascript

我是JS的新手,正在尝试创建一个简单的“如果数组A元素大于数组B元素,则交换数组元素”功能。在swapIndexes函数中,我不明白为什么无法定义注释中所示的变量。例如,如果它声明arrA[c]而不是let a = arrA[c],它就可以工作。

为什么会这样?任何人都可以就如何最好地进行此类操作提供一些初学者提示吗?我的代码很冗长。感谢您的帮助。

var arrA = [0, 1, 2, 7, 6],
  arrB = [0, 1, 2, 5, 7],
  indexesToSwap = [],
  aValuesToSwap = [],
  bValuesToSwap = [],
  needSwapping = false;

arrA.forEach(getSwappableIndexesAndValues);
indexesToSwap.forEach(swapIndexes);

function getSwappableIndexesAndValues(c, i) {
  let b = arrB[i];

  if (c > b) {
    needSwapping = true;
    indexesToSwap.push(i);
    aValuesToSwap.push(b);
    bValuesToSwap.push(c);
  }
}

function swapIndexes(c, i) {
  //let a = arrA[c];  fails why???
  //let b = arrB[c];  fails why???
  //a = aValuesToSwap[i];  fails why???
  //b = bValuesToSwap[i];  fails why???

  arrA[c] = aValuesToSwap[i];
  arrB[c] = bValuesToSwap[i];
}

console.log(arrA);
console.log(arrB);

3 个答案:

答案 0 :(得分:2)

在javascript中,当您从数组中的给定索引创建变量时,这将创建一个新的内存空间,其中包含该索引处的值的副本。新创建的变量将不会指向数组的内容,因此,修改此变量将不会修改数组的内容。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

答案 1 :(得分:1)

var arrA = [0, 1, 2, 7, 6],
  arrB = [0, 1, 2, 5, 7],
  indexesToSwap = [],
  aValuesToSwap = [],
  bValuesToSwap = [],
  needSwapping = false;

arrA.forEach(getSwappableIndexesAndValues);
indexesToSwap.forEach(swapIndexes);

function getSwappableIndexesAndValues(c, i) {
  let b = arrB[i];

  if (c > b) {
    needSwapping = true;
    indexesToSwap.push(i);
    aValuesToSwap.push(b);
    bValuesToSwap.push(c);
  }
}

function swapIndexes(c, i) {
  //let a = arrA[c];  fails why???
  //let b = arrB[c];  fails why???
  //a = aValuesToSwap[i];  fails why???
  //b = bValuesToSwap[i];  fails why???

  arrA[c] =   bValuesToSwap[i];
  arrB[c] =aValuesToSwap[i];
  console.log(  arrA[c], arrB[c]);
  console.log(   aValuesToSwap[i],  bValuesToSwap[i]);
}

console.log(arrA);
console.log(arrB);
数组值和原始数据类型值不可能不同。如果尝试使用该对象的数组,则您的尝试将是正确的。

答案 2 :(得分:1)

indexesToSwap具有您需要交换的所有信息。交换值数组(aValuesToSwap,bValuesToSwap)使事情变得非常复杂,并且完全没有必要。

不管交换数组的值是什么,交换都是一项基本操作,通常涉及一个简单的临时操作,例如

temp = arrA[i];
arrA[i] = arrB[i];
arrB[i] = temp;

摒弃复杂性,这是getSwappableIndexesAndValues函数的替代方法

function getSwappableIndexes(c, i) {     
  if (c > arrB[i])
    indexesToSwap.push(i);           
}

以及简化的交换功能

function swapIndexes(c, i) {
  let temp = arrA[c];
  arrA[c] = arrB[c];
  arrB[c] = temp;    
}

我不得不进一步说,尽管Array.forEach 的使用会使整个解决方案复杂化。除非这是一项任务,否则最好在此处使用简单的for循环。

// swaps values between arrays where the value in 
// array a is greater than the value in array b
//
function swapIfGreaterThan(a,b) {
   for(let i = 0; i < a.length && i < b.length; i++) {
      if(a[i] > b[i]) {
         let temp = a[i];
         a[i] = b[i];
         b[i] = temp;
      }
   }
}