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

JavaScript基础:变量受对不同变量执行的方法的影响,javascript,function,Javascript,Function,以下代码旨在从整数(数字)数组中删除最小的数字。我一辈子都无法理解为什么它返回一个受.sort().reverse().pop()影响的数组 我本以为将var numbersTest分配给numbers意味着数字本身不受上述方法的影响 有谁能介绍一下这个javaScript功能吗 function removeSmallest(numbers) { var numbersTest = numbers; var lowestNum = numbersTest.sort().reverse(

以下代码旨在从整数(数字)数组中删除最小的数字。我一辈子都无法理解为什么它返回一个受
.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]);
函数removesmalest(数字){
var numbersTest=数值;
var lowestNum=numbertest.sort().reverse().pop();
对于(变量i=0;i
此函数返回
[5,4,3,2]


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

在javascript中有两种传递变量的方法-通过值或引用。 简言之: 只有通过值传递的简单数据类型(如数字或字符串),其他类型(数组、对象等)通过引用传递。如果对一个对象有多个引用,对其中一个对象执行更改将影响所有对象(因为只有引用)。在第一种近似情况下,当symlink影响文件本身时,您可能会将其视为unix中的符号链接或windows中的快捷方式。 请参见此处的更多信息: 当你说

var anArray = [1, 2, 3];
var anotherArray = anArray;
这两个变量都指向内存中的同一个数组


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

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

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;
}
多亏了,我想我理解这个问题

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

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

如果更改了原始文件,则指向原始文件的变量的值也将更改(反之亦然)


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

数组是对象,作为对象传递,这意味着
numbersTest
numbers
都引用相同的数组。您必须使用
var numbertest=numbers.slice(0)
克隆数组当您使用操作符
=
时,您必须理解它的实际含义<代码>=
不会复制对象数据,而是复制引用。谢谢!我已经看过你的链接,现在明白了问题所在。如果以前有人问过这个问题,我很抱歉——我不知道如何在谷歌搜索中表达这个问题。我会回答我自己的问题并相信你。回到你的实际问题,你真的不需要这类。相反的东西,
Math.min.apply(null,number)
会很好地完成这项工作。拼接代码也被破坏,用
[2,3,1,1,4,5]
测试。