2012-05-06 31 views
71

thể trùng lặp:
What is the !! (not not) operator in JavaScript?Phủ định kép (!!) trong javascript - mục đích là gì?

tôi đã gặp phải đoạn mã này

function printStackTrace(options) { 
    options = options || {guess: true}; 
    var ex = options.e || null, guess = !!options.guess; 
    var p = new printStackTrace.implementation(), result = p.run(ex); 
    return (guess) ? p.guessAnonymousFunctions(result) : result; 
} 

Và không thể không tự hỏi tại sao sự phủ định tăng gấp đôi? Và liệu có cách nào khác để đạt được hiệu quả tương tự?

(mã là từ https://github.com/eriwen/javascript-stacktrace/blob/master/stacktrace.js)

+0

Suy nghĩ về nó một chút, có vẻ như nó có thể làm một số đúc buộc, nhưng đây có phải là cách tốt nhất để đạt được nó? (Tôi giả sử nó được lấy từ Ruby?) –

+0

Ngoài ra, điều này được sử dụng cho cơ bản cùng một lý do trong nhiều ngôn ngữ khác (ví dụ: C, C++, Ruby, Java, ...). –

+2

Bạn không thể xóa một khi có câu trả lời, vì vậy chỉ cần bỏ phiếu để đóng dưới dạng trùng lặp ':)'. –

Trả lời

108

Nó chuyển sang dạng boolean. Các ! đầu tiên phủ nhận nó một lần, chuyển đổi các giá trị như vậy:

  • undefined để true
  • null để true
  • +0 để true
  • -0 để true
  • '' để true
  • NaN để true
  • false để true
  • Tất cả các biểu thức khác để false

Sau đó, người kia ! phủ nhận nó một lần nữa. Một dàn diễn viên ngắn gọn để boolean, chính xác tương đương với ToBoolean chỉ đơn giản là vì !defined as its negation.Tuy nhiên, điều này không cần thiết ở đây, bởi vì nó chỉ được sử dụng như điều kiện của toán tử có điều kiện, điều này sẽ xác định tính trung thực theo cùng một cách.

+1

Khi bạn nói "khá nhiều tương đương", bạn có biết liệu có sự khác biệt nào không? Nhanh hơn hàm Boolean(), có lẽ? – mwcz

+0

@mwcz. Đừng nghĩ về nó ... những lợi ích là gì? – gdoron

+0

@mwcz: Sự khác biệt đầu tiên và duy nhất (ít nhất, mà tôi đã có thể tìm thấy) là 'Boolean' có thể được đặt thành bất kỳ chức năng nào cả. – Ryan

28
var x = "somevalue" 
var isNotEmpty = !!x.length; 

Hãy phá vỡ nó thành từng mảnh:

x.length // 9 
!x.length // false 
!!x.length // true 

Vì vậy, nó được sử dụng chuyển đổi một "truethy" \ "falsy" giá trị cho một boolean.


Các giá trị sau là tương đương với sai trong báo cáo có điều kiện:

  • sai
  • rỗng
  • không xác định
  • Các chuỗi rỗng "" (\ '')
  • Các số 0
  • Số NaN

Tất cả các giá trị khác tương đương với giá trị thực.

14

Phủ định kép biến giá trị "trung thực" hoặc "giả" thành giá trị boolean, true hoặc false.

Hầu hết đã quen thuộc với việc sử dụng truthiness như một thử nghiệm:

if (options.guess) { 
    // runs if options.guess is truthy, 
} 

Nhưng điều đó không có nghĩa là:

options.guess===true // could be, could be not 

Nếu bạn cần để buộc một giá trị "truthy" đến một giá trị boolean true , !! là một cách thuận tiện để thực hiện điều đó:

!!options.guess===true // always true if options.guess is truthy 
Các vấn đề liên quan