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

Bun*_*gle 3 javascript operators javascript-objects coffeescript

我正在处理一个接受settings对象的脚本,但是使用默认值,不提供设置.

我刚写了以下的CoffeeScript行:

iframe_width = settings?.iframe?.width? ? $iframe_body.width()
Run Code Online (Sandbox Code Playgroud)

用简单的英语说,我的意图是:

如果settings定义了对象,并且它定义了属性iframe,并且iframe属性定义了属性width,则将后一属性的值赋给变量iframe_width.否则,分配调用返回的值$iframe_body.width().

我的CoffeeScript代码是否反映了我的意图,是否是最有效的表达方式?所有存在运算符(?)似乎都很尴尬,所以我想把它放在那里以获得一些反馈(编译的JavaScript非常简洁和神秘,因此很难判断它是否应该按预期工作).

另外,我不确定在使用标准存在运算符(?)和它的存取变量(?.)时是否存在任何冗余.

谢谢!


更新:

上面的代码似乎没有按预期工作; 但是,这样做:

iframe_width = settings?.iframe?.width ? $iframe_body.width()
Run Code Online (Sandbox Code Playgroud)

这是有道理的,因为我不认为前一个代码实际上访问该width属性,而只是检查它的存在(两次,甚至?).在这段代码中,我删除了?刚刚经过width的性质,因为我认为这是多余的与?两个表达式之间的操作.这看起来是否正确?

Tre*_*ham 6

(注意:这个答案是在问题更新之前编写的.正如提问者意识到的那样,foo? ? bar它不仅仅是多余的 - 它实际上是行不通的,因为foo?评估为true或者false因此总是非空的.)

您有两个很好的选项可以简化:一,您可以用以下内容替换存在二元运算符or:

iframe_width = settings?.iframe?.width? or $iframe_body.width()
Run Code Online (Sandbox Code Playgroud)

第二,你可以抛弃?后来width的多余:

iframe_width = settings?.iframe?.width ? $iframe_body.width()
Run Code Online (Sandbox Code Playgroud)

现在,你可以做到这两点,只有 iframe.width永远不会0(因为0 or xx).如果你能确定,那就去做吧

iframe_width = settings?.iframe?.width or $iframe_body.width()
Run Code Online (Sandbox Code Playgroud)