2012-03-28 35 views
7

Ai đó có thể giải thích cho tôi tại sao điều này trả về một chuỗi rỗng ("") thay vì một boolean (false)?Chuỗi trả về Javascript về những gì nên là một bài kiểm tra boolean viết tắt

var x = ""; 
alert(x && x.length > 0); 

... Trong khi làm việc này như mong đợi, trở thành sự thật:

var y = "abc"; 
alert(y && y.length > 0); 

tôi về cơ bản chỉ cố gắng để làm một kiểm tra viết tắt đơn giản để xem nếu một giá trị tồn tại trong một biến (đảm bảo nó không phải chuỗi undefined, null hoặc empty).

Tôi biết mình có thể thực hiện từng bài kiểm tra riêng lẻ (x == null, typeof x == 'undefined', x == '') - Tôi chỉ cố gắng hiểu tại sao Javascript trả về chuỗi trên những gì có vẻ là một thử nghiệm boolean.

+4

lưu ý rằng bạn có thể buộc trở về một 'boolean' bởi sử dụng '!! (x) ' – ajax333221

+0

bạn sẽ có thể rút ngắn với một cái gì đó giống như' alert (typeof x! = Undefined && x.length> 0) 'bởi vì cả hai bool trở lại, altho, nếu x bao giờ là undefined, nó có thể ném lỗi (hầu hết) bởi vì đối số thứ nhất có thể bị lỗi, sẽ tốt hơn nếu phân tách chúng trong mini func hoặc nội tuyến – SpYk3HH

Trả lời

7

Khi toán tử điều kiện trong JavaScript được thỏa mãn, nó trả về giá trị cuối cùng được đánh giá.

var x = ""; 
alert(x && x.length > 0); 

Một chuỗi rỗng là falsey, vì vậy khi bạn sử dụng chỉ x trong một điều kiện, nó sẽ được sai. Vì bạn đang sử dụng &&, nếu LHS là false, thì không có lý do gì để làm phiền việc kiểm tra RHS. Đây là short circuit evaluation. Do đó, phần được đánh giá cuối cùng, chuỗi rỗng, được trả về alert().

var y = "abc"; 
alert(y && y.length > 0); 

Chuỗi không trống là truthy. Vì vậy, LHS là đúng và bởi vì đó là &&, RHS được đánh giá (cần phải biết nếu toàn bộ điều kiện là đúng). Giá trị trả lại của y.length > 0true, để được chuyển đến số alert() của bạn.

+0

trong trường hợp thông tin này giúp người đọc đọc là, giá trị JS falsey là = '0," ", false, null, undefined, NaN' – ajax333221

+0

nhờ @alex, có ý nghĩa hoàn hảo. – kman

0

Đó là chuỗi trả về và trống vì x đã được xác định, chỉ trống.

Điều này làm cho phần đầu tiên của biểu thức của bạn alert(x) hiển thị một chuỗi trống.

Nếu bạn cần kiểm tra chuỗi rỗng/trống, hãy thử một cái gì đó như thế này.

String.isNullOrWhiteSpace = function (str) { 
    if (typeof str === "string") { 
     var isNullOrWhiteSpace = false; 

     // Check for null string 
     if (str == null || typeof str === "undefined") isNullOrWhiteSpace = true; 

     // Check for string with whitespace 
     if (str.replace(/\s/g, '').length < 1) isNullOrWhiteSpace = true; 

     return isNullOrWhiteSpace; 
    } 

    if (typeof str === "undefined" || str == null) { 
     return true; 
    } 
}; 
0

Các hoạt động có điều kiện sử dụng (điều hành AND) && sẽ dừng lại khi:

  • Một trong những điều kiện đánh giá để false
  • Nó thực hiện thành công nó đến cùng bằng cách đánh giá tất cả mọi thứ để true

Kết quả của các hoạt động có điều kiện sẽ được đánh giá lần cuối trước khi dừng (không phải phân mâu một boolean)

Buộc trả lại một thựcboolean, bạn có thể quấn mọi thứ xung quanh !!(...), ví dụ:

alert(typeof !!(...) === "boolean"); //will always be true no matter what conditions are inside 
Các vấn đề liên quan