我正在编写接受 settings
的脚本对象,但在未提供设置的情况下使用默认值。
我刚刚写了以下 CoffeeScript 行:
iframe_width = settings?.iframe?.width? ? $iframe_body.width()
用简单的英语来说,我的意图是:
If the
settings
object is defined, and it defines a propertyiframe
, and theiframe
property defines a propertywidth
, then assign the value of the latter property to the variableiframe_width
. Otherwise, assign the value returned by calling$iframe_body.width()
.
我的 CoffeeScript 代码是否反射(reflect)了我的意图,它是表达意图的最有效方式吗?所有存在运算符 ( ?
) 似乎都很尴尬,所以我想把它放在那里征求一些反馈(编译后的 JavaScript 非常简洁和神秘,所以很难说它是否应该按预期工作)。
此外,我不确定同时使用标准存在运算符 ( ?
) 及其访问器变体 ( ?.
) 是否有任何冗余。
谢谢!
更新:
上面的代码似乎没有按预期工作;然而,这样做:
iframe_width = settings?.iframe?.width ? $iframe_body.width()
这是有道理的,因为我不认为前面的代码实际上访问了 width
属性(property),而只是检查它的存在(两次,甚至?)。在此代码中,我删除了 ?
在 width
之后属性,因为我认为这与 ?
是多余的两个表达式之间的运算符。这看起来正确吗?
最佳答案
(注意:这个答案是在问题更新之前写的。正如提问者所意识到的,foo? ?bar
不仅仅是多余的——它实际上不会有效,因为 foo?
的计算结果为 true
或 false
,因此始终为非 null。)
你有两个很好的选择来简化这个:第一,你可以用 or
替换存在的二元运算符:
iframe_width = settings?.iframe?.width? or $iframe_body.width()
第二,您可以在 width
之后放弃 ?
——它是多余的:
iframe_width = settings?.iframe?.width ? $iframe_body.width()
现在,当且仅当 iframe.width
永远不会是 0
(因为 0 或 x
是 x
)。如果你能确定这一点,那就去做吧
iframe_width = settings?.iframe?.width or $iframe_body.width()
关于javascript - 我应该同时使用 CoffeeScript soaks 和存在运算符吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7690512/