2016-01-24 68 views
-1

以下代码旨在从整数(数字)数组中移除最小数字。我无法理解为什么它会返回一个受.sort().reverse().pop();影响的数组。JavaScript基础知识:变量受不同变量的方法影响

我本以为将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]

+3

数组是对象,并且作为[“的引用的值”](http://stackoverflow.com/questions/518000/is-javascript-a-pass-by-reference-or-pass-by-传递值语言),意味着'numbersTest'和'numbers'引用相同的数组。您可以使用'VAR numbersTest = numbers.slice(0)' – adeneo

+1

当您使用运营商'=',你必须明白它实际上意味着克隆阵列。 '='不会对对象数据执行复制,而是复制引用。 –

+0

谢谢!我看了一下你的链接和https://davidwalsh.name/javascript-clone-array现在明白这个问题。很抱歉如果之前询问过这个问题 - 我不知道如何在Google搜索中提出问题。我会回答我自己的问题,并赞扬你。 – VoA

回答

0

感谢adeneoDerek我想我明白这个问题。

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

这意味着分配给某个对象的所有变量通过参考原始(即通过指向原始对象),而不是由具有它们自己独立的值保持该对象的值。

如果原稿被改变时,变量指向原始将具有其值变化太大(反之亦然)。

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

2

有传递变量在JavaScript中的两种方式 - 通过值或引用。 简而言之: 只有通过值传递的简单数据类型(例如数字或字符串),其他类型(数组,对象...)通过引用传递。如果你手上有多处提到一个对象,在其中一人表演的改变将影响到所有(因为有一些可供参考)。在第一近似你可能会觉得它像UNIX符号链接或快捷方式在Windows中,当影响符号链接影响到文件本身。 这里查看更多信息: Javascript by reference vs. by value http://snook.ca/archives/javascript/javascript_pass

1

当你说...

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

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

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

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