2010-06-17 34 views
5

Tại sao ai đó sẽ sử dụng một biểu thức nhưCụm từ này có nghĩa là "!!"

if(!!window.JSON) alert('exists'); 

thay vì chỉ

if(window.JSON) alert('exists'); 

?

Có cách sử dụng khác cho "!!" không Điều ?

+0

Nhiều tiêu cực là mặc dù hiểu, đó là lý do tại sao. Nếu bạn tiếp tục sử dụng nếu (!! (!!) !!! (!) !! obj) trong mã của bạn, chỉ có bạn mới có thể duy trì nó (nếu may mắn của bạn) - Tôi không phải là không có đồ giả! – simendsjo

+1

xem http: // stackoverflow.com/questions/1406604/what-does-the-operator-double-dấu chấm than-point-mean-in-javascript/1407769 # 1407769; và bạn nói đúng, trong trường hợp này là thừa, vì 'if()' đã chuyển đổi thành boolean – Christoph

Trả lời

1

! là một sự phủ nhận hợp lý, !! là từ khóa hợp lý được áp dụng hai lần, nghĩa là nhận dạng lôgic

Tôi cho rằng mã bạn đang đọc chỉ là vô hại (mặc dù gây nhầm lẫn) thừa.

+0

Vâng, nhưng không phải câu hỏi liên quan đến một kiểu diễn xuất ngầm định từ đối tượng đến boolean? –

15

!! sẽ chỉ đơn giản gây ra một sự chuyển đổi boolean, nó không phải là cần thiết ở tất cả các sử dụng này xây dựng với tuyên bố if, cũng trong đoạn đầu tiên của bạn, chuyển đổi một đối tượng để boolean làm cho không có ý nghĩa, nó sẽ được luôn luôn đúng.

Các giá trị duy nhất có thể ép buộc để falsenull, undefined, NaN, 0, và chuỗi rỗng và tất nhiên false bất cứ điều gì khác sẽ ép buộc để true.

Khi sử dụng !! là hợp lý khi bạn muốn đảm bảo nhận kết quả boolean, ví dụ: khi sử dụng toán tử logic &&||.

Những nhà khai thác có thể trở lại giá trị của một toán hạng, và không phải là một kết quả boolean, ví dụ:

true && "foo"; // "foo" 
"foo" || "bar" ; // "foo" 

Hãy tưởng tượng bạn có một hàm kiểm tra hai giá trị, và bạn mong đợi một kết quả boolean:

function isFoo() { 
    return 0 && true; 
} 

isFoo(); // returns 0, here it makes sense to use !! 

Edit: Nhìn vào chỉnh sửa của bạn, if (!!window.JSON) chỉ là dư thừa như tôi đã nói trước đây, vì if statement tự wil l thực hiện chuyển đổi boolean internally khi biểu thức điều kiện được đánh giá.

+0

Có vẻ như bạn muốn ghi một cái gì đó như 'hàm isFoo (obj) {return obj & & true;} isFoo (0);' trong ví dụ cuối :) hoặc 'return !! obj & & true;' – Znarkus

+0

'false &&" foo "' đánh giá thành * false *. – Gumbo

+0

@Gumbo: Yep, là một lỗi đánh máy s/sai/đúng, @Znarkus, vâng, chỉ cần một cái gì đó cho mục đích giải thích;) Thanks guys ... – CMS

2

Có thể chúng đang cố gắng truyền đối tượng sang boolean. Bằng cách áp dụng toán tử boolean (!) cho đối tượng, nó trở thành một bool, nhưng chúng không thực sự muốn phủ định, vì vậy chúng áp dụng một thứ hai để hủy bỏ đầu tiên.

2
// !! = boolean typecasting in javascript 

var one = 1 
var two = 2; 

if (one==true) app.alert("one==true"); 
if (!!one==true) app.alert("!!one==true"); 

if (two==true) app.alert("two==true"); // won't produce any output 
if (!!two==true) app.alert("!!two==true"); 
+0

đó là lý do tại sao bạn nên sử dụng '===' và cast rõ ràng: các '= = 'loại quy tắc chuyển đổi là một cái gì đó của một WTF – Christoph

1

Chuyển đổi boolean của nó, đảm bảo chuyển đổi thành boolean lần đầu tiên sau đó phủ nhận trở lại giá trị ban đầu.

Tuy nhiên nó được sử dụng không đúng ở đây và sẽ chỉ thực sự phù hợp nếu bạn gán nó vào một biến khác - vì lý do hiệu suất

var isJSON = (!!window.JSON); 

if (isJSON) doX; 
if (isJSON) doY; 
if (isJSON) doZ; 
Các vấn đề liên quan