2013-05-18 29 views
18
a = 1; 
b = "1"; 
if (a == b && a = 1) { 
    console.log("a==b"); 
} 

Các mã Javascript trên sẽ gây ra một lỗi trong if tuyên bố trong Google Chrome 26.0.1410.43:Tại sao toán tử Javascript "&&" lạ đến vậy?

Uncaught ReferenceError: Invalid left-hand side in assignment

Tôi nghĩ rằng đây là do biến a trong phần thứ hai của báo cáo kết quả && , Không thể chỉ định a=1. Tuy nhiên, khi tôi thử đoạn mã dưới đây, tôi hoàn toàn bối rối!

a = 1; 
b = "1"; 
if (a = 1 && a == b) { 
    console.log("a==b"); 
} 

Tại sao có một tuyên bố đúng nhưng tuyên bố khác sai?

+3

Bạn đang cố gắng làm gì ở đây? Mã nên thực sự làm gì? –

+2

Luôn sử dụng '(' và ')' cho toán tử ưu tiên –

+1

Bạn đã phạm sai lầm ở đây, bạn phải viết như thế này 'if (a == 1 && a == b)'. –

Trả lời

21

Phiên bản thứ hai được phân tích cú pháp là a = (1 && a == b); nghĩa là, kết quả của biểu thức 1 && a == b được gán cho a.

Phiên bản đầu tiên không hoạt động vì bên trái của nhiệm vụ không được phân tích cú pháp như bạn mong đợi. Nó phân tích cú pháp biểu thức như thể bạn đang cố chỉ định giá trị cho mọi thứ ở phía bên phải - (a == b && a) = 1.

Tất cả điều này dựa trên ưu tiên của các toán tử khác nhau. Vấn đề ở đây xuất phát từ thực tế là = có mức độ ưu tiên thấp hơn so với các toán tử khác.

+2

cả hai biểu thức được phân tích cú pháp hoàn toàn chính xác. Chúng không được phân tích cú pháp theo cách mà OP mong đợi ... – Alnitak

+0

@Alnitak: Vâng, tôi nghĩ rằng cách nói của bạn tốt hơn. –

+1

Xem https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/Operator_Precedence để biết danh sách người vận hành ưu tiên – MofX

6

Vì thứ tự các hoạt động không phải là thứ bạn mong đợi. a == b && a = 1 tương đương với (a == b && a) = 1 tương đương với false = 1.

Nếu bạn thực sự muốn thực hiện nhiệm vụ, bạn cần sử dụng dấu ngoặc đơn xung quanh nó: a == b && (a = 1).

60

= has lower operator precendence than both && and ==, có nghĩa là nhiệm vụ đầu tiên của bạn biến thành

if ((a == b && a) = 1) { 

Vì bạn không thể gán cho một biểu thức theo cách này, điều này sẽ cung cấp cho bạn một lỗi.

+0

cảm ơn! – sherlock

+0

Điều đó là mới đối với tôi, cảm ơn bạn đã đăng liên kết tới MDN –

2

Trong if (a = 1 && a == b),

Các hoạt động được thực hiện đầu tiên là 1 && a == b. 1 && kết quả của a == b được thực hiện. Kết quả của hoạt động này được gán cho a.

+0

Điều này không hoàn toàn chính xác. == có mức độ ưu tiên cao hơn &&. Điều này dẫn đến thứ tự đánh giá sau đây: 1. 1 2. && -> bên tay trái đã đúng, không đánh giá bên tay phải 3.a = 1 Kết quả giống như bạn đã nói. Nhưng 1 && a không được đánh giá đầu tiên, nó là 1 && (a == b) trong đó a == b không bao giờ được đánh giá. Nói chung cho a = b && c == d thứ tự đánh giá sẽ là (giả sử b là giả): 1. b 2. c == d 3. b && (c == d) 4. a = (b && (c == d)) – MofX

+0

Xin lỗi. Tôi đã sửa lỗi. – Deepu

+0

Bình luận của tôi cũng sai;) Bạn đã nhận được nó đúng lúc này. Với && b cho b sẽ chỉ được đánh giá, nếu a là đúng. Trong bình luận cuối cùng của tôi, tôi nói rằng phải là sai. – MofX

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