2012-06-12 110 views
5

爲什麼這兩個腳本不一樣?我想要的是第一個腳本,但在第二個drawData()中它改變了數據,這很奇怪。誰能告訴我爲什麼,以及如何解決它。謝謝!在JavaScript函數中更改數組更改函數外的數組?

var data =   ["right"] ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs[0]="omg"; 
    } 
    alert(data[0]); 

} 
drawData(data); 
drawData(data,"percentage"); 

第二:

var data =   "right" ; 

function drawData(arrs,type){ 
    if(type=="percentage"){ 
     arrs="omg"; 
    } 
    alert(data); 

} 
drawData(data); 
drawData(data,"percentage"); 
+4

這是因爲一個物體本身。當一個對象被修改時*該對象被修改。當一個值(對象)被傳遞給一個函數時,它不會被複制,克隆或複製**(內部有不同的使用技巧,但這在語義上是正確的)。也就是說,只有一個數組 - 並且在同一個數組內改變。如果您希望能夠在不擔心影響外部的情況下進行更改,請先複製一份。對於一個簡單的數組,這可以通過'Array.prototype.slice'完成。否則,像jQuery這樣的庫有方便的複製方法。 – 2012-06-12 04:45:43

+0

哦,並回答**之前,你說**「通過參考」,請閱讀[評估策略](http://en.wikipedia.org/wiki/Evaluation_strategy)和搜索術語「參考」在[ECMAScript規範](http://es5.github.com/),並能夠備份您的單詞選擇。謝謝! – 2012-06-12 04:49:10

+1

謝謝,我在[http://stackoverflow.com/](http://stackoverflow.com/questions/122102/what-is-the-most-efficient-way-to-clone- a-javascript-object),看看John Resig的答案。 –

回答

0

第一變型修改爲參數傳遞給功能對象(這恰好是陣列) - 所以這種變化被認爲是外部的功能。第二個變體爲函數參數賦值(這恰好是對數組的引用),但不會更改數組本身。

+1

對於這個問題,回答太不清楚/模糊,並且使用了不明確的術語:「對這個數組的改變引用」?它還將範圍(局部變量的賦值)與對象可變性(對象上的屬性賦值)混合在一起。 – 2012-06-12 05:02:08