2.6k

Tôi thấy một số mã dường như sử dụng một toán tử mà tôi không nhận ra, dưới dạng hai dấu chấm than, như vậy : !!. Ai đó có thể vui lòng cho tôi biết những gì nhà điều hành này làm?

Bối cảnh mà tôi thấy điều này là,

this.vertical = vertical !== undefined ? !!vertical : this.vertical;
|
2.3k

Ép buộc oObjectđể boolean. Nếu nó là falsey (ví dụ 0, null, undefined, vv), nó sẽ được false, nếu không, true.

!oObject  //Inverted boolean
!!oObject //Non inverted boolean so true boolean representation

Vì vậy, !!không phải là một nhà điều hành, nó chỉ là !nhà điều hành hai lần.

Ví dụ thực tế "Phiên bản IE thử nghiệm":

let isIE8 = false;  
isIE8 = !! navigator.userAgent.match(/MSIE 8.0/);  
console.log(isIE8); // returns true or false 

Nếu bạn

console.log(navigator.userAgent.match(/MSIE 8.0/));  
// returns either an Array or null  

nhưng nếu bạn

console.log(!!navigator.userAgent.match(/MSIE 8.0/));  
// returns either true or false
|
  • 1

    Nó chuyển đổi một nonboolean thành một boolean đảo ngược (ví dụ: 5 sẽ là sai, vì 5 là một giá trị không sai trong JS), sau đó chuyển đổi boolean để bạn có được giá trị ban đầu là boolean (vì vậy !! 5 sẽ đúng).

    – Tạ Minh Khôi 17:14:18 24/04/2009
  • 1

    Một cách dễ dàng để mô tả nó là: Boolean (5) === !! 5; Đúc giống nhau, ít nhân vật hơn.

    – Ngô Nhân Nguyên 18:27:27 24/04/2009
  • 1

    Điều này được sử dụng để chuyển đổi các giá trị trung thực thành boolean true và các giá trị sai lệch quá boolean false.

    – Tạ Kim Thy 03:53:22 16/07/2012
  • 1

    @Micah Snyder hãy cẩn thận rằng trong JavaScript, tốt hơn là sử dụng các nguyên hàm boolean thay vì tạo các đối tượng đóng hộp booleans với Boolean () mới. Dưới đây là một ví dụ để thấy sự khác biệt: jsfiddle.net/eekbu

    – Lý Cát Linh 12:24:32 03/02/2013
  • 1

    Theo như tôi biết, mẫu bang-bang này không hữu ích trong câu lệnh if (khác _; chỉ trong một câu lệnh trả về của một hàm sẽ trả về một boolean.

    – Trịnh Xuân Nương 19:43:13 26/03/2014
795

Đó là một cách tối nghĩa khủng khiếp để thực hiện chuyển đổi loại.

!KHÔNG . Vì vậy, !truefalse, và !falsetrue. !0true, và !1false.

Vì vậy, bạn đang chuyển đổi một giá trị thành một boolean, sau đó đảo ngược nó, sau đó đảo ngược nó một lần nữa.

// Maximum Obscurity:
val.enabled = !!userId;

// Partial Obscurity:
val.enabled = (userId != 0) ? true : false;

// And finally, much easier to understand:
val.enabled = (userId != 0);
|
  • 1

    !! sai = sai. !! true = true

    – Đỗ Quốc Hải 17:38:29 10/09/2009
  • 1

    (userId == 0) ? false : true;làm tổn thương não của tôi ít nhất

    – phuong vi 17:43:22 10/09/2009
  • 1

    Tối nghĩa khủng khiếp .... đẹp đẽ súc tích trước mắt tôi ....

    – Tạ Hải Ân 21:26:25 23/09/2010
  • 1

    Là biến thể "dễ hiểu hơn nhiều" thực sự dễ hiểu hơn nhiều ở đây? Kiểm tra so với 0 không phải là kiểm tra thực tế so với 0, nhưng kiểm tra đối với danh sách giá trị hơi kỳ lạ mà Javascript coi là bằng 0. userId ? true : false làm rõ hơn rằng có chuyển đổi đang diễn ra và xử lý trường hợp giá trị của userId có thể được đặt rõ ràng thànhundefined

    – Trịnh Hải Mỹ 16:26:22 13/10/2010
  • 1

    Bộ não của tôi không có bất kỳ vấn đề nào khi giải mã !!varthành Boolean(var).. và !!nhanh hơn (ít hướng dẫn xử lý hơn) và ngắn hơn các giải pháp thay thế.

    – Trịnh Mộng Thu 23:36:07 24/10/2010
410

!!exprtrả về một giá trị Boolean ( truehoặc false) tùy thuộc vào truthiness của biểu thức. Nó có ý nghĩa hơn khi được sử dụng trên các loại không boolean. Xem xét các ví dụ này, đặc biệt là ví dụ thứ 3 trở đi:

          !!false === false
           !!true === true

              !!0 === false
!!parseInt("foo") === false // NaN is falsy
              !!1 === true
             !!-1 === true  // -1 is truthy

             !!"" === false // empty string is falsy
          !!"foo" === true  // non-empty string is truthy
        !!"false" === true  // ...even if it contains a falsy value

     !!window.foo === false // undefined is falsy
           !!null === false // null is falsy

             !!{} === true  // an (empty) object is truthy
             !![] === true  // an (empty) array is truthy; PHP programmers beware!
|
140

Pha một ít trà:

!!không phải là một nhà điều hành. Đó là việc sử dụng hai lần !- là toán tử "không" logic.


Về lý thuyết:

! xác định "sự thật" của giá trị không phải là:

  • Sự thật là falsekhông phải true(đó là lý do tại sao !falsekết quả true)

  • Sự thật là truekhông phải false(đó là lý do tại sao !truekết quả false)


!!xác định "sự thật" của giá trị không phảikhông:

  • Sự thật là truekhông phải vậy true (đó là lý do tại sao !!truekết quả true)

  • Sự thật là falsekhông phải vậy false (đó là lý do tại sao !!falsekết quả false)


Điều chúng tôi muốn xác định trong so sánh là "sự thật" về giá trị của một tham chiếu, chứ không phải giá trị của chính tham chiếu đó. Có một trường hợp sử dụng trong đó chúng ta có thể muốn biết sự thật về một giá trị, ngay cả khi chúng ta mong đợi giá trị đó là false(hoặc falsey) hoặc nếu chúng ta mong đợi giá trị không phải là loại boolean.


Trong thực tế:

Hãy xem xét một chức năng ngắn gọn để phát hiện chức năng tính năng (và trong trường hợp này là khả năng tương thích nền tảng) bằng cách gõ động (hay còn gọi là "gõ vịt"). Chúng tôi muốn viết một hàm trả về truenếu trình duyệt của người dùng hỗ trợ <audio>phần tử HTML5 , nhưng chúng tôi không muốn hàm này gây ra lỗi nếu <audio>không được xác định; và chúng tôi không muốn sử dụng try ... catchđể xử lý bất kỳ lỗi nào có thể xảy ra (vì chúng là thô); chúng tôi cũng không muốn sử dụng kiểm tra bên trong chức năng sẽ không tiết lộ sự thật về tính năng này (ví dụ: document.createElement('audio')vẫn sẽ tạo một phần tử được gọi <audio>ngay cả khi HTML5 <audio>không được hỗ trợ).


Dưới đây là ba cách tiếp cận:

// this won't tell us anything about HTML5 `<audio>` as a feature
var foo = function(tag, atr) { return document.createElement(tag)[atr]; }

// this won't return true if the feature is detected (although it works just fine)
var bar = function(tag, atr) { return !document.createElement(tag)[atr]; }

// this is the concise, feature-detecting solution we want
var baz = function(tag, atr) { return !!document.createElement(tag)[atr]; }

foo('audio', 'preload'); // returns "auto"
bar('audio', 'preload'); // returns false
baz('audio', 'preload'); // returns true

Mỗi hàm chấp nhận một đối số cho a <tag>và một attributetìm kiếm, nhưng mỗi hàm trả về các giá trị khác nhau dựa trên những gì so sánh xác định.

Nhưng xin chờ chút nữa!

Một số bạn có thể nhận thấy rằng trong ví dụ cụ thể này, người ta có thể chỉ cần kiểm tra một thuộc tính bằng cách sử dụng các phương tiện kiểm tra hiệu quả hơn một chút nếu đối tượng trong câu hỏi có thuộc tính. Có hai cách để làm điều này:

// the native `hasOwnProperty` method
var qux = function(tag, atr) { return document.createElement(tag).hasOwnProperty(atr); }

// the `in` operator
var quux = function(tag, atr) { return atr in document.createElement(tag); }

qux('audio', 'preload');  // returns true
quux('audio', 'preload'); // returns true

Chúng tôi lạc đề ...

Tuy nhiên, hiếm khi xảy ra những tình huống này, có thể tồn tại một vài tình huống trong đó phương tiện ngắn gọn nhất, hiệu quả nhất và do đó, phương tiện được ưa thích nhất truetừ một giá trị không phải là boolean, có thể không xác định được thực sự bằng cách sử dụng !!. Hy vọng điều này vô lý xóa nó đi.

|
  • 1

    Câu trả lời hoàn toàn tuyệt vời, nhưng tôi không thấy tiện ích của !! xây dựng. Vì một if()câu lệnh đã chuyển biểu thức thành boolean, nên việc truyền rõ ràng giá trị trả về của hàm kiểm tra thành boolean là không cần thiết - vì "trueness" === đúng như một if()câu lệnh đi. Hay tôi đang thiếu một kịch bản mà bạn CẦN một biểu thức trung thực để thực sự là boolean true?

    – Đỗ Quốc Hải 13:27:19 06/04/2016
  • 1

    Các if()câu lệnh @TomAuger thực hiện boolean chống lại các giá trị falsey, nhưng nói rằng bạn thực sự muốn đặt một cờ boolean trên một đối tượng - nó sẽ không tạo ra nó giống như một if()câu lệnh. Ví dụ: object.hasTheThing = !!castTheReturnValToBoolNoMatterWhat()sẽ đặt truehoặc falsethay vì giá trị trả về thực. Một ví dụ khác là có lẽ tất cả các quản trị viên là idcủa 0và không quản trị viên là id 1hoặc cao hơn. Để có được truenếu ai đó không phải là quản trị viên, bạn có thể làm person.isNotAdmin = !!admin.id. Ít trường hợp sử dụng, nhưng nó ngắn gọn khi có.

    – phuong vi 15:41:36 31/05/2018
92

!!chuyển đổi giá trị ở bên phải của nó thành giá trị boolean tương đương của nó. (Nghĩ cách "đúc kiểu" của người nghèo). ý định thường là để truyền đạt cho người đọc rằng mã không quan tâm những gì giá trị trong biến, nhưng những gì nó có "chân lý" giá trị là.

|
  • 1

    Hoặc trong trường hợp giá trị boolean ở bên phải, nó không làm gì cả.

    – Đỗ Quốc Hải 17:28:56 10/09/2009
  • 1

    @Daniel: !vẫn lật giá trị sang phải. Trong trường hợp boolean bên phải hầu hết !phủ nhận giá trị, trong khi bên trái hầu hết !phủ nhận nó một lần nữa. Hiệu quả ròng là không có thay đổi, nhưng hầu hết các công cụ sẽ tạo mã op cho phủ định kép.

    – phuong vi 17:34:00 10/09/2009
  • 1

    Nhưng vấn đề là gì? Nếu tôi làm if(0){...Javascript đã biết điều này là sai. Tại sao nói tốt hơn if(!!0){...?

    – Tạ Hải Ân 23:37:00 06/05/2016
  • 1

    điểm là cho các biến mà bạn có thể không biết nội dung của nó; nếu nó có thể là một số nguyên hoặc một chuỗi, một đối tượng hoặc null, không xác định, v.v ... Đây là một cách dễ dàng để kiểm tra sự tồn tại.

    – Trịnh Hải Mỹ 12:59:18 22/09/2016
63

!!fooáp dụng toán tử unary not hai lần và được sử dụng để chuyển sang kiểu boolean tương tự như việc sử dụng unary plus +foođể truyền vào số và nối chuỗi rỗng ''+foođể truyền thành chuỗi.

Thay vì các hack này, bạn cũng có thể sử dụng các hàm xây dựng tương ứng với các kiểu nguyên thủy ( không sử dụng new) để truyền các giá trị rõ ràng, tức là

Boolean(foo) === !!foo
Number(foo)  === +foo
String(foo)  === ''+foo
|
  • 1

    Nhưng sau đó bạn có thể gặp vấn đề với instanceof. đối tượng Boolean (1) mới -> đúng !! 1 đối tượng của đối tượng -> sai

    – Hồ Thế Trung 12:53:30 07/10/2010
  • 1

    không, bạn không thể: lưu ý rằng các hàm tạo được gọi mà không có new- như được đề cập rõ ràng trong câu trả lời của tôi

    – Lý Ðăng Khánh 09:46:04 08/10/2010
  • 1

    tuyệt diệu! Điều này hữu ích cho một chút hack khi bạn cần đánh giá các chuỗi có "0" là sai thay vì đúng. (tức là khi đọc các giá trị từ các lựa chọn, bởi vì chúng được đọc dưới dạng Chuỗi). Vì vậy, nếu bạn muốn coi "0" là âm (Boolean false), thì x="0"chỉ cần làm: x=!!+x; //falsegiống như Boolean(Number(x))Số (hoặc + x) chuyển đổi chuỗi "0" thành 0, mà DOES đánh giá thành sai, rồi Boolean (!! x) đưa nó vào boolean trực tiếp. Dễ như ăn bánh!

    – Tạ Mỹ Uyên 18:13:58 03/06/2013
  • 1

    @DiegoDD tại sao bạn lại chọn !!+xvs x !== "0"?

    – Hoàng Thái Sang 23:46:02 29/12/2015
  • 1

    @placeybordeaux vì ví dụ bạn có thể muốn chuyển đổi giá trị và gán nó cho biến khác, bất kể bạn có muốn so sánh nó với thứ gì khác hay không.

    – Lý Quốc Toản 18:26:40 05/01/2016
57

Vì vậy, nhiều câu trả lời làm một nửa công việc. Có, !!Xcó thể được đọc là "tính trung thực của X [được biểu thị dưới dạng boolean]". Nhưng !!thực tế không phải là như vậy, rất quan trọng để tìm ra liệu một biến duy nhất là (hoặc thậm chí nếu nhiều biến là) trung thực hay giả. !!myVar === truecũng giống như chỉ myVar. So sánh !!Xvới một boolean "thực" không thực sự hữu ích.

Những gì bạn đạt được !!là khả năng kiểm tra tính trung thực của nhiều biến số với nhau theo cách lặp lại, được tiêu chuẩn hóa (và thân thiện với JSLint).

Đơn giản chỉ cần đúc :(

Đó là...

  • 0 === falsefalse.
  • !!0 === falsetrue.

Ở trên không hữu ích lắm. if (!0)cho bạn kết quả tương tự như if (!!0 === false). Tôi không thể nghĩ ra một trường hợp tốt để chuyển một biến thành boolean và sau đó so sánh với một boolean "thật".

Xem "== và! =" Từ hướng dẫn của JSLint (lưu ý: Crockford đang di chuyển trang web của anh ấy một chút; liên kết đó có thể bị chết tại một số điểm) để biết một chút về lý do:

Các toán tử == và! = Thực hiện ép buộc trước khi so sánh. Điều này là xấu vì nó khiến '\ t \ r \ n' == 0 là đúng. Điều này có thể che dấu lỗi loại. JSLint không thể xác định một cách đáng tin cậy nếu == đang được sử dụng một cách chính xác, vì vậy tốt nhất là không nên sử dụng == và! = Và luôn luôn sử dụng các toán tử === và! == đáng tin cậy hơn.

Nếu bạn chỉ quan tâm rằng một giá trị là trung thực hoặc giả, thì hãy sử dụng mẫu ngắn. Thay vì
(foo != 0)

chỉ nói
(foo)

và thay vì
(foo == 0)

Nói
(!foo)

Lưu ý rằng có một số trường hợp không trực quan trong đó boolean sẽ được chuyển thành một số ( trueđược truyền tới 1falsethành 0) khi so sánh boolean với một số. Trong trường hợp này, !!có thể hữu ích về mặt tinh thần. Mặc dù, một lần nữa, đây là những trường hợp bạn đang so sánh một người không phải là boolean với một boolean khó đánh máy, đó là, imo, một sai lầm nghiêm trọng. if (-1)vẫn là con đường để đi đến đây

╔═══════════════════════════════════════╦═══════════════════╦═══════════╗
               Original                    Equivalent       Result   
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
 if (-1 == true) console.log("spam")    if (-1 == 1)       undefined 
 if (-1 == false) console.log("spam")   if (-1 == 0)       undefined 
   Order doesn't matter...             ║                   ║           ║
║ if (true == -1) console.log("spam")   ║ if (1 == -1)      ║ undefined ║
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (!!-1 == true) console.log("spam") ║ if (true == true) ║ spam      ║ better
╠═══════════════════════════════════════╬═══════════════════╬═══════════╣
║ if (-1) console.log("spam")           ║ if (truthy)       ║ spam      ║ still best
╚═══════════════════════════════════════╩═══════════════════╩═══════════╝

Và mọi thứ thậm chí còn điên rồ hơn tùy thuộc vào động cơ của bạn. WScript, ví dụ, giành giải thưởng.

function test()
{
    return (1 === 1);
}
WScript.echo(test());

Do một số jive Windows lịch sử , nó sẽ xuất -1 trong một hộp thông báo! Hãy thử nó trong một dấu nhắc cmd.exe và xem! Nhưng WScript.echo(-1 == test())vẫn cung cấp cho bạn 0 hoặc WScript false. Nhìn đi chỗ khác Thật gớm ghiếc.

So sánh sự thật :)

Nhưng nếu tôi có hai giá trị tôi cần kiểm tra xem truthi / falsi-ness bằng nhau thì sao?

Giả vờ chúng ta có myVar1 = 0;myVar2 = undefined;.

  • myVar1 === myVar20 === undefinedvà rõ ràng là sai.
  • !!myVar1 === !!myVar2!!0 === !!undefinedvà là sự thật! Sự thật giống nhau! (Trong trường hợp này, cả hai "có một sự thật giả dối".)

Vì vậy, nơi duy nhất bạn thực sự cần sử dụng "biến boolean-cast" sẽ là nếu bạn gặp tình huống kiểm tra xem cả hai biến có cùng độ thật không? Đó là, sử dụng !!nếu bạn cần để xem nếu hai vars là cả truthy hoặc cả hai falsy (hay không), có nghĩa là, các bằng (hoặc không) truthiness .

Tôi không thể nghĩ ra một trường hợp sử dụng tuyệt vời, không giả tạo cho việc đó. Có lẽ bạn đã "liên kết" các trường trong một hình thức?

if (!!customerInput.spouseName !== !!customerInput.spouseAge ) {
    errorObjects.spouse = "Please either enter a valid name AND age " 
        + "for your spouse or leave all spouse fields blank.";
}

Vì vậy, bây giờ nếu bạn có một sự thật cho cả hai hoặc giả cho cả tên vợ và tuổi, bạn có thể tiếp tục. Nếu không, bạn chỉ có một lĩnh vực có giá trị (hoặc một cuộc hôn nhân được sắp xếp rất sớm) và cần tạo thêm một lỗi trên errorObjectsbộ sưu tập của bạn .


EDIT ngày 24 tháng 10 năm 2017, ngày 6 tháng 2 năm 19:

Thư viện bên thứ 3 mong đợi các giá trị Boolean rõ ràng

Đây là một trường hợp thú vị ... !!có thể hữu ích khi các lib của bên thứ 3 mong đợi các giá trị Boolean rõ ràng.

Chẳng hạn, Sai trong JSX (React) có một ý nghĩa đặc biệt không được kích hoạt trên sự giả dối đơn giản. Nếu bạn đã cố gắng trả lại một cái gì đó như sau trong JSX của mình, hãy chờ đợi một int trong messageCount...

{messageCount && <div>You have messages!</div>}

... Bạn có thể ngạc nhiên khi thấy React kết xuất 0khi bạn không có tin nhắn. Bạn phải trả về false một cách rõ ràng để JSX không hiển thị. Câu lệnh trên trả về 0, mà JSX vui vẻ biểu hiện, như nó nên. Nó không thể nói rằng bạn không có Count: {messageCount && <div>Get your count to zero!</div>}(hoặc một cái gì đó ít giả tạo hơn).

  • Một sửa chữa liên quan đến bangbang, mà ép buộc 0vào !!0, đó là false:
    {!!messageCount && <div>You have messages!</div>}

  • Các tài liệu của JSX đề nghị bạn rõ ràng hơn, viết mã tự nhận xét và sử dụng phép so sánh để ép buộc Boolean.
    {messageCount > 0 && <div>You have messages!</div>}

  • Tôi cảm thấy thoải mái hơn khi tự mình xử lý sự giả dối -
    {messageCount ? <div>You have messages!</div> : false}

Thỏa thuận tương tự trong Bản mô tả: Nếu bạn có hàm trả về giá trị boolean (hoặc bạn đang gán giá trị cho biến boolean), bạn [thường] không thể trả về / gán giá trị boolean-y; nó phải là một boolean được gõ mạnh. Điều này có nghĩa, iff myObjectđược gõ mạnh , return !myObject;hoạt động cho một hàm trả về boolean, nhưng return myObject;không. Bạn phải return !!myObjectphù hợp với mong đợi của Typecript.

Ngoại lệ cho Bản in? Nếu myObjectlà một any, bạn quay lại Wild West của JavaScript và có thể trả lại mà không cần !!, ngay cả khi kiểu trả về của bạn là boolean.

Hãy nhớ rằng đây là các quy ước về JSX & typecript , không phải là các quy ước vốn có của JavaScript .

Nhưng nếu bạn thấy 0s lạ trong JSX được kết xuất của bạn, hãy nghĩ rằng quản lý giả mạo lỏng lẻo.

|
  • 1

    Lời giải thích hay. Vì vậy, bạn sẽ nói !! không thực sự cần thiết trong ví dụ phát hiện tính năng Công nhân này ? if (!!window.Worker)

    – Hồ Thế Trung 20:41:37 06/05/2015
  • 1

    Không, bạn sẽ không cần nó. Sự thật và true"bên ngoài" hoạt động giống hệt nhau trong một if. Tôi tiếp tục cố gắng, nhưng tôi không thể nghĩ ra lý do nào để thích đưa tính trung thực thành giá trị boolean bên ngoài trường hợp "so sánh sự thật" phức tạp, ở trên, ngoại trừ khả năng đọc nếu bạn sử dụng lại giá trị sau này, như trong qví dụ về thư viện . Nhưng ngay cả khi đó, đó là một lối tắt mất thông tin và tôi cho rằng bạn tốt hơn nên đánh giá tính trung thực mỗi lần.

    – Lý Ðăng Khánh 20:54:57 06/05/2015
  • 1

    Phản ứng là lý do chính khiến chúng tôi bắt đầu sử dụng !! mô hình, nhưng nó là một điều rất thuận tiện và lặp lại. Tôi chỉ phải lo lắng về tính trung thực hoặc không ổn định của một cái gì đó, không phải loại cơ bản là gì.

    – Tạ Mỹ Uyên 23:02:49 28/07/2018
  • 1

    Downvote mà không có ý kiến ​​làm cho khó khăn để giải quyết mối quan tâm của bạn! Hãy cho tôi biết những gì có vẻ xấu, và tôi sẽ vui lòng giải quyết nó.

    – Hoàng Thái Sang 21:51:27 03/01/2019
50

Nó chỉ là toán tử KHÔNG logic, hai lần - nó được sử dụng để chuyển đổi một cái gì đó sang boolean, ví dụ:

true === !!10

false === !!0
|
  • 1

    Tại sao trên trái đất bạn sẽ làm điều đó? Sử dụng ! Toán tử để chuyển đổi sang boolean sau đó sử dụng === để so sánh loại? Chỉ cần chấp nhận bạn không có loại an toàn và làm val> 0 hoặc một cái gì đó.

    – Dương Hoàng Thiên 08:41:48 24/04/2009
  • 1

    @Darren: Anh ấy không so sánh các loại; anh ấy nói cho bạn biết kết quả là gì, bằng cách viết những lời khẳng định trong câu trả lời của anh ấy.

    – Hồ Phương Quỳnh 10:34:34 09/11/2011
30

Nó chuyển đổi hậu tố thành giá trị Boolean.

|
24

Đó là một nothoạt động kép . Cái đầu tiên !chuyển đổi giá trị thành boolean và đảo ngược giá trị logic của nó. Cái thứ hai !đảo ngược giá trị logic trở lại.

|
22

Nó mô phỏng hành vi của Boolean()chức năng đúc. Cái đầu tiên NOTtrả về giá trị Boolean cho dù nó được đưa ra toán hạng nào. Thứ hai NOTphủ nhận Booleangiá trị đó và do đó cung cấp truegiá trị Boolean của một biến. Kết quả cuối cùng giống như sử dụng Boolean()hàm trên một giá trị.

|
21

Có vẻ như các !!nhà điều hành dẫn đến một phủ định kép.

var foo = "Hello World!";

!foo // Result: false
!!foo // Result: true
|
18

! là "boolean not", về cơ bản là đánh giá giá trị của "enable" đối với boolean của nó. Thư hai ! lật giá trị này. Vì vậy, !!enablecó nghĩa là "không kích hoạt", mang lại cho bạn giá trị enablenhư là một boolean.

|
17

Tôi nghĩ điều đáng nói là, một điều kiện kết hợp với logic AND / OR sẽ không trả về giá trị boolean nhưng thành công cuối cùng hoặc thất bại đầu tiên trong trường hợp && và thành công đầu tiên hoặc thất bại cuối cùng trong trường hợp | | của chuỗi điều kiện.

res = (1 && 2); // res is 2
res = (true && alert) // res is function alert()
res = ('foo' || alert) // res is 'foo'

Để đưa điều kiện thành một chữ boolean thực sự, chúng ta có thể sử dụng phủ định kép:

res = !!(1 && 2); // res is true
res = !!(true && alert) // res is true
res = !!('foo' || alert) // res is true
|
14

Cấu !!trúc này là một cách đơn giản để biến bất kỳ biểu thức JavaScript nào thành tương đương Boolean của nó.

Ví dụ: !!"he shot me down" === true!!0 === false.

|

Câu trả lời của bạn (> 20 ký tự)

Bằng cách click "Đăng trả lời", bạn đồng ý với Điều khoản dịch vụ, Chính sách bảo mật and Chính sách cookie của chúng tôi.

Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ hoặc hỏi câu hỏi của bạn.