2011-09-22 35 views
23

Tôi đã tìm kiếm thông qua internets nhưng không thể tìm thấy tiêu chí tìm kiếm có liên quan nên tôi nghĩ đây sẽ là nơi tốt nhất để hỏi.Javascript a = b = c báo cáo

Tôi có một tuyên bố JS nói

document.location.hash = this.slug = this.sliceHashFromHref(href) 

làm việc như thế này ??

+2

Ý anh là gì "làm thế nào để làm việc này?" – Jamiec

+3

Xem [Chuyển nhượng nhiều tay trái với JavaScript] (http://stackoverflow.com/questions/1758576/multiple-left-hand-assignment-with-javascript). –

+1

@Jamiec: Nó hoạt động rất tốt, nhờ yêu cầu;) – Piskvor

Trả lời

3

Nhận của nó được đánh giá từ phải sang trái. tức

document.location.hash = this.slug = this.sliceHashFromHref(href) 

sản lượng/giá trị của

this.sliceHashFromHref(href) 

đang được giao cho document.location.hash = this.slug

+1

Tôi có nghĩa là không có hành vi phạm tội này, nhưng tôi cảm thấy như thể câu trả lời của @ aioobe nên được chấp nhận vì nó đã được bình chọn tốt hơn bởi cộng đồng, là thông qua và (theo ý kiến ​​của tôi) giải thích nó tốt hơn. Tôi xin lỗi nếu điều này được thực hiện sai. –

46

Tính năng này hoạt động như thế nào ??

a = b có thể được coi là cả một tuyên bố và một biểu.

Kết quả của biểu thức là b.

Nói cách khác,

a = b = c; 

mà có thể được viết như

a = (b = c); 

tương đương với

b = c; 
a = b; 

Như vậy mã của bạn là tương đương với:

this.slug = this.sliceHashFromHref(href); 
document.location.hash = this.slug; 
+0

Nếu kết quả của biểu thức 'a = b' là' b', thì biểu thức 'a = (b = c)' phải tương đương với 'b = c; a = c; '(nhưng điều này không có nghĩa là' a = b = foo() 'sẽ gọi' foo' hai lần!). Tôi tự hỏi làm thế nào 'a = b = c' sẽ hoạt động trong trường hợp' a', 'b' và' c' có getters và setters. Getter của 'c' sẽ được gọi một lần và sau đó setter của' b' sẽ được gọi - sẽ getter của 'b' được gọi để lấy giá trị cho setter của' a'? – Oren

5

Khá dễ dàng ... Nó gán kết quả từ các cuộc gọi đến this.sliceHashFromHref(href) cho cả document.location.hashthis.slug, vì vậy cả hai thuộc tính (biến) chứa cùng một giá trị sau khi dòng được thực hiện.

4

Trong Javascript (và một số ngôn ngữ khác nhận được cú pháp của chúng từ C) một phép gán đánh giá mục ở bên phải biểu tượng = và gán nó cho biến bên trái. Mục bên phải có thể là một nhiệm vụ với toán tử =. Điều gì xảy ra là biểu thức ngoài cùng bên phải được đánh giá, giá trị được gán cho biến giữa, và sau đó giá trị đó được gán cho biến ở bên trái.

Tóm lại, nó chỉ đơn giản là một cách để gán giá trị cho nhiều biến cùng một lúc.

8

Hãy nhận biết phạm vi biến !!

var A = B = C = 3; //A is local variable while B & C are global variables; 
var A = 3 , B = 3, C = 3;// A B C are local variables; 
+0

điều này rất quan trọng, nhưng hầu hết các câu trả lời chỉ bỏ qua chúng ... – Martian2049

-1

Thực ra câu trả lời của Ma Jerez là một điểm rất quan trọng ở đây.cũng câu trả lời này đề cập đến điều này tương tự question: câu hỏi này liên quan đến một vài điều sau:

  1. Hoist: biến được hoisted trước khi thực thi mã khối;
  2. = thứ tự chuyển nhượng: nó chuyển từ phải sang trái;
  3. ngữ cảnh chung: ở chế độ không nghiêm ngặt, khi biến không được xác định, biến đó đi đến ngữ cảnh chung; nhưng sẽ ném vào chế độ 'sử dụng nghiêm ngặt';

example1:

;(function Anonymous(){ 
    var a = b = {}; 
    console.log(a==b); //true 
})(); 
  1. a được kéo lên trong phạm vi Anonymous thực hiện.

  2. b sẽ được bổ nhiệm làm {}, nhưng vì b không được định nghĩa, b được gán cho bối cảnh toàn cầu window, sau đó window.b được gán {}; sau đó window.b = {}return s {}.

  3. biến cục bộ a được gán là {}.

Do đó, một vài điều thú vị xảy ra ở đây: local variable aglobal variable b cả điểm đến cùng đối tượng {}, vì vậy chúng =====; hãy nhớ rằng {}=={} cung cấp cho false nếu không.

Lưu ý: nếu trong chế độ nghiêm ngặt:

;(function Anonymous(){ 
    'use strict' 
    var a = b = {}; //Uncaught ReferenceError: b is not defined 
})(); 

nhiệm vụ này liên tiếp sẽ không làm việc cùng một cách ...

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