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 true
hoặc 1
, điều đó có an toàn không? Hay sẽ khởi tạo nó bằng 1
cách biến biến thành một số?
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 true
hoặc 1
, điều đó có an toàn không? Hay sẽ khởi tạo nó bằng 1
cách biến biến thành một số?
Câu trả lời:
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.
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
if (new Boolean(false)) alert ('wat')
Xem stackoverflow.com/a/8695363
(new Boolean(false)).toString()) === "false"
, nhờ các liên kết
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;
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 IsLoggedIn
có 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.
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; ~)
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'
.
Các biến trong Javascript không có kiểu. Khác 0, không rỗng, không rỗng và true
là "true". Chuỗi không, null, không xác định, rỗng và false
là "false".
Có một kiểu Boolean, cũng như các nghĩa đen true
và false
.
2 + 2
vs "2" + 2
. Xem thêm typeof
nhà điều hành .
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!
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ó, true
nó sẽ trở thành một boolean, nếu bạn gán nó, 1
nó 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.