Cách kiểm tra nếu loại là Boolean


269

Làm cách nào để kiểm tra xem loại của biến có thuộc loại Boolean không?

Ý tôi là, có một số lựa chọn thay thế như:

if(jQuery.type(new Boolean()) === jQuery.type(variable))
      //Do something..

Nhưng điều đó dường như không đẹp với tôi.

Có cách nào sạch hơn để đạt được điều này?


1
Không phải truehoặc falsethuộc loại Boolean?
Matias Cicero

1
Bạn không cần phải kiểm tra, bạn có thể làm điều này !!( ... some expression ...)và kết quả sẽ là một boolean.
Callum Linington

1
Không: truefalselà nguyên thủy của loại boolean. Kiểu Boolean viết hoa B là kiểu bao bọc đối tượng cho các kiểu nguyên thủy boolean.
Pointy

@CallumLinington sẽ không hoạt động cho các đối tượng được tạo bằng hàm tạo Boolean :)
Pointy

1
@CallumLinington thử: if (new Boolean(false)) alert("hi");- một đối tượng Boolean vốn B luôn "trung thực", bất kể giá trị boolean nhỏ b bên dưới.
Pointy

Câu trả lời:


506

Đó là những gì typeofđang có. Các dấu ngoặc là tùy chọn vì nó là một toán tử .

if (typeof variable === "boolean"){
  // variable is a boolean
}

7
Không rõ OP đang cố gắng làm gì, nhưng các đối tượng Boolean viết hoa cho "đối tượng" là kiểu của chúng thông qua typeof.
Pointy

14
1) typeofkhông phải là một chức năng. 2) Không cần sử dụng toán tử ba === với typeofnó, vì nó sẽ luôn trả về một chuỗi (afaik, nhưng theo tôi nhớ, có một trường hợp khác đối với một số trình duyệt rất cũ). 3) typeofvà so sánh chuỗi là chậm. Đừng sử dụng chúng. Kiểm tra trực tiếp với (variable === true || variable === false)(tôi đề nghị viết một hàm).
StanE

6
sẽ không typeof(variable) === typeof(true)mạnh mẽ hơn?
Marcus Junius Brutus

2
@TusharNiras namelà một tài sản cửa sổ toàn cầu với nhà phát triển getter đặc
biệt.mozilla.org/en-US/docs/Web/API/Window/name

1
@MarcusJuniusBrutus @AmitJoki thật vô lý, không có lợi thế nào trong việc sử dụng nhiều verbose typeof truethay vì "boolean". Phiên bản mới ECMAScript sẽ không bao giờ có bất kỳ thay đổi đột phá nào.
m93a

40

Nếu bạn chỉ muốn kiểm tra giá trị nguyên thủy

typeof variable === 'boolean'

Nếu vì một lý do kỳ lạ nào đó mà bạn có booleans được tạo bằng hàm tạo, thì những đối tượng đó không thực sự là booleans mà là các đối tượng chứa giá trị boolean nguyên thủy và một cách để kiểm tra cả booleans nguyên thủy và đối tượng được tạo new Booleanlà:

function checkBool(bool) {
    return typeof bool === 'boolean' || 
           (typeof bool === 'object' && 
            bool !== null            &&
           typeof bool.valueOf() === 'boolean');
}


2
Đối với tôi, việc đối xử với người nguyên thủy Boolean và đối tượng Boolean là không thực tế đối với tôi, vì dù sao tôi cũng không thể sử dụng chúng theo cùng một cách.
Felix Kling

@FelixKling - đối với tôi cũng không thực tế lắm, nhưng có vẻ như OP đang cố xác định xem một biến có phải là boolean hay không, ngay cả khi được tạo bằng new Boolean(), về mặt kỹ thuật không phải là boolean, mà là một đối tượng, nhưng vẫn giữ một giá trị boolean.
adeneo

Tôi nghĩ rằng OP chỉ không biết rằng new Boolean()trả về một đối tượng (xem bình luận về câu hỏi). Nhưng bất cứ điều gì :)
Felix Kling

@FelixKling - Chỉ cần đọc lại câu hỏi và nhận xét, và bây giờ tôi thấy rằng OP về cơ bản đang cố gắng thực hiện typeof variable === typeof new Boolean()và có lẽ chỉ muốn kiểm tra kiểu thông thường, nhưng bằng cách nào đó đã bị vướng vào một cú pháp jQuery lạ.
adeneo

Tùy thuộc vào cách kiên cường mà bạn muốn làm cho mã của bạn, nếu boolparam thông qua vào là nullcác typeof bool === 'object'sẽ vẫn đánh giá và một TypeError: Cannot read property 'valueOf' of nullngoại lệ sẽ được ném vào các cuộc gọi đến typeof bool.valueOf(). Vì vậy, tôi sẽ thay đổi dòng cuối cùng để đọc: (typeof bool === 'object' && bool && typeof bool.valueOf() === 'boolean');nó sẽ chỉ đánh giá khi không phảibool là null.
Al Dass

34

Với JavaScript thuần túy , bạn chỉ cần sử dụng typeofvà làm một cái gì đó giống như typeof falsehoặc typeof truenó sẽ trả về "boolean"...

Nhưng đó không phải là cách duy nhất để làm điều đó, tôi đang tạo các hàm bên dưới để hiển thị các cách khác nhau mà bạn có thể kiểm tra Boolean trong JavaScript, cũng là các cách khác nhau bạn có thể thực hiện trong một số khung mới, hãy bắt đầu với cách này:

function isBoolean(val) {
   return val === false || val === true;
}

Hoặc cách ES6 một dòng ...

const isBoolean = val => 'boolean' === typeof val;

và gọi nó như thế nào!

isBoolean(false); //return true

Ngoài ra, trong mã nguồn Underscore, họ kiểm tra nó như thế này (với _. Ở đầu tên hàm):

isBoolean = function(obj) {
   return obj === true || obj === false || toString.call(obj) === '[object Boolean]';
};

Ngoài ra trong jQuery bạn có thể kiểm tra nó như thế này:

jQuery.type(true); //return "boolean"

Trong React , nếu sử dụng propTypes, bạn có thể kiểm tra một giá trị để được boolean như thế này:

MyComponent.propTypes = {
  children: PropTypes.bool.isRequired
};

Nếu sử dụng TypeScript , bạn cũng có thể sử dụng kiểu boolean :

let isDone: boolean = false;

Ngoài ra, một cách khác để làm điều đó, cũng giống như chuyển đổi giá trị thành boolean và xem liệu nó có hoàn toàn giống như vậy không, đại loại như:

const isBoolean = val => !!val === val;

hoặc thích:

const isBoolean = val => Boolean(val) === val;

và gọi nó!

isBoolean(false); //return true

Không nên sử dụng bất kỳ khuôn khổ nào cho việc này vì đây thực sự là một kiểm tra đơn giản trong JavaScript.


Không đồng ý: new Boolean(true) === new Boolean(true)nên trả về false (vì các tham chiếu là khác nhau). Đó là lý do tại sao ý isBoolean(new Boolean(true))chí nói sai trong khi nó phải đúng ( new Boolean(true)thuộc loại boolean ).
AlexMelw

17

Có ba cách "vanilla" để kiểm tra điều này có hoặc không có jQuery.

  1. Đầu tiên là buộc đánh giá boolean bằng cách ép buộc, sau đó kiểm tra xem nó có bằng giá trị ban đầu không:

    function isBoolean( n ) {
        return !!n === n;
    }
  2. Làm một typeofkiểm tra đơn giản :

    function isBoolean( n ) {
        return typeof n === 'boolean';
    }
  3. Thực hiện quá mức cần thiết và khởi tạo không cần thiết của trình bao bọc lớp trên một nguyên hàm:

    function isBoolean( n ) {
        return n instanceof Boolean;
    }

Thứ ba sẽ chỉ trở lại true nếu bạn tạo một new Booleanlớp và vượt qua nó trong.

Để giải thích về sự ép buộc nguyên thủy (như thể hiện trong mục 1), tất cả các loại nguyên thủy có thể được kiểm tra theo cách này:

  • Boolean:

    function isBoolean( n ) {
        return !!n === n;
    }
  • Number:

    function isNumber( n ) {
        return +n === n;
    }
  • String:

    function isString( n ) {
        return ''+n === n;
    }

Tại sao kiểu coersion "tối ưu nhất"? Là nó nhanh hơn hoặc dễ đọc hơn typeof? Tôi rât nghi ngơ điêu đo.
m93a

Vì vậy, về mặt lý thuyết, việc ép giá trị vào một boolean thực hiện 1 cưỡng chế + 2 so sánh + 1 so sánh. Hai so sánh đầu tiên là trong các bước cưỡng chế, và so sánh cuối cùng là so với vị trí đầu tiên (hiện là một nguyên thủy). Làm typeofcũng là 1 ép buộc, nhưng typeofphương thức thực hiện một vài getters và so sánh bên trong + 1 so sánh ở cuối. Đây là tài liệu tham khảo V8 chotypeof
iSkore

1
Rốt cuộc, một trong hai phương pháp rất nhanh, lượng chênh lệch nano giây rất nhỏ, thật khó để kiểm tra xem cái nào nhanh hơn. Đây là hai tệp của JSPerf. Một người nói !!là nhanh hơn, người ta nói Booleanlà nhanh hơn. Chỉ cần một tài liệu tham khảo về mức độ nhỏ giữa các thử nghiệm. Kiểm tra Boolean là nhanh chóng. jsperf.com/bool-not-not jsperf.com/bool-vs-doublenot
iSkore

Tôi đồng ý rằng sự khác biệt là không thể đo lường được và trong trường hợp như vậy, khả năng sẵn sàng nên AFAIK luôn đi đầu. Do đó, tiêu chuẩn và dễ hiểu typeof val === "boolean"là tối ưu.
m93a

1
Vâng, tôi đồng ý với điều đó. Khả năng đọc là quan trọng. Các nhà khai thác không thể đọc được - sẽ cập nhật
iSkore

16

Bạn có thể sử dụng Javascript thuần túy để đạt được điều này:

var test = true;
if (typeof test === 'boolean')
   console.log('test is a boolean!');

7

Nếu bạn muốn chức năng của mình có thể xác nhận các đối tượng boolean, giải pháp hiệu quả nhất phải là:

function isBoolean(val) {
  return val === false || val === true || val instanceof Boolean;
}

Boolean không được khai báo cho tôi.
Dudi

3

Cách đáng tin cậy nhất để kiểm tra loại biến trong JavaScript là như sau :

var toType = function(obj) {
  return ({}).toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase()
}
toType(new Boolean(true)) // returns "boolean"
toType(true); // returns "boolean"

Lý do cho sự phức tạp này là typeof truetrả về "boolean"trong khi typeof new Boolean(true)trả lại "object".


Tại sao bạn muốn trả về "boolean"nếu giá trị thực sự là một đối tượng? Điều đó dường như không thực tế đối với tôi. Các đối tượng Boolean phải được xử lý khác với các nguyên thủy Boolean.
Felix Kling

1
Mã không sạch, đẹp hoặc rõ ràng. Lưu ý OP đang yêu cầu "cách sạch hơn để đạt được điều này".
Spencer Wieczorek

Tôi đồng ý rằng mã không sạch hoặc đẹp, nhưng AFAIK không có tùy chọn đáng tin cậy và đồng thời đáng tin cậy trong trường hợp nếu cả hai nguyên hàm boolean và các đối tượng Boolean tại hiện trường.
Volodymyr Frolov

Đây có vẻ như là một giải pháp quá mức nghiêm trọng để làm một cái gì đó có thể được thực hiện nguyên bản.
brandonscript

3

Tôi sẽ đi với Lodash: isBoolean kiểm tra xem biến được truyền vào là đối tượng trình bao bọc boolean nguyên thủy hay Boolean và do đó chiếm tất cả các trường hợp.


1

Bạn có thể tạo một hàm kiểm tra typeofđối số.

function isBoolean(value) {
  return typeof value === "boolean";
}

1

Đôi khi chúng ta cần một cách duy nhất để kiểm tra nó. typeof không hoạt động cho ngày, vv Vì vậy, tôi đã làm cho nó dễ dàng bằng

Date.prototype.getType() { return "date"; }

Cũng cho Number, String, Booleanvv chúng tôi thường cần phải kiểm tra loại một cách duy nhất ...


