什么是 ClojureScript 类似地将不存在的对象值设置为 JavaScript 中的 null
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)
但是(也许这与对编译器行为的担忧相同),为了避免在闭包优化期间重命名(请参阅此SO),可以将aget
和aset
与基于字符串的索引一起使用:
(when (not (exists? (aget js/a "b")))
(aset js/a "b" nil))
((!(typeof (a["b"]) !== 'undefined'))?(a["b"] = null):null)
相关文章:
- 设置对象中元素的样式
- 使用AJAX设置对象属性
- 如何在使用javascript加载页面时直接设置对象参数
- 设置对象文字数组以将值传递给服务器
- 在 javascript 中使用它获取未定义的设置对象的属性值
- 有没有一种快捷方式可以让我用javascript或jQuery设置对象的字段
- three.js CanvasRenderer-设置对象的初始颜色和透明度纹理
- Javascript设置对象选项
- 如何设置对象沿世界x轴旋转90度
- 设置对象'的财产
- 从方法内部设置对象变量
- 如何在应用程序时设置对象值是午餐
- 通过过滤器数组设置对象数组的属性
- Three.js设置对象不透明度/透明度
- 下划线/洛达什号中的快捷方式,用于(递归)设置对象的所有属性
- 重新设置对象的格式
- 为什么要使用 $.data() 而不是直接通过 JavaScript 设置对象
- 动态设置对象文本值
- 使用 D3.csv 设置对象的数据属性
- 设置对象数据结构数组属性