2016-01-24 51 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; 
}