JS 的&&和||在语句中的用法请教

2018-03-25 09:28:18 +08:00
 Daoma

##最近正在学 JS,找了点练习来做,然后看到如下的代码:
for (var i = 0; i < oBtn.length; i++)
{
oBtn[i].index = i;
oBtn[i].onclick = function ()
{
this.index == oBtn.length - 1 && (oDiv.style.cssText = "");
changeStyle(oDiv, oAtt[this.index], oVal[this.index]);
}
}
然后我上网搜了一下明白了 var c=a||b;这种情况时
a && b :如果执行 a 后返回 true,则执行 b 并返回 b 的值;如果执行 a 后返回 false,则整个表达式返回 a 的值,b 不执行。和
a || b :如果执行 a 后返回 true,则整个表达式返回 a 的值,b 不执行;如果执行 a 后返回 false,则执行 b 并返回 b 的值。

但还是不明白这句 this.index == oBtn.length - 1 && (oDiv.style.cssText = "");怎么操作的 index ???萌新望大佬解答

8348 次点击
所在节点    JavaScript
57 条回复
wee911
2018-03-25 20:06:32 +08:00
这种代码人见人恨,一行代码做两件事情,你是爽,其他都不爽
noe132
2018-03-25 20:44:08 +08:00
写这种代码的人会被下一个接手的维护者掘地三尺
codehz
2018-03-25 21:23:21 +08:00
其实||这种还是可以理解的(如果用于 null 判断,毕竟 js 没有二元的?:/??运算符
kotokz
2018-03-25 21:42:12 +08:00
short circuit 这种写法能避免尽量避免吧
多少会导致 cpu 没办法做 branch prediction 优化,从而影响效率
不是一个好的编程习惯
kingwl
2018-03-25 21:45:40 +08:00
你们是不是对炫技有什么误解?
weixiangzhe
2018-03-25 21:47:19 +08:00
我接触的前端 大都这样写啊
shisang
2018-03-25 22:01:01 +08:00
正常写法啊,这有什么不好理解的
tomychen
2018-03-25 22:41:53 +08:00
同感,很不喜欢这种写法,不是看不明白,而是看到一半的时候要停下来思考一下这是啥意思的时候,那种不连续感,是极其不舒服的。

而不是所有人都喜欢这种表示法的。
Hsinchu
2018-03-26 01:48:00 +08:00
我只说一下我写这种代码的场景。var a = b || {},把 b 赋值给 a 但如果 b 为空值 a 赋值为一个空对象,var a = b && b.data,把 b 的属性 data 赋值给 a,但 b 可能为 undefined。这两个场景下这样写可以少写一个几乎没实际意义的 if 语句,我也只在这两种场景下使用&&和||的这个特殊用法,没有炫技成分,就是很实在的减少代码长度。
congeec
2018-03-26 02:26:22 +08:00
楼上有几个写过 shell 的?我还以为搞前端的学了 node.js ,会顺带学一下 shell 啥的呢
Mutoo
2018-03-26 07:54:27 +08:00
举一个栗子

function example(options /*optional*/ ) {
let paramOne = options && options.p1 || "default";
...

这里 options 为可选参数对象,p1 为可选参数,"default" 为默认值
witcherhope
2018-03-26 08:03:30 +08:00
这种用法还是蛮常见的,写 React 组件时候用这个进行短路渲染因为 JSX 不支持 if/else 写法
uolcano
2018-03-26 08:12:26 +08:00
@codehz js 里有?: 的,再查查 cheatsheet 吧
weixiangzhe
2018-03-26 08:43:03 +08:00
所以最新的草案里有
var a = b?.c
这种写法了
KuroNekoFan
2018-03-26 09:32:20 +08:00
这种算是表达式,有的地方会有用,比如 jsx 里面
faceRollingKB
2018-03-26 09:34:59 +08:00
我懒,所以经常这么写,比如 this.dispose && this.dispose(),清晰明了
baixiangcpp
2018-03-26 09:58:37 +08:00
短路求值成了炫技了,我也是服了
scofieldpeng
2018-03-26 10:08:51 +08:00
楼上那些说炫技的,我真的快笑死了,这种最常见的写法难道一样写一堆 if else ?
royzxq
2018-03-26 10:12:10 +08:00
是不是对炫技有什么误解。
codehz
2018-03-26 10:30:34 +08:00
@uolcano #33 没有二元?: 就是 gcc 扩展里那种 a ?: b 的写法

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/441152

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX