JavaScript基础:变量受到对不同变量执行的方法的影响

时间:2016-01-24 03:39:55

标签: javascript function

以下代码旨在从整数数组(数字)中删除最小数字。我不能理解为什么它会返回一个受.sort().reverse().pop();影响的数组。

我原以为将var numbersTest分配给numbers意味着数字本身不受上述方法的影响。

任何人都可以了解一下这个javaScript功能吗?

function removeSmallest(numbers) {
  var numbersTest = numbers;
  var lowestNum = numbersTest.sort().reverse().pop();

  for (var i = 0; i < numbers.length; i++) {
    if (numbers[i] === lowestNum) {
      numbers.splice(i, 1);
    } 
  }

  return numbers;
}

removeSmallest([1,2,3,4,5]);

此函数返回[5, 4, 3, 2]

我想要[2,3,4,5]

4 个答案:

答案 0 :(得分:2)

有两种方法可以在javascript中传递变量 - 按值或按引用传递。 简而言之: 只有通过值传递的简单数据类型(如数字或字符串),其他类型(数组,对象,...)才能通过引用传递。如果你有多个对一个对象的引用,对其中一个对象执行更改将影响所有对象(因为只有引用)。在第一次近似中,当影响符号链接影响文件本身时,您可能会将其视为unix中的符号链接或Windows中的快捷方式。 在这里查看更多信息: Javascript by reference vs. by value http://snook.ca/archives/javascript/javascript_pass

答案 1 :(得分:1)

当你说...

var anArray = [1, 2, 3];
var anotherArray = anArray;

这两个变量都指向内存中的相同数组。

This问题讨论了复制数组的方法。

答案 2 :(得分:1)

您可以使用新引用创建一个新数组,如下所示:

var numbersTest = new Array(numbers);

这可能是一个更简单的解决方案:

function removeSmallest(numbers) {
    numbers.sort().splice(0, 1);
    return numbers;
}

removeSmallest()函数有缺陷,因为整数在javascript中按字母顺序排序。更好的答案是:

function removeSmallest(numbers) {
  numbers.sort(sortNumber).splice(0,1);
  return numbers;
}

function sortNumber(a,b) {
  return a - b;
}

答案 3 :(得分:0)

感谢adeneoDerek我认为我理解了这个问题。

基本上,JavaScript对象(诸如我的numbers数组之类的数组是一种类型的对象)是通过“引用的值”分配的(与通过“值的值”分配的简单数据类型不同)。

这意味着分配给某个对象的所有变量都通过引用原始对象(即通过指向原始对象)而不是拥有自己的独立值来保存该对象的值。

如果更改原稿,指向原稿的变量也会更改其值(反之亦然)。

要克隆一个数组(这是我想用numbers数组做的),你应该简单地使用var numbersClone = numbers.slice(0)。阅读this将解释。