2012-01-01 30 views
92

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

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

var b sẽ được thiết lập để true.

đây có phải là hành vi được xác định có thể dựa vào không?

+0

Bạn có chắc chắn, tôi nhận được 'FALSE' đây: http://jsfiddle.net/8CKbd/ – anubhava

+0

cố định nó - nhờ –

+0

Tôi lấy nó một bước xa hơn. Chuỗi có dấu cách là đúng. if ('') {console.log ('!')} nhưng '' == 0 là đúng. – Azat

Trả lời

133

Có. Javascript là một phương ngữ của ECMAScript, và đặc điểm kỹ thuật ngôn ngữ ECMAScript xác định rõ hành vi này:

ToBoolean

Kết quả là sai lầm nếu đối số là chuỗi rỗng (chiều dài của nó là zero); khác kết quả là true

Trích lấy từ http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

+4

cảm ơn tham chiếu đến thông số kỹ thuật! –

+0

Aaaaand nó được giải quyết – Antoine

+8

Một báo trước là 'chuỗi mới (" ")' là sự thật! Điều này là do nó là một đối tượng, trong khi biểu mẫu ngắn '" "' đại diện cho phiên bản giá trị nguyên thủy. Điều tương tự cũng xảy ra với 'Số mới (0)' và thậm chí là 'Boolean mới' (sai) '.Đó là một lý do chính đáng để không sử dụng các phiên bản đối tượng trong mã của bạn, và nó có nghĩa là 'if (str.length)' xử lý trường hợp cạnh này trong khi 'if (str)' thì không. –

43

Có. Tất cả false, 0, các chuỗi trống ''"", NaN, undefinednull luôn được đánh giá là false; mọi thứ khác là true.

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

+0

đúng về lỗi - cố định - nhờ –

+0

'undefined' là chính tả đúng – Timmerz

+2

' null' không phải là 'false', không phải' true', 'null' là' null'. https://jsfiddle.net/sq1Lkpg0/ –

7

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

Vui lòng xem http://www.sitepoint.com/javascript-truthy-falsy/ để có giá trị giả

+0

liên kết tuyệt vời - cảm ơn! –

3

Ví dụ về các biểu thức có thể được chuyển đổi sang giả được những đánh giá null, 0, chuỗi rỗng (""), hoặc chưa xác định. (xem MDN Reference)

5

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

var b sẽ được thiết lập để true.

đây có phải là hành vi được xác định có thể dựa vào không?

Như đã trả lời ở trên, , đó là hành vi xác định của một chuỗi rỗng trong một điều kiện (một biểu if, ||, &&, ? :, ...). (standard says rằng hoạt động nội bộ ToBoolean 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 Truth, Equality and JavaScript), mặc dù kết quả là chủ yếu là 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ủa == 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, (usingoperations 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 đó so sánh Chuỗi với Boolean luôn là false.

Nói đại khái, JavaScript điều kiện (ToBoolean) thử nghiệm cho một định nghĩa, không null, không, không trống, không sai giá trị (một chuỗi rỗng là ... trống, Các số 0 hoặc 0 là 0, NaN không phải là số được xác định, nhưng một đối tượng trống dường như không thực sự trống), hoặc như tôi muốn nghĩ, điều kiện kiểm tra cho một (đúng) điều, trong khi == so sánh rõ ràng, được chuyển đổi cẩn thận giá trị (ToPrimiti ve, ToNumber) của các toán hạng của nó và === tìm kiếm mẫu 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ó nhiều ví dụ hơn trong Truth, Equality and JavaScript nơi sự khác biệt này thực sự quan trọng, ví dụ: '0'true trong điều kiện (độ dài khác 0 hoặc là một điều), nhưng false trong so sánh == (giá trị bằng không). '1' một lần nữa, là true trong cả hai trường hợp (đó là một điều và có giá trị khác 0).

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

+0

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 điều đó đã được trình bày rõ ràng và mang tính thông tin. Cảm ơn. –

Các vấn đề liên quan