《CoffeeScript應用開發》學習: 第四章-改進應用程序

檢查值是否存在

使用存在運算符

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

接受可變參數的splat

在函數定義的參數後添加...,即將此參數聲明爲可接受任意數目參數的變量。

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。

# 調用函數時使用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總結:

  • splat老是讓你處理一個數組
  • splat爲函數的參數,那麼以數組的形式給出,同時,也可在函數內部將splat形式的參數用來調用函數,如func4所示
  • 以splat形式調用函數,以數組的方式調用,函數接收到的爲分開的值
相關文章
相關標籤/搜索