1

Tạo các chức năng như isBooleanchứa oneliner typeof v === "boolean"có vẻ rất không ổn trong thời gian dài. tôi ngạc nhiên rằng hầu hết mọi người đề nghị tạo ra chức năng của riêng bạn. Nó dường như là ung thư giống như mở rộng các nguyên mẫu bản địa.

  • bạn cần tạo lại chúng trong mọi dự án bạn tham gia
  • các nhà phát triển khác có thể có các thói quen khác nhau ,, hoặc cần kiểm tra nguồn của chức năng của bạn để xem bạn sử dụng loại séc nào để biết điểm yếu của séc của bạn là gì
  • bạn sẽ thất vọng khi bạn cố gắng viết một lớp trong bảng điều khiển trên trang web không thuộc về dự án của bạn

chỉ cần ghi nhớ typeof v === "boolean"và đó là tất cả. Thêm một mẫu vào IDE của bạn để có thể đặt nó bằng một số phím tắt ba chữ cái và hài lòng.


1
Nhân tiện, nếu hiệu suất là rất rất quan trọng, có chức năng kiểm tra giá trị boolean mất 10% thời gian trong các thử nghiệm của tôi hơn là thực hiện nội tuyến (for-loop 100000000x) trên Node.js. Nhưng lựa chọn tồi tệ nhất là v === true || v === false, trong đó có 2 xác minh trong trường hợp false. Xếp hạng: (1 - cả hai praticaly giống nhau) typeof v === 'booleantypeof v === typeof true, (2) isBoolean(v), (3) v === true || v === false.
jpenna

Tôi không đồng ý với điều này hết lòng. Những thói quen khác nhau là lý do chính xác tại sao: Tôi có thường xuyên gặp phải lỗi vì mọi người đều kiểm tra mọi thứ khác nhau không? Nếu bạn có một nơi để kiểm tra giá trị boolean, đó là IMO thích hợp hơn nhiều so với kiểm tra kiểu khác trên tất cả các cơ sở mã. Nó cũng dễ dàng hơn nhiều để thay đổi liên tục hành vi của một chức năng như vậy.
Lucas Manzke

1
if(['true', 'yes', '1'].includes(single_value)) {
    return  true;   
}
else if(['false', 'no', '0'].includes(single_value)) {
    return  false;  
}

nếu bạn có một chuỗi


1
  • Dễ đọc nhất : val === false || val === true.
  • Cũng có thể đọc được : typeof variable == typeof true.
  • Ngắn nhất, nhưng không thể đọc được chút nào : !!val === val.

    Giải trình:

    • [!!] Dấu chấm than kép chuyển đổi giá trị thành Boolean.
    • [===] Phép thử ba bằng cho kiểm tra đẳng thức nghiêm ngặt: cả loại (Boolean) và giá trị phải giống nhau.
    • Nếu giá trị ban đầu không phải là giá trị Boolean, nó sẽ không vượt qua bài kiểm tra ba bằng. Nếu đó là biến Boolean, nó sẽ vượt qua bài kiểm tra ba bằng (với cả loại & giá trị).

    Các xét nghiệm:

    • !! 5 === 5 // sai
    • !! 'kiểm tra' === 'kiểm tra' // sai
    • Đặt val = Ngày mới (); !! val === val // sai
    • !! đúng === đúng // đúng
    • !! sai === sai // đúng

0

Trong nodejs bằng cách sử dụng nút-boolify, chúng ta có thể sử dụng isBoolean ();

        var isBoolean = require('node-boolify').isBoolean;
        isBoolean(true); //true
        isBoolean('true'); //true
        isBoolean('TRUE'); //false
        isBoolean(1); //true
        isBoolean(2); //false
        isBoolean(false); //true
        isBoolean('false'); //true
        isBoolean('FALSE'); //false
        isBoolean(0); //true
        isBoolean(null); //false
        isBoolean(undefined); //false
        isBoolean(); //false
        isBoolean(''); //false

Giá trị boolean chỉ đúng nếu giá trị là giá trị boolean
Ratan Uday Kumar

0

Thêm một quyết định với chức năng mũi tên es2015

const isBoolean = val => typeof val === 'boolean';
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.