2015-12-17 79 views
1

有沒有辦法讓變量充當對另一個變量的引用?我可以有多個變量都擁有關於單個數據的相同信息嗎?對JavaScript中多個變量的引用

例如:

var foo = "data"; 
var bar = foo; 

// I want this to set both foo & bar to null 
foo = null; 

console.log(bar); // However, bar is still set to "data" 

CC++你能得到與此指針所需的行爲;有兩個變量引用內存中的相同位置。

有什麼方法可以模仿JavaScript中的這種行爲?

+0

我不認爲你在C/C++中得到你想要的行爲。如果將指針「b」設置爲某個非'null'指針'a',然後將'a'設置爲'null',則指針'b'仍將指向內存中的非'null'位置。 (這並不是說你不能在C++中使用指針引用來獲得所需的行爲。) –

+0

@TedHopp我的意思是如果'foo'是'Obj *'而'bar'也是'Obj *'並且它們都指向相同的'Obj',如果'foo'或'bar'改變了它們的'Obj'值,那麼更新就會出現在兩個變量上。 –

+0

嗯,是的。這也發生在JavaScript中。然而,你發佈的代碼不會像C中那樣(如果你把'var'改成'char *')。 –

回答

3

在JavaScript中,有對象作爲自己的價值實際上是標量引用(指針)的對象變量,因此分配簡單的拷貝對象引用,而不是對象本身。所以,當你做

var bar = foo;

foo值被複制。這意味着foobar都具有副本具有相同的值。

即使對象,這將無法工作

var x = {}; 
var y = x; // y and x both point to the same object 
x = null; 
// y still points to the object 

再次,xy是參考的副本,所以既xy是單獨的引用,每個具有相同的值。但是將其中一個置零並不會對另一個做任何事情。

你可以得到最接近的是什麼@Derek朕會功夫說,這是做

var x = {val: 'data'}; 
var y = x; 
delete x.val; 
// y.val is now undefined 

又通xy左右。

+0

對於基本正確的答案+1,但傳值語義與此無關,因爲沒有任何內容被傳遞(不涉及函數調用)。 –

+0

啊好吧;這太糟糕了JavaScript沒有一個簡單的方法來做到這一點。感謝您的澄清! –

+0

@TedHopp啊是的,我明白了。是否有一個特殊名稱,用於在作業中複製參考值? – hvgotcodes

2

是的。八九不離十。對象引用類似於指針在C:

var foo = {value: "data"}; 
var bar = foo; 

foo.value = undefined; 
console.log("Value: %s", bar.value); // undefined 
1

不,你不能。如果該值是基元,則該值被複制,並且如果它是對象,則複製該引用。

你唯一能做的就是將多個變量指向同一個對象。但是,重新分配任何一個變量都不會重新分配另一個變量。