CoffeeScript không xác định


89

Trong javascript để kiểm tra xem một biến chưa bao giờ được tạo, chúng tôi chỉ

if (typeof MyVariable !== "undefined"){ ... }

Tôi đã tự hỏi làm thế nào tôi làm điều đó trong coffeescript? ... Tôi thử một cái gì đó như

if (MyVariable?false){ ... }

nhưng kiểm tra này nếu MyVariablelà một hàm nếu vậy sẽ gọi MyVariable (sai) nếu không sẽ gọi void (0) hoặc một cái gì đó tương tự.



Thử if MyVariable isnt undefinedcái nào sản xuất if (MyVariable !== void 0).
Yami Odymel

Câu trả lời:


163

Cuối cùng tôi đã tìm thấy cách dễ dàng để làm điều đó:

if (MyVariable?){ ... }

điều đó sẽ tạo ra:

if (typeof MyVariable !== "undefined" && MyVariable !== null){ ... }

CẬP NHẬT 04/07/2014 Liên kết Demo

nhập mô tả hình ảnh ở đây


58
Trên thực tế, nó chỉ được tạo raitem != null
Pencilcheck

13
@Pencilcheck - đó là do trình biên dịch xác định mục đó đã được xác định trong mã của bạn. (Ngoài ra, tên tuyệt vời - mặc dù bây giờ đó là máy tính bảng kiểm tra cho tôi :) Câu trả lời này cũng chọn các giá trị null rất khác với không xác định. Nó có vẻ như là một câu trả lời cho một câu hỏi khác IMHO
Seth

3
@Seth, vâng, tôi luôn bị đốt cháy bởi sắc thái đó, điều này đặt ra câu hỏi hợp lý tiếp theo: CS có cung cấp bất kỳ phím tắt cú pháp nào cho phần sau không: MyVariable = MyMethod; nếu MyVariable? ... thì MyMethod có thể quay trở lại undefinedđâu? Hay sau đó bạn phải dùng đến if typeof myVariable isnt 'undefined'?
neverfox

1
@ preferfox cái sau theo như tôi biết (kiểm tra loại không xác định) - CoffeeScript nghĩ rằng null và không xác định nên được kết hợp.
Seth

6
@Seth, không hẳn vậy. Các phép so sánh không nghiêm ngặt ( ==!=) thực sự coi nullundefinedlà các giá trị bằng nhau, vì vậy item != nullthực sự kiểm tra cả hai nullundefinedcùng một lúc. Nó không, nếu nó được viết là item !== null.
toriningen

26

Trước tiên, để trả lời câu hỏi của bạn:

if typeof myVariable isnt 'undefined' then # do stuff

Giải pháp của Magrangs sẽ hoạt động trong hầu hết các trường hợp, ngoại trừ khi bạn cần phân biệt giữa không xác định và sai (ví dụ: nếu myVariable có thể là đúng, sai hoặc không xác định).

Và chỉ ra rằng, bạn không nên đặt các điều kiện của mình trong dấu ngoặc đơn và bạn không nên sử dụng dấu ngoặc nhọn.

Các thentừ khóa có thể được sử dụng nếu tất cả mọi thứ là trên cùng một dòng, nếu không sử dụng thụt đầu dòng để chỉ ra những gì đang ở trong tình trạng này.

if something  
    # this is inside the if-statement  
# this is back outside of the if-statement

Hi vọng điêu nay co ich!


Các isnttừ khóa tương đương với !=trong Coffeescript, và có thể dễ đọc hơn nếu bạn đang sử dụng để javascript.
Aaron Dufour

12
Để tương đương !==, không!=
Mischa Arefiev

1
Đây là câu trả lời cụ thể nhất - nhiều câu trả lời khác cũng tương tác với giá trị null. Thx
Seth

1
@MischaArefiev !=trong Coffee, được dịch sang !==JavaScript.
Suzana

14

Câu trả lời này dành cho phiên bản cũ hơn của coffeescript. Xem câu trả lời của Jaider ở trên nếu bạn muốn có câu trả lời cập nhật hơn (kể từ tháng 7 năm 2014)

Bản ghi chép này thực hiện những gì bạn muốn Tôi nghĩ:

if not MyVariable?
  MyVariable = "assign a value"

Sản xuất:

