2013-07-26 14 views
8

Merakımdan bir sorum var. Böylece JS'nin değişken atamayı nasıl ele aldığına baktım ve anladım. How does variable assignment work in JavaScript?Javascript Değişkenleri Object Pointers olarak

Ama aynı prensip üzerinde çalışıyorum şu kodda kendini sergilemek görünmüyor:

var temp = playlist1[0]; 
playlist1[0] = playlist1[1]; 
playlist1[1] = temp; 

bu dizi elemanları takas için standart bir yol olduğunu biliyoruz. Ancak, temp playlist1[0] ve playlist1[0]'un içeriği playlist1[1] olarak değiştiriliyorsa, neden bir satırda iki playlist1[1] değeriyle bitmeyeceğim?

+0

['Değişken ataması JavaScript'te nasıl çalışır?] (Http: // stackoverflow.com/questions/509579/how-does-variable-atama-çalışma-in-javascript) –

+0

Bunu bir yinelenen olarak seçtim, çünkü bağlandığınız sorudaki yanıt, sorunuzun cevabıdır. –

+0

@EvanTrimboli Bence bu soru adil çünkü mevcut bir soru üzerinde daha fazla açıklama isteniyor. Diğer soru yaşlı ve muhtemelen artık izlenmiyor. – TGH

cevap

11

Sadece değişkenleri değil nesne işaretçileridir. Tüm değerler (ilkel olmayanlar) nesne işaretleyicileridir. Yani temp bir nesne işaretçisidir. playlist1, öğeleri nesne işaretçisi olan bir dizi nesnesine bir nesne işaretçisidir. Örneğin. playlist1[0] bir amacı işaretçidir playlist1[1] bir amacı işaretçi vb

olan ama geçici playlist1 işaret ise [0]

Bu mantıklı değildir. temp bir nesne işaretçisidir. Bir nesneyi işaret eder. playlist1[0] bir nesne değildir; Bu bir nesne işaretçisidir. temp = playlist1[0];, nesne işaretçisini playlist1[0] nesne işaretçisi ile aynı nesneye temp işaret eder. Eğer C biliyorsanız

, böyle bir şeye eşdeğerdir:

Object *playlist1[10]; 

Object *temp = playlist1[0]; 
playlist1[0] = playlist1[1]; 
playlist1[1] = temp; 
+1

OP'nin paket servisi: dizi elemanları nesne değildir, onlar da nesnelerin işaretçileridir. Bu benim sorumu yanıtladı ve mekanizmaları anlamayı derinleştirdi. – nemo

2

Bu, başvurulan sorudaki yanıtla tutarlıdır: Sadece değişkenin hangi nesneyi gösterdiği - değil, işaret ettiği veriyi değiştiriyorsunuz. Çalma listesinin1 [1] playlist1 [2] 'ye gitmesiyle, hareket temposundan etkilenmez. Temp, playlis1 [1] ve temp her ikisi de işaret ettiğinde işaret ettiği orijinal değeri korur. Sadece çalma listesi1 [1] güncellendi

0

Bu öğeler hala dizideki öğelere değil, öğelerin kendilerine başvururlar. Yani satırda: temp ile ilgili hiçbir şey değiştirmiyorsunuz. gibi bir şey ile (varsayılarak dizi elemanları nesneleri idi) Kontrast aslında dizideki nesnesinin değerini tahsis edilir ve

playlist[1].x=playlist[2].x 

sıcaklığı [1], o zaman temp.x olur eşit Oynatma listesi işaret halinde [2] .x

0

biz obj={l1:{l2:[1,2]},} söylüyorlar ve biz sonra arr=["l1","l2",1] gibi düzeylerinin bir dizi kullanarak obj.l1.l2[1] seslenmek istiyorum:

Object.defineProperty(Object.prototype,'point',{ 
    value:function(arr){ 
     var rez=this; 
     for(var s in arr){ 
      rez=rez[arr[s]]; 
      if(rez === undefined) return undefined; 
     } 
     return rez; 
    } 
}); 

Bu nedenle, "nokta" yöntemini tanımladıktan sonra (ki bu da everithing'i bertaraf etmek için sayılmaz),

obj.point(arr) 

değerini almak için 2

İlgili konular