我遇到了麻煩接近這個問題,如果我有一個工作解決方案,我懷疑它是最優化的。如何通過參考(模擬)
這裏的問題是:
想象對象的數組,每個對象表示人。
var people = [
{id:1, name:"John", points: 50},
{id:2, name:"Mark", points: 80},
{id:3, name:"Peter", points: 25},
];
在我們人陣,我們有3人與唯一的ID財產。
現在想象一下,我們有多個功能來修改/更新人員對象。
顯然,這是行不通的,因爲外部對象將不會受到影響由incrementPoints製造()函數的變化 。
var myPerson = people[0];
incrementPoints(myPerson){
myPerson.points++;
};
// myPerson.points = 50
addPoints(myPerson); // We're passing an person object to addPoints;
// myPerson.points = 50 (Did not change, not affected by addPoints)
然而,這會工作!但我們支付的價格是 通過人員數組迭代的成本,並匹配所需人員的ID。
function getPersonIndexById(personId){
// Iterate through all persons in 'people' array
for(var index = 0; index < people.length; index++)
people[i].id === personId ? return index : continue;
}
function incrementPoints(personId){
people[ getPersonIndexById(personId) ].points++;
}
function decrementPoints(personId){
people[ getPersonIndexById(personId) ].points--;
}
是否有更好的/簡單/清潔/用於處理這種情況的概念。很明顯,理想的解決方案是通過&引用,但JavaScript不允許這樣做。我並不是試圖實現無用的黑客攻擊,而是理解開發人員在遇到類似情況時所做的工作以及他們如何解決這些問題。
myPerson.points ++;'does work ... varists = [{id:1,name:「John」,points:50},{id:2,name:「Mark」,points:80 },{id:3,name:「Peter」,points:25}]; var myPerson = people [0]; function incrementPoints(myPerson){ myPerson.points ++; }; incrementPoints(myPerson); console.log(myPerson);' - > Object {id:1,name:「John」,points:51} –
...並且它始終有效,因爲對象始終作爲引用的值傳遞。 – adeneo
我認爲...也許不正確,Java傳遞一個值作爲參考。所以,在你的第一個例子中,它實際上會起作用。您無法更改myPerson,但更改myPerson.points會反映在原始對象中。 myPerson是價值物品,但仍引用人物[0]。 –