数据类型
可以通过 (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}