2013-08-29 38 views
11

Để bảo vệ mã của tôi truy cập vào các biến chưa được khai báo tôi sử dụngTrình tự đánh giá trong câu lệnh if trong Javascript

if (typeof myVar != 'undefined') 

này hoạt động tốt nhưng tôi muốn dính vào một câu lệnh if trong nó. Một cái gì đó như chuyển đổi này:

if (typeof myVar != 'undefined'){ 
    if (myVar == "test"){} 
} 

này:

if (typeof myVar != 'undefined' && myVar == "test") 

Xét myVar có thể không xác định, là mã cuối cùng này an toàn trong mọi trường hợp sử dụng và mọi trình duyệt?

Có thể các câu lệnh khác nhau bên trong một số if() không được đánh giá theo thứ tự chúng được viết không?

Tôi có thể giả định myVar == "test" sẽ không bao giờ được thực thi nếu myVar không xác định?

+2

Có thể. Nó sẽ là một cách tiếp cận tốt hơn ở đây để sử dụng 'if (myVar && myVar ==" test ")' ở đây. – user1983983

+0

Có && toán tử là toán tử ngắn mạch, vì vậy điều kiện khác sẽ không được kiểm tra nếu điều kiện đầu tiên là false – Shadow

+0

có, nhưng mã bị lỗi khi bạn cố truy cập biến không xác định – Saturnix

Trả lời

9

Tôi có thể giả định myVar == "test" sẽ không bao giờ được thực thi nếu myVar là chưa xác định?

Có. Các biểu hiện bạn đang thử nghiệm là một logical AND expression và tự đánh giá của hai toán hạng được quy định:

Việc sản xuất LogicalANDExpression:LogicalANDExpression&&BitwiseORExpression được đánh giá như sau (nhấn mạnh thêm):

  • Cho phép lref là kết quả của việc đánh giá LogicalANDExpression.
  • Hãy để lval là GetValue (lref).
  • Nếu ToBoolean (lval) là sai, trả lại lval.
  • Cho phép rref là kết quả của việc đánh giá BitwiseORExpression.
  • Trả lại GetValue (rref).

Đó cơ bản nói đánh giá các toán hạng đầu tiên, nếu kết quả của đánh giá đó là false, toàn bộ biểu thức là false, và các toán hạng thứ hai là không bao giờ được đánh giá.

4

Yes nếu bạn đang sử dụng & & điều hành sau đó nếu điều kiện đầu tiên là sai sau đó thứ hai sẽ không bao giờ thử nghiệm.

1
if (typeof myVar != 'undefined' && myVar == "test") 

Khái niệm được đánh giá trái sang phải nên nó sẽ short circuit nếu myVarundefined (myVar sẽ không được so sánh với "test")

4

Có, không sao.

Trong javascript, các ưu tiên như sau:

typeof>!=/==>&&

Đối a && b, b sẽ không bao giờ được thực thi khi a là sai.

-1

Rất quan trọng! Sử dụng

if (myVar !== undefined) 

Điều này có nghĩa là không có cách nào myVar sẽ vượt qua nếu có bất kỳ bài tập nào trước đó.

VÀ DONT USE 'undefined' ĐÂY LÀ MỘT ỨNG DỤNG SIMPLE!

Chúc may mắn!

+0

'var myVar = undefined' không phải là một nhiệm vụ? – Bergi

+1

Toán tử 'typeof' sẽ trả về một STRING SIMPLE! – Bergi

1

Bất cứ khi nào bạn sử dụng các nhà điều hành & &, các điều kiện mà bạn vượt qua trong sẽ được đánh giá theo thứ tự mà họ đã được thông qua năm

Trong trường hợp của bạn:.

if (typef myVar != 'undefined' && myVar == 'test') 

Khi chương trình đi vào này nếu câu lệnh, trước tiên nó sẽ kiểm tra xem loại biến là không xác định, nếu nó trả về true, nó tiếp tục đối số thứ hai và kiểm tra xem myVar có một giá trị 'test' hay không. Ngay cả khi myVar == 'test', câu lệnh if sẽ đánh giá giá trị false false & & true, trả về true. Chỉ khi cả hai điều kiện trả về true, khối mã sẽ được thực thi, vì biểu thức sẽ được đánh giá là đúng (đúng & & đúng).

Nếu điều kiện đầu tiên

typeof myVar != 'undefined' 

lợi nhuận sai sự thật, điều kiện thứ hai sẽ không bao giờ được đánh giá.

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