Khai báo boolean trong JavaScript chỉ sử dụng var


89

Nếu tôi khai báo một biến boolean JavaScript như thế này:

var IsLoggedIn;

Và sau đó khởi tạo nó bằng truehoặc 1, điều đó có an toàn không? Hay sẽ khởi tạo nó bằng 1cách biến biến thành một số?


27
Nó thực sự phụ thuộc vào những gì bạn có nghĩa là "an toàn", không có "an toàn" trong javascript.
AnthonyWJones

Câu trả lời:


164

Các loại phụ thuộc vào khởi tạo của bạn:

var IsLoggedIn1 = "true"; //string
var IsLoggedIn2 = 1; //integer
var IsLoggedIn3 = true; //bool

Nhưng hãy xem ví dụ này:

var IsLoggedIn1 = "true"; //string
IsLoggedIn1 = true; //now your variable is a boolean

Loại biến của bạn phụ thuộc vào giá trị được chỉ định trong JavaScript.


1
điều gì sẽ xảy ra nếu tôi trực tiếp khai báo biến boolean là boolean. điều đó có tạo ra bất kỳ sự ứng biến hiệu suất nào
murtaza.webdev

20

Không, nó không an toàn. Sau đó, bạn có thể thực hiện var IsLoggedIn = "Foo";và JavaScript sẽ không gặp lỗi.

Nó có thể làm

var IsLoggedIn = new Boolean(false);
var IsLoggedIn = new Boolean(true);

Bạn cũng có thể chuyển biến non boolean vào new Boolean()và nó sẽ tạo thành boolean IsLoggedIn.

var IsLoggedIn = new Boolean(0); // false
var IsLoggedIn = new Boolean(NaN); // false
var IsLoggedIn = new Boolean("Foo"); // true
var IsLoggedIn = new Boolean(1); // true

6
Không sử dụng Boolean mới (); IsLoggedIn sẽ đánh giá là true trong tất cả các trường hợp đó (vâng, Boolean mới (false) là true).
Miles

@Miles: new Boolean (false) là sai không đúng sự thật
Tháng Một

5
@jan: if (new Boolean(false)) alert ('wat')Xem stackoverflow.com/a/8695363
Miles

@Miles Incredible, như (new Boolean(false)).toString()) === "false", nhờ các liên kết
Tháng Một

10

Như hướng dẫn rất hữu ích này nói:

var age = 0;

// bad
var hasAge = new Boolean(age);

// good
var hasAge = Boolean(age);

// good
var hasAge = !!age;

có lẽ không có lời giải thích thực sự. không ai muốn lược qua một hướng dẫn bạn có thể chỉ định trong một tl; dr trong bài viết của bạn
Heimi

7

Nếu bạn muốn IsLoggedInđược coi là boolean, bạn nên khởi tạo như sau:

var IsLoggedIn=true;

Nếu bạn khởi tạo nó bằng var IsLoggedIn=1;thì nó sẽ được coi là một số nguyên.

Tuy nhiên, bất kỳ lúc nào biến IsLoggedIncó thể tham chiếu đến một kiểu dữ liệu khác:

 IsLoggedIn="Hello World";

Điều này sẽ không gây ra lỗi.


5

Bạn có thể sử dụng và kiểm tra các biến chưa được khởi tạo ít nhất về 'tính xác định' của chúng. Như thế này:

var iAmNotDefined;
alert(!iAmNotDefined); //true
//or
alert(!!iAmNotDefined); //false

Hơn nữa, có nhiều khả năng: nếu bạn không quan tâm đến các kiểu chính xác, hãy sử dụng toán tử '==' (hoặc! [Biến] / !! [biến]) để so sánh (đó là cái mà Douglas Crockford gọi là 'true' hoặc ' giả dối 'tôi nghĩ). Trong trường hợp đó, việc gán true hoặc 1 hoặc '1' cho biến đơn nguyên luôn trả về true khi được hỏi. Nếu không, [nếu bạn cần nhập so sánh an toàn] hãy sử dụng '===' để so sánh.

