2011-12-20 33 views
8

Tại sao javascript lại muốn trả lại một số String so với bất kỳ lựa chọn nào khác?trả về Chuỗi so với Số nguyên so với số không được xác định vs null

Hãy xem đoạn mã sau.

var arr = ['Hello1', 'Hello2', 'Hello3']; 

Array.prototype.item = function(x) { 
    return this[x] || null || 'aïe' || 12 || undefined ; 
}; 

console.log(arr.item(43)); // returns aïe 

Tôi cố tình gọi là phần tử mảng không tồn tại.

Tuy nhiên tôi không thể hiểu tại sao arr.item(43) trả về số String? Tại sao không phải là null hoặc undefined hoặc thậm chí 12?

Trả lời

25

this[x]undefined, bị lỗi và do đó là null.

Toán tử || trả về giá trị "trung thực" đầu tiên mà nó tìm thấy và dừng đánh giá tại thời điểm đó.

Nếu không tìm thấy giá trị "trung thực", nó sẽ trả về kết quả của toán hạng cuối cùng được đánh giá.

Có tổng cộng 6 giá trị "falsey". Họ là ...

  1. false
  2. undefined
  3. null
  4. ""
  5. NaN
  6. 0

Mọi thứ khác được coi là trung thực.

Vì vậy, biểu hiện của bạn sẽ được đánh giá là ...

// v--falsey   v--truthy! return it! 
((((this[x] || null) || 'aïe') || 12) || undefined); 
//    ^--falsey   ^--------^---these are not evaluated at all 

Hoặc bạn có thể nhìn vào nó như thế này:

(
    (
    (
     (this[x] || null) // return null 
      /* (null */ || 'aïe') // return 'aïe' and stop evaluating 
           || 12) 
             || undefined); 
+1

Chúc mừng! Hoàn toàn rõ ràng :) – Pierre

+2

Chỉ cần một nitpick, '||' trả về biểu thức được đánh giá cuối cùng. Trong trường hợp khi một người * trung thực *, nó sẽ trả về điều đó. – alex

+0

@alex: Hmmm ... có, nhưng biểu thức "trung thực" đầu tiên * là * lần đánh giá cuối cùng. Có lẽ tôi đã không nhấn mạnh ngắn mạch một cách rõ ràng đủ. Tôi sẽ cập nhật. –

1

Chuỗi là giá trị truthy đầu tiên trong chuỗi hoặc của. Các mẫu.

1

Do đánh giá theo thứ tự từ trái sang phải.

Nếu bạn đã sửa đổi như sau:

return this[x] || null || 12 || 'aïe' || undefined ; 

câu trả lời của bạn sẽ là 12.

3

a || b là tương đương với a ? a : b, hoặc mã hơi dài dòng hơn này:

if (a) { 
    result = a; 
} else { 
    result = b; 
} 

||left-associative biểu thức a || b || c được đánh giá là (a || b) || c.


Vì vậy, trong thuật ngữ đơn giản này có nghĩa là các nhà điều hành || khi xích trả về toán hạng đầu tiên đó là "truthy", nếu không yếu tố cuối cùng.

Tính năng này có thể hữu ích cho việc cung cấp giá trị mặc định khi bạn có giá trị bị thiếu:

var result = f() || g() || defaultValue; 

Bạn có thể đọc như sau: Lấy kết quả của f(). Nếu đó là giá trị falsey, hãy thử g(). Nếu điều đó cũng cho giá trị falsey, thì hãy sử dụng defaultValue.

5

Tuyên bố

return this[x] || null || 'aïe' || 12 || undefined ; 

sẽ đánh giá subexpressions trái sang phải, và sẽ trở lại với subexpression đầu tiên mà không đánh giá để sai. Phần tử không tồn tại đánh giá là false vì nó không được xác định và nullfalse theo định nghĩa. Điều đó để lại chuỗi như là không đầu tiên không false biểu hiện phụ, vì vậy đó là những gì bạn nhận được.

0

return this[x] || null || 'aïe' || 12 || undefined sẽ không trả lại một trong số đó. Nó được cho là để trả lại kết quả của biểu thức this[x] || null || 'aïe' || 12 || undefined - Tôi tin rằng nó sẽ trả về một giá trị boolean.

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