将不存在的对象值从 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),aget
和 aset
可以与基于字符串的索引一起使用:
(when (not (exists? (aget js/a "b")))
(aset js/a "b" nil))
((!(typeof (a["b"]) !== 'undefined'))?(a["b"] = null):null)
我看到很多代码使用模式:
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),aget
和 aset
可以与基于字符串的索引一起使用:
(when (not (exists? (aget js/a "b")))
(aset js/a "b" nil))
((!(typeof (a["b"]) !== 'undefined'))?(a["b"] = null):null)