我正在处理一个接受settings
对象的脚本,但使用的默认值不提供设置。
我刚写了以下的CoffeeScript行:
iframe_width = settings?.iframe?.width? ? $iframe_body.width()
我的意思是用简单的英语:
如果定义了
settings
对象,并且它定义了属性iframe
,并且iframe
属性定义了属性width
,则指定后者属性的值到变量iframe_width
。否则,通过调用$iframe_body.width()
来分配返回的值。
我的CoffeeScript代码是否反映了我的意图,是否是最有效的表达方式?对于所有存在运算符(?
)来说似乎很尴尬,所以我想把它放在那里以获得一些反馈(编译的JavaScript非常简洁和神秘,因此很难判断它是否应该按预期工作)。
另外,我不确定在使用标准存在运算符(?
)及其访问变量(?.
)时是否存在任何冗余。
谢谢!
更新
上面的代码似乎没有按预期工作;但是,这样做:
iframe_width = settings?.iframe?.width ? $iframe_body.width()
这是有道理的,因为我不认为前一个代码实际上访问width
属性,而只是检查它的存在(两次,甚至?)。在此代码中,我在?
属性之后删除了width
,因为我认为这两个表达式之间的?
运算符是多余的。这看起来是否正确?
答案 0 :(得分:6)
(注意:这个答案是在问题更新之前写的。正如提问者意识到的那样,foo? ? bar
不仅仅是多余的 - 它实际上是行不通的,因为{{1评估为foo?
或true
,因此始终为非null。)
你有两个很好的选择来简化这个:一,你可以用false
替换存在二元运算符:
or
二,你可以在iframe_width = settings?.iframe?.width? or $iframe_body.width()
之后放弃?
- 这是多余的:
width
现在,当且仅当 iframe_width = settings?.iframe?.width ? $iframe_body.width()
永远不会iframe.width
(因为0
为0 or x
)时,您可以同时执行这两项操作。如果你能确定,那就去吧
x