2012-03-30 41 views
5

Ai đó có thể giải thích mục đích của việc bỏ hai lần số reverse var trong mã dưới đây?Ý nghĩa của [-1,1] [+ !! boolean_var]

return function (a,b) { 
    var A = key(a), B = key(b); 
    return ((A < B) ? -1 : 
      (A > B) ? +1 : 0)) * [-1,1][+!!reverse];     
} 

Con đường tôi hiểu nó, mục đích là để chọn các chỉ số thích hợp từ các mảng [-1,1] để sau đó sử dụng nó trong các nhân nhưng có vẻ như với tôi rằng [-1,1][+!!reverse]; có thể được thay thế một cách an toàn bằng cách [-1,1][+reverse];

Am Tôi sai? Bạn đạt được điều gì hoặc ngăn chặn bằng cách phủ nhận hai lần reverse ở đó?

tôi thấy mã ở trên vào this answer.

+0

Điều đó thật tuyệt vời, tò mò muốn xem câu trả lời trên số này –

+0

Nó thay đổi giá trị đảo ngược thành boolean. [Cái gì !! (không phải) toán tử trong JavaScript?] (http://stackoverflow.com/questions/784929/what-is-the-not-not-operator-in-javascript) – Mizuho

+1

Tôi sẽ sử dụng '(đảo ngược? 1: -1) 'thay vì' [-1,1] [+ !! đảo ngược] ', IMO rõ ràng hơn, rẻ hơn, nó không cần một đối tượng mảng và truy cập một chỉ mục, và thậm chí chuyển đổi boolean cũng được ngầm tạo ra toán tử điều kiện ... – CMS

Trả lời

5

Câu trả lời đơn giản nhất có lẽ là một phản ví dụ:

+undefined //NaN 
+!!undefined // 0 

kể từ khi nội dung của [] thường được chuyển thành chuỗi, [NaN] sẽ cố gắng truy cập thuộc tính được gọi là "NaN" từ mảng, không tồn tại và sẽ trả lại không xác định:

[1,-1][+undefined] 
[1,-1][NaN] 
[1,-1]["NaN"] 
undefined 
+0

'[1, -1] [" 0 "]' là '1'. :-P –

+1

Cảm ơn, tôi cảm thấy rằng tôi cần phải chạy và mua một cuốn sách Javascript càng sớm càng tốt: $ – Icarus

4

Bỏ phiếu đôi đơn giản đảm bảo rằng chúng tôi có một bool phù hợp ean. Vì ngược lại có thể là bất cứ điều gì, đôi khi phủ nhận nó sẽ gọi các chuyển đổi "giả tạo" của JavaScript. Vì vậy, ví dụ:

!!"hello" // true 
!!"" // false 
!!1 // true 
!!some_undefined_var // false 
2

!! chuyển giá trị thành boolean. Điều này là cần thiết nếu reverse không phải là một boolean để bắt đầu với.

Xem xét: +!!"hi". Đây là 1, nhưng +"hi"NaN.

1

phép phủ định kép cơ bản sẽ đảo ngược dưới dạng boolean và sau đó + sẽ truyền boolean đó thành int.

như vậy, nếu ngược lại là có thể: "có", "không", "", true, false, 0,1,2, undefined

sự phủ định đôi sẽ làm cho "yes" -> đúng "không" -> đúng "" -> sai đúng -> đúng sai -> sai không xác định -> sai

đó, + sẽ chuyển đổi trues đến 1, và falses 0, do đó nó có thể được sử dụng làm chỉ mục mảng.