- 数据类型
- 来自 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 当中还有其他一些可是使用的列表类型.
可以用内置函数来判断类型:
(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}
