• 数据类型
    • 来自 JavaScript 的数据类型
    • ClojureScript 其他常用的类型
    • 类型转换
    • 自定义类型

    数据类型

    可以通过 (type x) 来获取 x 的类型.

    来自 JavaScript 的数据类型

    • nil, 对应 null
    • Number
    • Boolean
    • String
    • RegExp

    cljs 当中正则的语法是 #"\\d" 对应 js 里 /\d/.

    \d 本来是字符类型, 在 js 环境中成了 String.

    ClojureScript 其他常用的类型

    • Keyword, :demo, 或者从 String 生成 (keyword "demo").
    • Symbol, 'demo, 或者从 String 生成 (symbol "demo").
    • Atom, (atom 1), 这个写法实际上是把 Number 放进 Atom 里边.
    • Vector, [1 2 3 4]. 也可以写成 (vector 1 2 3 4).
    • List, '(1 2 3 4), 单引号. 也可以写成 (list 1 2 3 4).
    • HashMap, {:a 1 :b 2}. 也可以写成 (hash-map :a 1 :b 2).
    • HashSet, #{1 2 3 4}, 元素是唯一的. 也可以写成 (hash-set 1 2 3 4).

    在 ClojureScript 当中还有其他一些可是使用的列表类型.

    可以用内置函数来判断类型:

    1. (string? "x")
    2. ; true
    3. (keyword :a)
    4. ; :a
    5. (number? 1)
    6. ; true
    7. (boolean? true)
    8. ; true
    9. (some? nil)
    10. ; false
    11. (nil? nil)
    12. ; true
    13. (fn? (fn []))
    14. ; true

    类型转换

    String:

    1. (str :a)
    2. ; ":a"
    3. (str 1)
    4. ; "1"
    5. (name :a)
    6. ; "a"

    Keyword:

    1. (keyword "a")
    2. ; :a

    Boolean:

    1. (boolean "true")
    2. ; true
    3. (boolean 1)
    4. ; true

    Number:

    1. (js/parseInt "11")
    2. ; 11
    3. (js/parseFloat "11")
    4. ; 11

    自定义类型

    通过 defrecord 可以定义新的类型, 不过本质上是 HashMap:

    1. (defrecord Address [street city state zip])
    2. ; cljs.user/Address

    实现一个实例:

    1. (Address. "200 N Mangum" "Durham" "NC" 27701)
    2. ; #cljs.user.Address{:street "200 N Mangum", :city "Durham", :state "NC", :zip 27701}

    由于同时会生成对应的 Macro, 用 ->Address 也是一样的:

    1. (->Address "200 N Mangum" "Durham" "NC" 27701)
    2. ; #cljs.user.Address{:street "200 N Mangum", :city "Durham", :state "NC", :zip 27701}