2013-03-26 28 views
10

Khi đọc tài liệu Coffeescript, tôi đã bị nhầm lẫn bởi scant documentation on existential operators. Các tài liệu khẳng địnhCác toán tử chuyển nhượng có điều kiện tồn tại trong Coffeescript

Nó (?=) cũng có thể được sử dụng để chuyển nhượng có điều kiện an toàn hơn ||= cung cấp đối với trường hợp bạn có thể xử lý số hoặc chuỗi.

Sự khác nhau giữa nhà điều hành ?=||= là gì và khi nào nên được sử dụng so với người khác?

Trả lời

18

?|| kiểm tra các điều kiện hoàn toàn khác (nhưng chồng chéo).

Nhà điều hành || hoạt động chính xác theo cách tương tự như trong JavaScript, vì vậy những thứ như 0'' là falsey theo như || là có liên quan; || kiểm tra tính trung thực theo nghĩa JavaScript.

Nhà điều hành ? được chuyển thành == null trong JavaScript nên a ? b chỉ b là khi anull hoặc undefined; ? kiểm tra tính xác định theo nghĩa CoffeeScript.

xem xét sau đây:

for v in [false, 0, '', null, undefined, 6] 
    do (v) -> 
     a = v 
     a ||= 'pancakes' 
     console.log("#{v} ||= 'pancakes':", a) 

for v in [false, 0, '', null, undefined, 6] 
    do (v) -> 
     a = v 
     a ?= 'pancakes' 
     console.log("#{v} ?= 'pancakes':", a) 

Vòng lặp đầu tiên sẽ cung cấp cho bạn năm bánh kếp và một 6, vòng thứ hai sẽ cung cấp cho bạn một false, 0, '', hai bánh, và một 6.

Demo: http://jsfiddle.net/ambiguous/PdLDe/1/

Vì vậy, nếu bạn chỉ muốn hành vi JavaScript kiểu (ví dụ: 0, false, và '' đang được bỏ qua) sau đó bạn có thể muốn ||=. Nếu bạn chỉ muốn bỏ qua nullundefined thì bạn muốn ?=.

+2

Tôi nghĩ bạn có nghĩa là "# {v} .." không phải "# {a} ..", tại sao in hai lần? –

+0

@NickSotiros: Tôi nghĩ bạn nói đúng, các chuỗi bên trong lệnh 'console.log' nên (và bây giờ làm) sử dụng' # {v} 'trong khi đối số thứ hai phải là' a'. Cảm ơn cho những người đứng đầu lên. –

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