js_of_ocaml中OCaml代码如何检查JS对象是否存在指定字段
解决方案
在Js_of_ocaml环境下有多种方法可以检查Js对象是否存在指定字段,常用的有以下两种方案:
方案1:直接调用Js.Unsafe.has_property检查(最便捷)
这个方法的行为等价于JavaScript中的'属性名' in 对象操作,会同时检查对象自身和原型链上的属性,用法如下:
(* 检查params是否存在b字段 *) if Js.Unsafe.has_property params "b" then (* 存在字段时的逻辑 *) print_endline (Js.to_string params##.b) else (* 不存在时的降级逻辑 *) print_endline "字段b不存在"
如果仅需要检查对象自身拥有的属性(不包含原型链继承的属性),可以调用JS原生的hasOwnProperty方法:
let has_own_b = Js.to_bool @@ Js.Unsafe.global##.Object##.prototype##.hasOwnProperty##call params (Js.string "b") in if has_own_b then (* 自有属性存在的逻辑 *)
方案2:通过可选字段类型实现类型安全检查
如果希望避免拼写错误等问题,可以先定义带可选字段的对象类型,通过类型系统保障检查逻辑的正确性:
- 首先定义对象类型,将可选字段标记为
Js.optdef类型:
type params_t = < a: Js.js_string Js.t; b: Js.js_string Js.t Js.optdef; (* b为可选字段 *) > Js.t
- 对参数做类型转换后用
Js.Optdef工具类检查:
let params = (params :> params_t) in match Js.Optdef.to_option params##.b with | Some b_val -> print_endline (Js.to_string b_val) | None -> print_endline "字段b不存在"
改造后的完整示例代码
Js.Unsafe.global##.test := Js.wrap_callback ( fun params -> print_endline "params##.a:"; print_endline (Js.to_string params##.a); print_endline "params##.b:"; if Js.Unsafe.has_property params "b" then let b_str = Js.to_string params##.b in print_endline b_str; Js.string ((Js.to_string params##.a) ^ b_str) else begin print_endline "无b字段,使用默认值"; Js.string ((Js.to_string params##.a) ^ "default") end );
内容的提问来源于stack exchange,提问作者SoftTimur
相关产品推荐
相关产品推荐

