数据类型
可以通过 (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 当中还有其他一些可是使用的列表类型.
可以用内置函数来判断类型:
(string? "x")
; true
(keyword :a)
; :a
(number? 1)
; true
(boolean? true)
; true
(some? nil)
; false
(nil? nil)
; true
(fn? (fn []))
; true
类型转换
String:
(str :a)
; ":a"
(str 1)
; "1"
(name :a)
; "a"
Keyword:
(keyword "a")
; :a
Boolean:
(boolean "true")
; true
(boolean 1)
; true
Number:
(js/parseInt "11")
; 11
(js/parseFloat "11")
; 11
自定义类型
通过 defrecord 可以定义新的类型, 不过本质上是 HashMap:
(defrecord Address [street city state zip])
; cljs.user/Address
实现一个实例:
(Address. "200 N Mangum" "Durham" "NC" 27701)
; #cljs.user.Address{:street "200 N Mangum", :city "Durham", :state "NC", :zip 27701}
由于同时会生成对应的 Macro, 用 ->Address 也是一样的:
(->Address "200 N Mangum" "Durham" "NC" 27701)
; #cljs.user.Address{:street "200 N Mangum", :city "Durham", :state "NC", :zip 27701}