2016-05-20 48 views
1

我最近一直在學習一些JavaScript,並且不太確定地發現了一些性能問題,我認爲它與數組相關。 我寫了一個簡短的測試函數來測試數組是否通過引用傳遞。 他們是。我唯一的問題是:在JS中傳遞數組是如何工作的?

它究竟傳遞了多少?

在JavaScript中沒有指針,對不對?

下面是測試功能:如預期

function arr_test(arr) { 
    for (var i = 0; i < arr.length; i++) { 
     arr[i] = 50; 
    } 
} 

function num_test(num) { 
    num = 50; 
} 

var array = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]; 
arr_test(array); 
console.log(array); 

var num = 10; 
num_test(num); 
console.log(num); 

輸出:

Array [ 50, 50, 50, 50, 50, 50, 50, 50, 50, 50 ] 
10 
+0

難道你不想輸出'num'到50. –

+0

可能重複的[Javascript是否通過引用?](http://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference) –

+0

對於ONCE JavaScript表現得像Java!指針從視野中隱藏,但它們的使用仍然清晰可見。 – 4castle

回答

1

JavaScript通過值per references(除了原始值,如字符串或數字)。 JS中有一些指針(實際上幾乎所有東西都是基元是引用),但它們是隱藏的並且是自動管理的(例如像Java或Python)。

該數組未被複制。函數arr_test中的函數與函數外的函數相同。因此,如果您更改其值,它將反映在函數外部。

但是,在您的num_test函數中,您沒有更新作爲參數獲取的數字的值。你正在做的是將函數內的num變量賦值給內存中其他地方的另一個數字。函數外部的變量num未被更改。 這實際上與num作爲參考或變量傳遞的事實無關。如果不是更新arr_test中的arr[i],而只是執行arr = [50, 50](即將另一個對象分配給給定的參數,而不是更新已提供的參數),則函數外的值也不會被更新。

+0

字符串可以是對象或原始的。在需要時,Javascript會將原語轉換爲對象,以便您可以使用原始字符串的對象方法。見[這裏](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)。 –

+0

所以每個非原始變量都通過引用傳遞。太好了,那爲我清除了一些東西。謝謝 – Sorbet

0

幾乎一切是JavaScript是一個對象。

對象通過引用傳遞。

所以當你將一個數組(對象)傳遞給一個函數並修改它時,它會一直存在。

相關問題