var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var b
sẽ được đặt thành true
.
Đây có phải là một hành vi được xác định có thể dựa vào?
Như đã trả lời ở trên, vâng , đó là hành vi xác định của một chuỗi rỗng trong một điều kiện (một if
biểu hiện, ||
, &&
, ? :
, ...). ( Tiêu chuẩn nói rằng hoạt động ToBoolean nội bộ phải được áp dụng.)
Việc đánh giá là khác nhau khi chuỗi rỗng được sử dụng trong một so sánh (xem Sự thật, Bình đẳng và JavaScript ), mặc dù các kết quả hầu như giống nhau :
// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length => false
// comparisons
console.log('' == true); // +0 === 1 => false
console.log('' == false); // +0 === +0 => true
console.log('' === true); // different types => false
console.log('' === false); // different types => false
Giải thích: Về cơ bản, khi các toán hạng ==
có các loại khác nhau, JavaScript cố gắng chuyển đổi chúng thành Số, theo giá trị của chúng , ( sử dụng các thao tác gọi các cuộc gọi tiêu chuẩn ToNumber và ToPrimitive ), sau đó áp dụng nội bộ ===
. Nhưng khi bạn sử dụng ===
trực tiếp, các loại không được chuyển đổi, do đó, luôn luôn so sánh Chuỗi với Boolean false
.
Nói một cách đơn giản, kiểm tra các điều kiện JavaScript ( ToBoolean ) cho một giá trị được xác định, không null, không zero, không rỗng, không sai (một chuỗi rỗng là ... trống, các số -0 hoặc +0 là ... không, NaN không phải là một số xác định, nhưng một đối tượng trống dường như không thực sự trống rỗng) hoặc như tôi nghĩ, kiểm tra điều kiện cho một điều (đúng) , trong khi ==
so sánh các giá trị rõ ràng, được chuyển đổi cẩn thận ( ToPrimitive , ToNumber ) của toán hạng của nó, và ===
tìm kiếm sự giống nhau chính xác .
if (X) {} // is X a (true) thing?
if (X == Y) {} // are the values of X and Y same-ish?
if (X === Y) {} // are X and Y exactly the same?
Có rất nhiều ví dụ trong chân lý, bình đẳng và JavaScript nơi sự khác biệt này thực sự quan trọng, ví dụ như '0'
là true
trong một điều kiện (non-zero chiều dài, hay, nó là một điều ), nhưng false
trong một ==
so sánh (các giá trị là zero). '1'
một lần nữa, là true
trong cả hai trường hợp (nó là một thứ và có giá trị khác không).
console.log('' ? true : false); // zero length => false
console.log('' == true); // +0 === 1 => false
console.log('0' ? true : false); // non-zero length => true
console.log('0' == true); // +0 === 1 => false
console.log('1' ? true : false); // non-zero length => true
console.log('1' == true); // 1 === 1 => true
false
đây: jsfiddle.net/8CKbd