var thisMayBeTrue;

thisMayBeTrue = 1;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false

thisMayBeTrue = '1';
alert(thisMayBeTrue == true); //=> true 
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, in this case, using == or !! '1' is implicitly 
// converted to 1 and 1 is implicitly converted to true)

thisMayBeTrue = true;
alert(thisMayBeTrue == true); //=> true
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> true

thisMayBeTrue = 'true';
alert(thisMayBeTrue == true); //=> false
alert(!!thisMayBeTrue); //=> true
alert(thisMayBeTrue === true); //=> false
// so, here's no implicit conversion of the string 'true'
// it's also a demonstration of the fact that the 
// ! or !! operator tests the 'definedness' of a variable.

Tái bút: bạn không thể kiểm tra 'tính xác định' cho các biến không tồn tại. Vì thế:

alert(!!HelloWorld);

đưa ra lỗi tham chiếu ('HelloWorld không được định nghĩa')

(có từ nào tốt hơn cho 'tính xác định' không? Dù sao cũng xin lỗi tiếng Hà Lan của tôi; ~)


Bạn có thể muốn thử lại các trường hợp chuỗi của mình với một chuỗi rỗng thisMayBeTrue = '';- bạn sẽ không nhận được kết quả tương tự vì chuỗi rỗng là sai. "PS: bạn không thể kiểm tra 'definedness' cho nonexisting biến mặc dù" - Chắc chắn bạn có thể: typeof HellowWorld === 'undefined'.
nnnnnn

2

Các biến trong Javascript không có kiểu. Khác 0, không rỗng, không rỗng và truelà "true". Chuỗi không, null, không xác định, rỗng và falselà "false".

Có một kiểu Boolean, cũng như các nghĩa đen truefalse.


Các biến JS không có kiểu theo nghĩa là bạn không thể khai báo một biến sẽ chỉ chứa số nguyên hoặc chuỗi (như xảy ra trong một số ngôn ngữ khác), nhưng giá trị cụ thể được giữ bởi biến tại bất kỳ thời điểm nào sẽ luôn có một loại. Và các loại vấn đề như có thể được hiển thị với một ví dụ đơn giản như 2 + 2vs "2" + 2. Xem thêm typeofnhà điều hành .
nnnnnn

2

Còn những thứ như thế này thì sao:

var MyNamespace = {
    convertToBoolean: function (value) {
        //VALIDATE INPUT
        if (typeof value === 'undefined' || value === null) return false;

        //DETERMINE BOOLEAN VALUE FROM STRING
        if (typeof value === 'string') {
            switch (value.toLowerCase()) {
                case 'true':
                case 'yes':
                case '1':
                    return true;
                case 'false':
                case 'no':
                case '0':
                    return false;
            }
        }

        //RETURN DEFAULT HANDLER
        return Boolean(value);
    }
};

Sau đó, bạn có thể sử dụng nó như thế này:

MyNamespace.convertToBoolean('true') //true
MyNamespace.convertToBoolean('no') //false
MyNamespace.convertToBoolean('1') //true
MyNamespace.convertToBoolean(0) //false

Tôi chưa kiểm tra hiệu suất của nó, nhưng việc chuyển đổi từ loại này sang loại khác không nên xảy ra quá thường xuyên, nếu không, bạn sẽ mở ứng dụng của mình lên đến mức không ổn định trong thời gian dài!


2
Tại sao bỏ phiếu xuống? Hãy giải thích để tất cả chúng ta đều có lợi.
TruMan1

1

Biến sẽ trở thành kiểu mà bạn gán cho nó. Ban đầu là như vậy undefined. Nếu bạn gán nó, 'true'nó sẽ trở thành một chuỗi, nếu bạn gán nó, truenó sẽ trở thành một boolean, nếu bạn gán nó, 1nó sẽ trở thành một số. Các phép gán tiếp theo có thể thay đổi kiểu của biến sau này.

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.