2012-04-02 63 views
9

Cách chính xác để diễn giải biểu thức javascript phức tạp này là gì?Biểu thức điều kiện javascript phức tạp

some_condition ? a = b : c = d = e;

Tiếp theo nguyên tắc điều hành được ưu tiên, tôi mong chờ nó là:

(some_condition ? a = b : c) = d = e;

Nhưng có vẻ như các nhóm thực sự là:

EDIT: (Các nhóm ban đầu là không rõ ràng. Xem bên dưới để cập nhật)

EDIT: some_condition ? a = b : (c = d = e);

Tại sao lại như vậy? (Và không có tôi đã không viết mã đó)

EDIT: Điều này dường như gợi ý rằng trong Javascript để nói ?: có quyền ưu tiên cao hơn = không hoàn toàn đúng. Như một ví dụ nữa:

x = y ? a = b : c = d = e;

Nếu ?: có ưu tiên cao hơn = (như trong C) sau đó các nhóm sẽ

x = ((y ? a = b : c) = (d = e));

nhưng khá (từ câu trả lời) những gì chúng tôi có là

x = (y ? a = b : (c = d = e));

Các ưu tiên tương đối của ?:= dường như phụ thuộc vào nơi chúng xuất hiện trong biểu thức

+1

Uh oh, tốt hơn hãy thoát ra khỏi [spec] (http://es5.github.com/) một lần nữa ... – zzzzBov

+0

Đó là vì bạn chưa đưa ra dấu ngoặc vuông. Thử đặt dấu ngoặc đơn. Nó sẽ hoạt động như mong đợi. – sgowd

+0

không thực sự .. nội tuyến nếu không yêu cầu dấu ngoặc đơn hoặc dấu ngoặc đơn. Kiểm tra câu trả lời của Simon West bên dưới. – MilkyWayJoe

Trả lời

0
if(some_condition){ 
    a=b; 
}else{ 
    d=e; 
    c=d; 
} 
+0

Cũng có hiệu quả giống như' d = e' và 'c = e' cho bit cuối cùng đó. – kiswa

+0

'd = e;' theo sau bởi 'c = d;' không đúng về mặt kỹ thuật, vì 'd = e;' trả về giá trị của 'e' – zzzzBov

+0

Quan trọng hơn là' -1' là bởi vì điều này không trả lời câu hỏi theo bất kỳ cách nào. – zzzzBov

2

Thats một viết tắt if else tuyên bố

dạng dài sẽ

if(some condition) 
{ 
a = b; 
} 
else 
{ 
c = d = e; 
} 
+1

Tôi chắc chắn @tyty hiểu được toán tử '?:' Làm gì, câu hỏi là về quyền ưu tiên của toán tử. – zzzzBov

+3

@zzzzBov thì có lẽ anh ta nên thuật lại câu hỏi. Cái cách mà anh ta ném xung quanh cái vòng lặp trong câu hỏi của anh ta khiến anh ta trông giống như anh ta không thực sự nhận ra nó là gì. –

0

var result = true ? a=b : c=d=e;

nếu đó là sự thật một là tương đương với b và kết quả tương đương với b

var result = false ? a=b : c=d=e;

nếu nó là sai d tương đương với e, c cũng bằng e và kết quả là e

0

Bạn cũng có thể tìm thấy this definition của toán tử ternary hữu ích.

Thông thường sẽ được sử dụng để chỉ định điều gì đó dựa trên điều kiện, nhưng điều này dường như chỉ thay đổi a hoặc cd dựa trên điều kiện.

Tôi thường thấy những thứ như val = isConditionTrue ? trueVal : falseVal; Sau đó, val có thể là trueVal hoặc falseVal dựa trên isConditionTrue.

3

Nếu bạn nhìn vào javascript precedence operators, assignments có một ưu tiên thấp hơn conditional operator nhưng, theo ECMAScript thông số kỹ thuật, Mệnh. 11,12

11.12 Conditional Operator (? :)  
Syntax 

ConditionalExpression : LogicalORExpression 
     LogicalORExpression ? AssignmentExpression : AssignmentExpression 

AssignmentExpression is evaluated as follows: 
1. Let lref be the result of evaluating LogicalORExpression. 
2. If ToBoolean(GetValue(lref)) is true, then 
    a. Let trueRef be the result of evaluating the first AssignmentExpression. 
    b. Return GetValue(trueRef). 
... 

Vì vậy, các nhà điều hành có điều kiện đánh giá rằng mã nhóm mỗi biểu hiện phân công và nó hoạt động như tất cả mọi người giải thích.

Có lẽ tôi có thể là sai ở đây, nhưng tôi nghĩ rằng các nhà khai thác được ưu tiên có liên quan thay vì cách js phân tích một biểu thức như

a = (b < c)? b : c; 

(và không phải khi chứa trong AssignmentExpressions) nơi trong kịch bản này sự phân công nên có một ưu tiên thấp hơn, vì vậy Javascript đánh giá toàn bộ tuyên bố như

a = ((b < c)? b : c); 
Các vấn đề liên quan