数据类型

可以通过 (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}