Trong javascript, một chuỗi rỗng luôn luôn sai như một boolean?


134

trong javascript,

var a = '';
var b = (a) ? true : false;

var bsẽ được đặt thành false.

Đây có phải là một hành vi được xác định có thể dựa vào?


Bạn có chắc không, tôi đang đến falseđây: jsfiddle.net/8CKbd
anubhava

Tôi đã tiến một bước xa hơn. Chuỗi có khoảng trắng là đúng. if ('') {console.log ('!')} nhưng '' == 0 là đúng.
Azat

2
Tôi nghĩ rằng phiên bản @JonH là sai, chuỗi trống ''được đánh giá là sai trong ngữ cảnh boolean vì vậy nếu a = '';sau đó a ? false : true=> '' ? false : true=> false ? false : true=> true(vì là đánh giá cho một giá trị sai). Tôi nghĩ rằng nó nên var b = (a) ? true : false;được chính xác với tuyên bố tiếp theo.
PhoneixS

@PhoneixS đã được chỉnh sửa, hy vọng nó có ý nghĩa hơn bây giờ.
SwissCoder

1
@SwissCoder không phải là không thể đọc được mà nó đưa ra một câu trả lời khác. Bây giờ tôi đã sửa nó.
PhoneixS

Câu trả lời:


191

Đúng. Javascript là một phương ngữ của ECMAScript và đặc tả ngôn ngữ ECMAScript xác định rõ hành vi này:

ToBoolean

Kết quả là sai nếu đối số là Chuỗi rỗng (độ dài của nó bằng 0); nếu không thì kết quả là đúng

Trích dẫn được lấy từ http: //www.ecma-i Intl.org/publications/files/ECMA-ST/Ecma-262.pdf


Aaaaand đã ổn định
Anthony

28
Một cảnh báo là đó new String("")là sự thật! Điều này là do nó là một đối tượng, trong khi dạng ngắn biểu ""thị phiên bản giá trị nguyên thủy. Cùng đi new Number(0)và thậm chí new Boolean(false). Đó là một lý do tốt để không sử dụng các phiên bản đối tượng trong mã của bạn và điều đó có nghĩa là if (str.length)xử lý trường hợp cạnh này trong khi if (str)không.
Chris Middleton

54

Đúng. Tất cả false, 0, chuỗi rỗng ''"", NaN, undefined, và nullluôn đánh giá là false; mọi thứ khác là true.

Và trong ví dụ của bạn, b là falsesau khi đánh giá. (Tôi nghĩ bạn đã viết nhầm true)


2
nullkhông phải là false, không phải true, nullnull. jsfiddle.net/sq1Lkpg0
Bruno Finger

7
@Bruno, Bạn có thể thực hiện cùng một bài kiểm tra với NaNundefined. Họ không falsenhưng họ là giả. Đó là những gì đã được hỏi.
Joseph

11

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var bsẽ đượ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 ifbiể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 ToNumberToPrimitive ), 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'truetrong một điều kiện (non-zero chiều dài, hay, nó là một điều ), nhưng falsetrong một ==so sánh (các giá trị là zero). '1'một lần nữa, là truetrong 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


1
Lúc đầu tôi nghĩ, "pssh, đó là quá mức cần thiết, điều này đã được trả lời tốt rồi." Nhưng đó là trình bày tốt và nhiều thông tin. Cảm ơn.
Marc L.

8

var bsẽ được đặt thành true. Điều này là do một chuỗi rỗng được tính là giá trị 'falsey' trong JavaScript cũng như một số giá trị khác.

Vui lòng xem tại http://www.sitepoint.com/javascript-truthy-falsy/ để biết giá trị giả


Bạn đã sai trong câu trả lời của bạn. var bthực sự sẽ được đặt thành truevì nó ngược lại var anếu bạn nhìn vào mã.
bombek

@bombek Cảm ơn - Tôi sẽ tăng. Có vẻ như câu hỏi ban đầu đã được chỉnh sửa sau khi câu trả lời của tôi (các giá trị được hoán đổi xung quanh)
Jonathon Bolster

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.