CoffeeScript中有一個很是有用的存在運算符?
,它能正確地處理值是否存在(存在的意思爲變量不爲undefined或者null)的狀況。在變量後添加?
來判斷它是否存在。數組
注意,若是?運算符後沒有參數,那麼在使用?運算符時必須緊靠在標識符後,不能有空格,不然會按照函數調用編譯,編譯出錯。app
if yeti? 'I want to believe' ### 上面的代碼被編譯爲: if(typeof yeti != null){ 'I want to believe' } ###
經過在鏈式調用中使用?
能夠防止空值形成類型錯誤,同時,這樣作也沒法對不一樣層次的屬性的不存在分別處理。ide
tree = pine: type: 'evergreen' crabapple: type: 'deciduous' fruit: ediable: false if trees.pine.fruit?.edible console.log "Mmm.. pine fruit"
對於數組和函數調用,也可以使用?
運算符。函數
# 數組 alpha = lowercase: ['a','b','c','d'] console.log alpha.lowercase?[2].toUpperCase() # 執行 console.log alpha.uppercase?[2].toLowerCase() # 不執行 # 函數 oppositeMath = min: Math.max console.log oppositeMath.min?(3.2.5) # 執行 console.log oppositeMath.max?(3,2,5) # 不執行
brief = null breif ?= 2 # breif爲2
上面的例子中須要注意的是:?=
運算符左側不能使用未聲明的變量,不然編譯會出錯,由於變量不是有效引用。?
運算符不受此約束。ui
||
和比較運算符都被擴展了,也就是說||=
和or=
都是合法的。code
CoffeeScript提供瞭解構賦值的功能,即只用一個表達式,就能夠實現給數組或者對象中的多個變量賦值。對象
[first, second] = ["home","cart"] [first, second] = [second, first] # 變量替換 [drink,[alcohol, mixer]] = ["Screwdriver", ["vodka", "orange juice"]] #
同時,咱們能夠在使用返回數組(多個值)的函數時使用。coffeescript
[languageName, prefix] = "CoffeeScript".match /(.*)Script/ console.log "I love the smell of #{prefix} in the morning."
同時,解構賦值還能夠用於對象,將變量付給特定名字,具體有兩種用法:ip
{property} = object
,其中,property爲對象中屬性的名字,複製後成爲單獨的變量能夠直接使用{property: identifier} = object
, 其中,property爲對象中屬性的名字,identifier爲給定的變量名(能夠事先不聲明)。賦值以後identifier的值變成對象中property對應的值。bird = verb: 'singing', time: 'midnight' {time} = bird # time爲'midnight' {time:timeOfDate} = bird # timeOfDate爲'midnight'
同時,能夠互相嵌套對象,還能夠在對象中嵌套數組。ci
# 使用對象嵌套賦值 direction = [ {type: 'boat', directions: ['port', 'starboard']} {type: 'dogsled', directions: ['haw', 'gee']} ] [boatInfo, {directions: [left, right]}] = direction console.log 'boatInfo: ' + boatInfo.type # 輸出 boatInfo: boat console.log 'left: ' + left + '; right: ' + right # 輸出 left: haw; right: gee
CoffeeScript中的函數支持默認函數參數。
func = (a, b = 'b') -> console.log a + ',' + b func 'a' # 輸出 a,b func 'a', null # 輸出 a,b func 'a', 'c' # 輸出 a,c
在函數定義的參數後添加...
,即將此參數聲明爲可接受任意數目參數的變量。
func2 = (a,b...)-> console.log b.length func2 1,2,3,4 # 輸出 3
可變參數不必定要在參數列表最後一個。同時,解構賦值也可使用可變參數。
[race, [splits..., time]] = ['10K',['13:08','13:09','23:17']] console.log race # 輸出 10K console.log splits # 輸出 ['13:08','13:09']
不只能夠在定義函數時使用splat,並且還能夠在調用函數時使用splat。
# 調用函數時使用splat func3 = (a,b,c) -> len = arguments.length console.log len if len == 1 a else if len == 2 a + ',' + b else if len == 3 a + ',' + b + ',' + c else 'null' arr = [1,2,3] console.log func3 arr... ### 輸出: 3 1,2,3 ### # 被調用函數內部使用splat func4 = (a,b...) -> console.log Math.min b... func4 1, 2, 3, 4 # 輸出2
調用splat總結: