什么是 ClojureScript 类似地将不存在的对象值设置为 JavaScript 中的 null

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

本文关键字:设置 对象 JavaScript null 中的 不存在 ClojureScript 什么      更新时间:2023-09-26

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

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)

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

(when (not (exists? (aget js/a "b")))
  (aset js/a "b" nil))
((!(typeof (a["b"]) !== 'undefined'))?(a["b"] = null):null)