2014-10-03 13 views
7

Tôi đã lập trình rất nhiều trong Swift gần đây. Hôm nay tôi đã làm một số công việc trong JavaScipt khi câu hỏi xuất hiện với tôi:Chaining tùy chọn trong JavaScript

Có điều gì đó tương tự như chuỗi tùy chọn trong JavaScript không? Một cách để ngăn chặn undefined is not an object mà không có bất kỳ biến nào?

Ví dụ:

function test(){ 
    if(new Date() % 2){ 
     return {value: function(){/*code*/}}; 
    } 
} 

test().value(); 

sẽ thất bại một nửa thời gian bởi vì đôi khi test lợi nhuận không xác định.

Giải pháp duy nhất tôi có thể nghĩ đến là một chức năng:

function oc(object, key){ 
    if(object){ 
     return object[key](); 
    } 
} 

oc(test(), 'value'); 

Tôi muốn để có thể làm điều gì đó như:

test()?.value() 

Phần sau dấu chấm hỏi chỉ được thực hiện nếu test trả về một đối tượng.

Nhưng điều này không phải là rất sang trọng. Có cái gì tốt hơn? Một sự kết hợp kỳ diệu của các nhà khai thác?

Chỉnh sửa Tôi biết tôi có thể viết lại test để trả lại nội dung nào đó. Nhưng tôi tự hỏi nếu có một cái gì đó như chuỗi tùy chọn. Tôi không quan tâm đến một giải pháp cụ thể cho ví dụ trên ở trên. Một cái gì đó mà tôi cũng có thể sử dụng nếu không có quyền kiểm soát các chức năng trở về không xác định.

+0

những gì bạn muốn value() trả lại khi kiểm tra() trả về không xác định? –

+0

@ZaheerAhmed sai hoặc không xác định. Nó không quan trọng thực sự. – idmean

+0

bạn có thể bọc hàm hiện có để trả lại giá trị mặc định trong trường hợp không xác định, không cần viết lại. bạn cũng có thể sử dụng một ternary (x? y: z)() hoặc toán tử mặc định (x || y)() tại thời gian gọi. – dandavis

Trả lời

5

Trong JavaScript đơn giản, bạn phải thực hiện kiểm tra kiểu hoặc cấu trúc mã của bạn để bạn biết một đối tượng sẽ tồn tại.

CoffeeScript, một ngôn ngữ biên dịch thành JavaScript, cung cấp toán tử tồn tại ?. để chuỗi an toàn nếu bạn sẵn sàng xem xét ngôn ngữ được xử lý trước.

Có một cuộc thảo luận khác here về lý do tại sao bạn không thể sao chép hành vi này trong JS.

Ngoài ra còn có một cuộc thảo luận on the ESDiscuss forums về cách thêm toán tử tồn tại vào phiên bản JavaScript trong tương lai. Nó không có vẻ rất xa mặc dù, chắc chắn hư không gần với thực tế sử dụng. Thêm ý tưởng vào thời điểm này.

+2

Tôi đã chấp nhận câu trả lời của bạn bởi vì nó thực sự trả lời câu hỏi của tôi không giống như các câu trả lời khác bên dưới và bởi vì nó cung cấp một số thông tin thú vị. – idmean

0

Điều gì về việc trả về hàm noop không thực hiện điều gì khi điều kiện không được đáp ứng?

function test(){ 
    if(new Date() % 2){ 
     return {value: function(){/*code*/}}; 
    } 
    return {value: function(){ /* just return a type consistent with the function above */ } 
} 
+0

Đây chỉ là một ví dụ. Tôi đang nói về các chức năng mà tôi không có quyền kiểm soát. – idmean

+0

. lấy làm tiếc. Bạn cần một cái gì đó giống như toán tử '? .' trong Groovy. Không có gì trong JS. – sebnukem

0

Bạn luôn có thể return this; nếu thử nghiệm là phương pháp đối tượng.

Nhưng tại sao bạn muốn ngăn chặn các lỗi như vậy bằng cách tạo các chức năng giả?

+0

OP đã hỏi một câu hỏi chung về chuỗi an toàn, không phải cách cấu trúc một chức năng cụ thể để an toàn. –

3

Bạn có thể sử dụng

test() && test().value(); 

hoặc

var testResult = test(); 
testResult && testResult.value(); 

Nếu bạn hỏi tôi đây là giống nhất với chaining tùy chọn Swift.

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