CoffeeScript ไม่ได้กำหนด


89

ในจาวาสคริปต์เพื่อตรวจสอบว่าไม่เคยสร้างตัวแปรหรือไม่เราก็ทำ

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

ฉันสงสัยว่าฉันทำแบบนั้นในกาแฟได้อย่างไร ... ฉันลองทำสิ่งที่ชอบ

if (MyVariable?false){ ... }

แต่ตรวจสอบว่าMyVariableเป็นฟังก์ชันหรือไม่ถ้าเป็นเช่นนั้นจะเรียก MyVariable (เท็จ) ถ้าไม่ใช่จะเรียกโมฆะ (0) หรืออะไรทำนองนั้น



ลองซึ่งเป็นผู้ผลิตif MyVariable isnt undefined if (MyVariable !== void 0)
Yami Odymel

คำตอบ:


163

ในที่สุดฉันก็พบวิธีง่ายๆนี้:

if (MyVariable?){ ... }

ที่จะสร้าง:

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

UPDATE 04/07/2014 ลิงค์สาธิต

ป้อนคำอธิบายภาพที่นี่


58
จริงๆแล้วมันสร้างขึ้นเท่านั้นitem != null
Pencilcheck

13
@Pencilcheck - นั่นเป็นเพราะคอมไพเลอร์ระบุว่ารายการนั้นถูกกำหนดไว้ในโค้ดของคุณ (ด้วยชื่อที่ดี - แม้ว่าตอนนี้จะเป็นการตรวจสอบแท็บเล็ตสำหรับฉัน :) คำตอบนี้ยังเลือกค่าว่างซึ่งแตกต่างจากที่ไม่ได้กำหนดไว้มาก ดูเหมือนจะเป็นคำตอบสำหรับคำถามอื่น IMHO
Seth

3
@ เซ ธ ใช่ฉันถูกเผาด้วยความแตกต่างกันนิดหน่อยตลอดเวลาซึ่งทำให้เกิดคำถามเชิงตรรกะต่อไป: CS เสนอทางลัดทางไวยากรณ์สำหรับสิ่งต่อไปนี้หรือไม่: MyVariable = MyMethod; ถ้า MyVariable? ... ที่ MyMethod อาจกลับมาundefined? หรือแล้วคุณต้องหันไปif typeof myVariable isnt 'undefined'?
neverfox

1
@neverfox ตัวหลังเท่าที่ฉันทราบ (การตรวจสอบประเภทที่ไม่ได้กำหนด) - CoffeeScript คิดว่าควรจะเป็นโมฆะและไม่ได้กำหนด
Seth

6
@ เส ธ ไม่ได้จริงๆ การเปรียบเทียบแบบไม่เข้มงวด ( ==และ!=) จริงรักษาnullและundefinedเป็นค่าเท่ากันดังนั้นitem != nullการทดสอบจริงทั้งในnullและundefinedในเวลาเดียวกัน มันไม่ได้ถ้ามันเขียนเป็นitem !== null.
toriningen

26

ก่อนอื่นตอบคำถามของคุณ:

if typeof myVariable isnt 'undefined' then # do stuff

โซลูชันของ Magrangs จะใช้งานได้ในกรณีส่วนใหญ่ยกเว้นเมื่อคุณต้องการแยกความแตกต่างระหว่างไม่ระบุและเท็จ (เช่น myVariable อาจเป็นจริงเท็จหรือไม่ได้กำหนด)

และเพื่อชี้ให้เห็นว่าคุณไม่ควรใส่เงื่อนไขของคุณไว้ในวงเล็บและคุณไม่ควรใช้วงเล็บปีกกา

thenคำหลักที่สามารถนำมาใช้ถ้าทุกอย่างอยู่บนเส้นเดียวกันมิฉะนั้นใช้เยื้องเพื่อบ่งชี้ถึงสิ่งที่อยู่ภายในรหัสของสภาพ

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

หวังว่านี่จะช่วยได้!


isntคำหลักเทียบเท่ากับ!=ใน CoffeeScript และอาจจะอ่านได้มากขึ้นถ้าคุณกำลังใช้จาวาสคริปต์
Aaron Dufour

12
เทียบเท่ากับ!==ไม่ใช่!=
Mischa Arefiev

1
นี่คือคำตอบที่เฉพาะเจาะจงที่สุด - คำตอบอื่น ๆ ส่วนใหญ่โต้ตอบกับค่าว่าง Thx
Seth

1
@MischaArefiev !=ใน Coffee ซึ่งแปลเป็น!==JavaScript
Suzana

14

คำตอบนี้ใช้สำหรับ Coffeescript เวอร์ชันเก่า ดูคำตอบของ Jaider ด้านบนหากคุณต้องการคำตอบที่เป็นปัจจุบัน (ข้อมูล ณ เดือนกรกฎาคม 2014)

