2012-05-01 43 views
5

Trong đoạn mã sauTại sao không có tuyên bố so sánh trong javascript 'if ... else ...' tuyên bố này

var $next = $active.next().length ? $active.next() 
     : $('#slideshow IMG:first'); 

phần '$ active.next(). Chiều dài' dường như không để so sánh bất cứ điều gì và tôi không hiểu làm thế nào tình trạng được xác định là Đúng hay Sai.

Hoặc có phải là: nếu $ khác nhau tiếp theo bằng $ active.next(). Length thì điều kiện có đúng không?

+0

bạn có thể muốn đọc: http://stackoverflow.com/questions/6766044/understanding-javascript-hoisting-and-truthy-falsy –

+0

Một cách funkier (và ngắn hơn và các cuộc gọi chức năng ít hơn) để làm điều này sẽ là var $ next = $ ($ active.next() [0] || '#slideshow img: đầu tiên'); – GillesC

Trả lời

9

Trong javascript, bất kỳ biểu thức nào cũng có thể được chuyển đổi thành giá trị trung thực hoặc giả và do đó hợp lệ ở một nơi so sánh. Các giá trị đó là sai trong javascript là

  • false
  • 0
  • "" (chuỗi rỗng)
  • null
  • undefined
  • NaN

Trong trường hợp này length đề cập đến một giá trị số và nếu nó đánh giá là 0 thì nó sẽ bị coi là sai. Nếu không, nó sẽ là sự thật

5

Nếu length tài sản tương đương với 0 hoặc undefined (ví dụ: $active không phải là một mảng), tình trạng này sẽ false.

2

Nếu $active.next().lengthtrue, có nghĩa là có một phần tử tiếp theo, sau đó $next = $active.next(). Nếu không, $next = $('#slideshow IMG:first'). Toán tử ? được gọi là toán tử bậc ba. Đó là một đoạn ngắn if else.

1

Đó là một so sánh tương đương ternary tới:

if($active.next().length) { 
    $next = $active.next(); 
} 
else { 
    $next = $('#slideshow IMG:first'); 
} 

Vì vậy, tình trạng này được dựa trên $ active.next() chiều dài mà phải trả lại một giá trị zero hoặc cao hơn.. Bất kỳ điều gì lớn hơn 0, JavaScript sẽ hiểu là đúng, không sai.

0

Những gì bạn đang xem một số Ternary opertation là một bàn tay ngắn cho Nếu ... Khác ... bạn đã đề cập trong tiêu đề.

Vì vậy, phiên bản dài của bản sao kê của bạn là;

if($active.next().length){ 
$next = $active.next(); 
}else { 
$next = $('#slideshow IMG:first'); 
}