cljs.user=> (def a #js {})
#'cljs.user/a
cljs.user=> (set! a -x false)
WARNING: Use of undeclared Var cljs.user/-x at line 1 <cljs repl>
nil
cljs.user=> a
nil
根本原因在于从 cljs.analyzer
中取出的以下代码没有区分 false/nil 的 alt
和完全缺失的值。
(defmethod parse 'set!
[_ env [_ target val alt :as form] _ _]
(let [[target val] (if alt
;; (set! o -prop val)
[`(. ~target ~val) alt]
[target val])]
...))
修复问题的方法之一是显式检查 (count form)
的值。