Toán tử Ternary Javascript so với ||


17

Tôi đã xem qua một số mã node.js trước đó và tôi nhận thấy rằng người viết nó dường như ủng hộ cú pháp sau:

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

Trên những gì tôi cho là ngắn gọn hơn:

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

Tôi đã tự hỏi nếu hình thức thứ hai thực sự là cú pháp JavaScript được xã hội chấp nhận hơn, tôi đã thấy nó trong tự nhiên nhiều lần hơn so với toán tử ternary cho mục đích này.

Tôi lưu ý rằng trong ví dụ đầu tiên, anh ta sử dụng hai số bằng (không phải bằng ba số) có nghĩa là nó sẽ tính "không xác định" là null, điều này sẽ làm giảm một tác động mà tôi có thể nghĩ đến. Tuy nhiên, tôi đã đọc ở nhiều nơi rằng == là một toán tử khá xấu trong JavaScript (JSLint chống lại nó rất nhiều, IIRC).


2
Bình luận viên : ý kiến ​​có nghĩa là để tìm kiếm làm rõ, không phải để thảo luận mở rộng. Nếu bạn có một giải pháp, hãy để lại một câu trả lời. Nếu giải pháp của bạn đã được đăng, xin vui lòng nâng cấp nó. Nếu bạn muốn thảo luận câu hỏi này với người khác, vui lòng sử dụng trò chuyện . Xem FAQ để biết thêm thông tin.

Câu trả lời:


17

Bởi vì mã này sẽ đánh giá thành 'Giá trị mặc định' mỗi khi bạn chuyển qua 0, "", sai hoặc một số giá trị giả mạo khác.

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

Nó có thể không cắn bạn về cách bạn sử dụng chức năng đặc biệt này, nhưng đó là một mô hình xấu cần tránh khi bạn quan tâm đến việc chuyển vào những thứ như chuỗi rỗng hoặc 0 hoặc boolean.


bạn chỉ nên sử dụng kết hợp null trên một đối tượng và nếu một đối tượng được xác định, thì điều này sẽ không hoạt động. Với có thể ngoại lệ của chuỗi rỗng.
Malfist

4
So sánh bằng không là một điểm tốt, có thể khá bất ngờ.
Ed James

1
+1 - vấn đề này chính xác là lý do tại sao Python (cuối cùng) đã thêm cú pháp "x if y other z". Các ngữ nghĩa cho các toán tử logic là khá phổ biến và các lỗi phổ biến tương tự có xu hướng tăng lên bất cứ khi nào thành ngữ dựa vào chúng để thực hiện công việc của các toán tử lựa chọn có điều kiện.
Steve314

đừng quên đặt cấu trúc của bạn trong ngoặc đơn, nếu bạn sử dụng chúng cùng với nối chuỗi var txt = 'Hello, ' + (user_name||'User') + '!';sẽ hoạt động, nhưng không có dấu ngoặc đơn - bạn sẽ nhận được undefined. jsfiddle.net/4mFAB/1
c69

7

Những gì bạn thực sự cần là một toán tử hợp nhất null. Nhưng thấy rằng javascript không thực sự có một, các lập trình viên thường sử dụng '||' để đứng cho nó

Tuy nhiên, cả hai đều hoàn toàn hợp lý. Đối với những người không hiểu toán tử hợp nhất null là gì, toán tử ternary có lẽ dễ hiểu hơn.


Một toán tử liên quan khác là toán tử Icon đánh vần là "II" khác. Điều này nhận ra một kết quả "thất bại" đặc biệt từ đối số thứ nhất và sử dụng đối số thứ hai trong trường hợp đó để thay thế. Tôi mong muốn Pythons "x nếu y khác z" được triển khai bằng hai toán tử riêng biệt - toán tử xác nhận nhị phân "nếu" và toán tử "khác" giống như Biểu tượng - với hai toán tử này có thể sử dụng độc lập. Tuy nhiên, Icon không hỗ trợ phong cách đó, thay vào đó làm điều gì đó kỳ quái với các nhà khai thác tương đối.
Steve314

@ Steve314: Python thực sự có thứ bạn muốn: một toán tử khác [false-part, true-part]với một toán tử riêng nếu [..][bool(condition)]kết hợp thành [false-part, true-part][bool(condition)]. Nếu bạn muốn hành vi lười biếng, bạn có thể chỉ cần lambda phần đúng và sai.
Nói dối Ryan

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.