if (!(typeof MyVariable !== "undefined" && MyVariable !== null)) {
  MyVariable = "assign a value";
}

Nb nếu bạn thực hiện một nhiệm vụ MyVariableđầu tiên, ngay cả khi bạn đặt MyVariablethành không xác định như trong mã này , thì điều này sẽ biên dịch thành:

if (!(MyVariable != null)) {
  MyVariable = "assign a value";
}

Tôi tin rằng điều này hiệu quả bởi vì !=CoffeeScripts Existential Operator(dấu chấm hỏi) được sử dụng buộc undefinedphải bằng null.

ps Bạn thực sự có thể if (MyVariable?false){ ... }đi làm không? Nó không biên dịch cho tôi trừ khi có khoảng MyVariable? falsetrắng giữa toán tử hiện sinh và sai, tức là sau đó làm cho CoffeeScript kiểm tra nó giống như một hàm vì falsenó nghĩ là một tham số cho của bạn MyVariable, ví dụ :

if MyVariable? false
  alert "Would have attempted to call MyVariable as a function"
else
  alert "but didn't call MyVariable as it wasn't a function"

Sản xuất:

if (typeof MyVariable === "function" ? MyVariable(false) : void 0) {
  alert("Would have attempted to call MyVariable as a function");
} else {
  alert("but didn't call MyVariable as it wasn't a function");
}

3
đây là kịch bản cà phê cũ. các variable?bây giờ chỉ biên dịch để biến = null!
Gambai

@Gambai bạn chắc chứ? Trang web vẫn hiển thị ... !== null coffeescript.org/#try:variable%3F
AJP

1
Có, trình biên dịch bây giờ đôi khi bỏ qua ! = Undefined như một sự tối ưu hóa vì khi đó biến nên được xác định ở đâu đó trong mã. Tôi nói nên vì trình biên dịch không phải lúc nào hoạt động chính xác ...
Suzana

@Suzana_K hay biết. Tôi chắc rằng những người gặp câu hỏi này đều muốn có câu trả lời cập nhật, vui lòng chỉnh sửa câu trả lời của tôi hoặc đăng câu trả lời mới và tôi sẽ liên kết đến câu trả lời đó từ đầu của tôi. Tôi không sử dụng CoffeeScript nữa sau khi sử dụng ES6 / TypeScript nên tôi không thể cập nhật câu trả lời. Trên thực tế, có vẻ như câu trả lời của Jaider đã bao hàm nó: stackoverflow.com/a/10238211/539490
AJP


9

Ngoài câu trả lời của Jaider ở trên (tôi không thể bình luận do không đủ danh tiếng) , hãy cẩn thận rằng đó là một trường hợp khác nếu đó là một cái gì đó bên trong một đối tượng / mảng:

someArray['key']?

sẽ được chuyển đổi thành:

someArray['key'] != null

Ảnh chụp màn hình từ js2coffee.org :

js2coffee.org


Bạn đang kiểm tra xem khóa có tồn tại hay không, vì vậy điều này có ý nghĩa. Nếu bạn cũng cần kiểm tra xem mảng có tồn tại hay không, hãy thử someArray? ['Key']?
Joshua Davison

6

Tôi chỉ sử dụng:

if (myVariable)
    //do stuff

Vì undefined là giả mạo, nó sẽ chỉ thực hiện một số thứ nếu myVariable không phải là undefined.

Bạn chỉ cần lưu ý rằng nó sẽ 'thực hiện công việc' đối với các giá trị 0, "" và null


1
Tôi thích phương pháp này miễn myVariablelà không được phép là một giá trị giả như nullhoặc 0.
Bryan Downing

3

Cách rõ ràng nhất mà tôi đã tìm thấy để gán một biến cho một biến không xác định và không null là sử dụng unless:

unless ( myVar? )
    myVar = 'val'

6
myVar ?= 'val'
Ricket

2

Tại sao không chỉ sử dụng thành ngữ HOẶC?

myVar or 'val'

Vì vậy, kết quả sẽ bằng myVar, trừ khi nó không được xác định trong trường hợp đó nó sẽ bằng 'val'.


3
Với thành ngữ này, bất kỳ giá trị giả nào sẽ trả về 'val' thay vì bất kỳ giá trị nào được cho là - bao gồm '', 0.0false. Đó là, có thể, không mong muốn.
toriningen
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.