2013-07-26 44 views
8

Tôi có một câu hỏi hết sức tò mò. Vì vậy, tôi đã xem xét cách JS xử lý phân bổ biến và tôi nhận được nó. How does variable assignment work in JavaScript?Biến Javascript làm đối tượng con trỏ

Nhưng cùng một nguyên tắc dường như không thể hiện chính nó trong đoạn mã sau tôi đang làm việc trên:

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

Tôi biết đây là một cách tiêu chuẩn để trao đổi các phần tử mảng. Nhưng nếu temp chỉ ở playlist1[0] và nội dung của playlist1[0] được đổi thành playlist1[1] thì sao tôi không kết thúc với hai giá trị playlist1[1] liên tiếp?

+0

có thể trùng lặp của [Cách phân bổ biến hoạt động trong JavaScript?] (Http: // stackoverflow.com/questions/509579/how-does-variable-assignment-work-in-javascript) –

+0

Tôi đã bỏ phiếu này là trùng lặp vì câu trả lời trong câu hỏi bạn đã liên kết là câu trả lời cho câu hỏi của bạn. –

+0

@EvanTrimboli Tôi nghĩ rằng câu hỏi là công bằng vì nó yêu cầu làm rõ thêm về một câu hỏi hiện có. Câu hỏi khác là cũ và có thể không được theo dõi nữa. – TGH

Trả lời

11

Không chỉ biến số là con trỏ đối tượng. Tất cả các giá trị (không phải là nguyên thủy) là con trỏ đối tượng. Vì vậy, temp là một con trỏ đối tượng. playlist1 là một đối tượng trỏ đến một đối tượng mảng có các phần tử là các con trỏ đối tượng. ví dụ. playlist1[0] là một con trỏ đối tượng, playlist1[1] là một con trỏ đối tượng vv

Nhưng nếu tạm thời được chỉ vào playlist1 [0]

này không có ý nghĩa. temp là một con trỏ đối tượng. Nó chỉ vào một vật thể. playlist1[0] không phải là một đối tượng; đó là một con trỏ đối tượng. temp = playlist1[0]; làm cho đối tượng con trỏ temp trỏ đến cùng một đối tượng như đối tượng con trỏ playlist1[0].

Nếu bạn biết C, nó tương đương với một cái gì đó như thế này:

Object *playlist1[10]; 

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

Điểm yếu của OP: các phần tử mảng không phải là các đối tượng, chúng cũng là các con trỏ tới các đối tượng. Điều này đã trả lời câu hỏi của tôi và làm sâu sắc thêm sự hiểu biết của tôi về các cơ chế. – nemo

2

Điều này phù hợp với câu trả lời trong câu hỏi được tham chiếu: Bạn chỉ đang thay đổi đối tượng mà biến trỏ đến - không phải dữ liệu được sử dụng để trỏ đến. Ý nghĩa tạm thời không bị ảnh hưởng bởi việc di chuyển để có playlist1 [1] trỏ tới playlist1 [2]. Temp giữ nguyên giá trị ban đầu mà nó trỏ đến khi playlis1 [1] và temp đều chỉ vào nó. Chỉ danh sách phát1 [1] mới được cập nhật

0

Do đó vẫn là tham chiếu đến các phần tử trong mảng chứ không phải chính yếu tố. Vì vậy, trong dòng:

playlist[1]=playlist[2] 

Bạn không thay đổi gì về nhiệt độ. Trái ngược với một cái gì đó tương tự (yếu tố giả định mảng là đối tượng):

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

Đó thực sự là gán giá trị của các đối tượng trong mảng, và nếu tạm thời chỉ vào playlist [1], sau đó temp.x sẽ playlist bằng [2] .x

0

nói rằng chúng ta có obj={l1:{l2:[1,2]},} và chúng tôi muốn giải quyết obj.l1.l2[1] sử dụng một loạt các mức độ như arr=["l1","l2",1] thì:

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; 
    } 
}); 

Vì vậy, sau khi xác định phương pháp "điểm" (không được liệt kê để làm lộn xộn everithing), chúng tôi có thể sử dụng

obj.point(arr) 

để nhận giá trị 2

Các vấn đề liên quan