กาแฟนี้ทำในสิ่งที่คุณต้องการฉันคิดว่า:

if not MyVariable?
  MyVariable = "assign a value"

ซึ่งผลิต:

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

Nb หากคุณทำการมอบหมายให้MyVariableก่อนแม้ว่าคุณMyVariableจะตั้งค่าเป็นไม่ได้กำหนดไว้ในรหัสนี้ก็ตามสิ่งนี้จะรวบรวมเป็น:

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

ผมเชื่อว่างานนี้เพราะ!=ใช้โดย CoffeeScripts Existential Operator(เครื่องหมายคำถาม) coerces จะเท่ากับundefinednull

ps if (MyVariable?false){ ... }เข้าทำงานได้จริงหรือ? มันไม่ได้รวบรวมสำหรับฉันเว้นแต่มีช่องว่างระหว่างผู้ประกอบการและการดำรงอยู่เช่นเท็จMyVariable? falseซึ่งทำให้ CoffeeScript ตรวจสอบเช่นฟังก์ชั่นเพราะการfalseที่มันคิดว่าเป็นพารามิเตอร์ของคุณMyVariable, ตัวอย่างเช่น :

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"

ผลิต:

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
นี่คือสคริปต์กาแฟเก่า variable?รวบรวมตอนนี้มีเพียงตัวแปร = null!
Gambai

@ แกมเบียแน่ใจหรือ เว็บไซต์ยังคงแสดง... !== null coffeescript.org/#try:variable%3F
AJP

1
ใช่บางครั้งคอมไพลเลอร์จะละเว้น! = ไม่ได้กำหนดเป็นการปรับให้เหมาะสมเพราะเมื่อใดควรกำหนดตัวแปรในโค้ด ฉันพูดว่าควรเพราะคอมไพเลอร์ทำงานไม่ถูกต้องเสมอไป ...
Suzana

@Suzana_K น่ารู้. ฉันแน่ใจว่าคนที่เจอคำถามนี้ต้องการคำตอบที่เป็นปัจจุบันโปรดอย่าลังเลที่จะแก้ไขของฉันหรือโพสต์คำตอบใหม่และฉันจะเชื่อมโยงจากด้านบนสุด ฉันไม่ได้ใช้ CoffeeScript อีกต่อไปหลังจากใช้ ES6 / TypeScript ดังนั้นฉันจึงไม่สามารถอัปเดตคำตอบได้ ที่จริงดูเหมือนว่าคำตอบของ Jaider จะครอบคลุม: stackoverflow.com/a/10238211/539490
AJP


9

นอกเหนือจากคำตอบของ Jaiderด้านบน(ฉันไม่สามารถแสดงความคิดเห็นได้เนื่องจากชื่อเสียงไม่เพียงพอ)โปรดระวังว่าจะเป็นกรณีที่แตกต่างกันหากเป็นสิ่งที่อยู่ในวัตถุ / อาร์เรย์:

someArray['key']?

จะถูกแปลงเป็น:

someArray['key'] != null

ภาพหน้าจอจากjs2coffee.org :

js2coffee.org


คุณกำลังตรวจสอบว่ามีคีย์อยู่หรือไม่ดังนั้นจึงสมเหตุสมผล หากคุณต้องการตรวจสอบว่ามีอาร์เรย์อยู่หรือไม่ให้ลองใช้ someArray? ['key']?
Joshua Davison

6

ฉันแค่ใช้:

if (myVariable)
    //do stuff

เนื่องจากไม่ได้กำหนดเป็นเท็จจึงจะทำบางสิ่งได้ก็ต่อเมื่อไม่ระบุ myVariable

คุณเพียงแค่ต้องทราบว่ามันจะ 'ทำบางสิ่ง' สำหรับค่าที่เป็น 0, "" และเป็นโมฆะ


1
ฉันชอบวิธีการนี้ตราบใดที่myVariableไม่ได้รับอนุญาตให้เป็นค่า falsy เหมือนหรือnull 0
Bryan Downing

3

วิธีที่สะอาดที่สุดที่ฉันพบในการกำหนดตัวแปรให้กับตัวแปรที่ไม่ได้กำหนดและไม่ใช่ค่าว่างคือการใช้unless:

unless ( myVar? )
    myVar = 'val'

2

ทำไมไม่ใช้แค่สำนวน OR?

myVar or 'val'

ดังนั้นผลลัพธ์จะเท่ากับ myVar เว้นแต่จะไม่ได้กำหนดไว้ซึ่งในกรณีนี้จะเท่ากับ 'val'


3
ด้วยสำนวนนี้ค่า falsish ใด ๆ ที่จะกลับมา 'Val' แทนสิ่งที่มันควรจะเป็น - รวม'', และ0.0 falseซึ่งอาจไม่เป็นที่ต้องการ
toriningen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.