2013-06-27 32 views
8

CoffeeScript biến user?.id vàoCách tạo toán tử tồn tại kiểu CoffeeScript trong JavaScript?

if (typeof user !== "undefined" && user !== null) { 
    user.id; 
} 

Có thể tạo một hàm JavaScript exists rằng sẽ làm điều gì đó tương tự? ví dụ:

exists(user).id 

sẽ cho kết quả trong cả hai user.id hoặc null

Nó sẽ dễ dàng hơn nếu một chức năng chấp nhận tham số khác, ví dụ: exists(user, 'id'), nhưng điều đó sẽ không nhìn như thoải mái.

+0

Đối với một điều này sẽ cần getters mục đích chung ('definegetter (o, chức năng (tài sản) {...})', đó là, nếu tôi nhớ correclty, không nằm trong đặc điểm kỹ thuật của JavaScript. – Zeta

+0

@Zeta Không thực sự, vì việc truy cập một thuộc tính không tồn tại của một đối tượng trả về 'undefined' thay vì thất bại, nên đủ tốt – millimoose

+3

Gần nhất tôi có thể nghĩ là' hàm tồn tại (obj) {if (obj) return obj; return {}; } ', nhưng điều đó sẽ không xử lý các biến không xác định. Javascript không phải là cú pháp có thể mở rộng theo cách đó. – millimoose

Trả lời

5

Không, bạn không thể tạo ra chức năng như vậy. Vấn đề là điều này:

any_function(undeclared_variable) 

sẽ sản xuất một ReferenceError nếu undeclared_variable đã không công bố bất cứ nơi nào. Ví dụ: nếu bạn chạy mã độc lập này:

function f() { } 
f(pancakes); 

bạn sẽ nhận được tham chiếu vì pancakes không được khai báo ở bất kỳ đâu. Demo: http://jsfiddle.net/ambiguous/wSZaL/

Tuy nhiên, typeof operator có thể được sử dụng trên một cái gì đó mà không được công bố vì vậy đây:

console.log(typeof pancakes); 

sẽ chỉ cần đăng nhập một undefined trong giao diện điều khiển. Demo: http://jsfiddle.net/ambiguous/et2Nv/

Nếu bạn không nhớ ReferenceErrors có thể thì bạn đã có chức năng cần thiết trong câu hỏi của bạn:

function exists(obj, key) { 
    if (typeof obj !== "undefined" && obj !== null) 
     return obj[key]; 
    return null; // Maybe you'd want undefined instead 
} 

hay, vì bạn không cần phải có khả năng sử dụng typeof trên các biến chưa được khai báo ở đây, bạn có thể đơn giản hóa nó xuống:

function exists(obj, key) { 
    if(obj != null) 
     return obj[key]; 
    return null; 
} 

Lưu ý sự thay đổi để !=, undefined == null là đúng mặc dù không phải là undefined === null.

3

Câu hỏi rất cũ nhưng đã khiến tôi suy nghĩ về giải pháp này.

exists = (obj) => obj || {} 
exists(nullableObject).propName; 
Các vấn đề liên quan