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的性质,因为我认为这是多余的与?两个表达式之间的操作.这看起来是否正确?
(注意:这个答案是在问题更新之前编写的.正如提问者意识到的那样,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 x是x).如果你能确定,那就去做吧
iframe_width = settings?.iframe?.width or $iframe_body.width()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
780 次 |
| 最近记录: |