我应该一起使用CoffeeScript浸泡和存在操作符吗?

时间:2011-10-07 17:05:36

标签: javascript operators coffeescript javascript-objects

我正在处理一个接受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,因为我认为这两个表达式之间的?运算符是多余的。这看起来是否正确?

1 个答案:

答案 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(因为00 or x)时,您可以同时执行这两项操作。如果你能确定,那就去吧

x