2012-04-03 31 views
11

Tôi nhận thấy điều gì đó hơi lạ với trình biên dịch CoffeeScript và tự hỏi liệu đây có phải là hành vi đúng hay không. Nếu nó là đúng tôi tò mò tại sao có sự khác biệt ..Nhà điều hành tồn tại CoffeeScript và điều này

Với CoffeeScript sau:

if @myVar? 
    alert myVar 

tôi đã mong đợi nó để biên dịch JavaScript như thế này:

if (typeof this.myVar !== "undefined" && this.myVar !== null) { 
    alert(myVar); 
} 

Nhưng thay vào đó trình biên dịch của trình biên dịch CoffeeScript là gì:

if (this.myVar != null) { 
    alert(myVar); 
} 

Nếu tôi không tham khảo điều này (hoặc bất kỳ đối tượng cha mẹ nào khác), CoffeeScript biên dịch như tôi mong đợi.

Đây có phải là hành vi đúng không? Nếu vậy, tại sao nó hoạt động khác khi sử dụng?

Chỉnh sửa:

Để làm rõ thêm một chút. Điều này không xảy ra chỉ với điều này, nhưng bất kỳ thuộc tính khác của các đối tượng. Ví dụ, nếu tôi là thay thế các CoffeeScript trên với những gì bên dưới nó vẫn sẽ biên dịch với chỉ ...

if myVar.myProp? 
    alert myVar 
+2

thể trùng lặp của [điều hành Hiện sinh và đối tượng tài sản] (http://stackoverflow.com/questions/9990117/existential-operator-and-object-properties) –

Trả lời

14

Trong trường hợp "= null!":

myVar = 10 
if myVar? 
    alert myVar 

biên dịch Coffeescript có thể để thấy rằng myVar thực sự được xác định trong dòng đầu tiên, vì vậy nó có thể bỏ qua kiểm tra typeof myVar !== "undefined".

if (myVar !== null) { 
    alert(myVar); 
} 

Nhưng trong trường hợp này:

if myVar? 
    alert myVar 

trình biên dịch không thể đảm bảo rằng myVar là thực sự xác định, kiểm tra để bổ sung là cần thiết:

if (typeof myVar !== "undefined" && myVar !== null) { 
    alert(myVar); 
} 

Vì vậy, câu trả lời là: Coffeescript trình biên dịch cố gắng thông minh để tạo mã hiệu quả.

EDIT Cách giao dịch với tính Coffeescript cũng là đúng: this.prop sẽ trở lại undefined nếu tài sản không được định nghĩa. != sẽ chuyển đổi thành null. Đó là lý do tại sao chúng tôi không cần kiểm tra thêm.
Trong vài từ:

  • truy cập vào biến không xác định ném ngoại lệ - cần phải kiểm tra typeof
  • truy cập thuộc tính không xác định trả undefined - chỉ != là đủ
+0

Tôi hiểu điều đó. Câu hỏi của tôi có nhiều hơn để làm với kiểm tra sự tồn tại của các thuộc tính trên các đối tượng .. this.var, hoặc that.var.property .. vv .. nó bỏ qua kiểm tra không xác định và chỉ làm một! = Null thay vì! == null .. . –

+0

Tôi hiểu ngay bây giờ. Tôi phải viết điều này cho sự thiếu hiểu biết của tôi về trình biên dịch CoffeeScript :) Tôi thực sự không biết nó đủ thông minh để đưa ra những "quyết định" này. Đó là thực sự tốt để biết, mặc dù. Cảm ơn bạn rất nhiều vì cái nhìn sâu sắc! –