将不存在的对象值从 JavaScript 设置为 null 的 ClojureScript 模拟是什么?

What is the ClojureScript analogue of setting an object value that didn't exist to null from JavaScript?

我看到很多代码使用模式:

if (typeof a.b === 'undefined') {
  a.b = null;

现在我将其翻译成:

(if (not (exists (.-b a)))
  (aset a b nil)

但我觉得我应该将其设置为:

(if (not (exists (.-b a)))
  (aset a b (clj->js {}))

(因为编译器可能会在前一种情况下完全删除该步骤)。

这合适吗?还是我丢失了一些重要数据?

我的问题是:从 JavaScript 将不存在的对象值设置为 null 的 ClojureScript 模拟是什么?

首先,如果试图模仿一些 JavaScript,我建议使用 :repl-verbose 选项,因为它可以很容易地在 REPL 中尝试变体并立即看到结果 JavaScript.

如果您想完全模仿您的代码,那么 set! 就可以了:

(when (not (exists? (.-b js/a)))
  (set! (.-b js/a) nil))

生产

((!(typeof a.b !== 'undefined'))?a.b = null:null)

但是(也许这与编译器行为引起的关注相同),为了避免在闭包优化期间重命名(参见 this SO),agetaset 可以与基于字符串的索引一起使用:

(when (not (exists? (aget js/a "b")))
  (aset js/a "b" nil))

((!(typeof (a["b"]) !== 'undefined'))?(a["b"] = null):null)