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 ???萌新望大佬解答

8332 次点击
所在节点    JavaScript
57 条回复
whileFalse
2018-03-25 09:33:09 +08:00
这种炫技代码是需要被狠狠修理的。
aa6563679
2018-03-25 09:37:11 +08:00
js 其实不管什么东西都能往判断语句里塞。那段代码等同与 if(this.index == oBtn.length - 1){
oDiv.style.cssText = "";
}
Daoma
2018-03-25 09:50:43 +08:00
@aa6563679 噢噢,我明白了!
Daoma
2018-03-25 09:51:53 +08:00
@whileFalse 刚刚搞懂了。。。这种写法除了图省事炫技外有弊端吗?
DOLLOR
2018-03-25 10:01:07 +08:00
短路求值
gam2046
2018-03-25 10:16:36 +08:00
反正我觉得这样的写法并不好,除了提升逼格,毫无意义。因为令人更难理解了。常见的写法还有

foo = a || b

a 和 b 都是一个对象,表达的意思就是
if( typeof(a) == "undefined"){
foo = b
}else{
foo = a
}

也就是说 b 是一定兜底的值,确保 foo 一定被定义了。

反正自己觉得动态语言真的是写的一时爽,重构火葬场。
crysislinux
2018-03-25 10:18:54 +08:00
弊端就是会挨打
lihongjie0209
2018-03-25 10:32:26 +08:00
傻逼写法, 不可取
mywaiting
2018-03-25 10:35:49 +08:00
&& 相当于 and, || 相当于 or 这样理解就可以了~
Pastsong
2018-03-25 10:40:36 +08:00
var a = b && c || d ? e : f
we2ex
2018-03-25 11:02:55 +08:00
|| 在 ES6 之前经常被作为实现默认参数的 tricky 手段
vegito2002
2018-03-25 11:56:19 +08:00
short circuit. 严格来说并不算是炫技了. 上 OS 的时候的 Pintos 系统的源码里面就有这种写法.
vegito2002
2018-03-25 11:57:35 +08:00
至于赋值语句直接当成 boolean 来用这个的话, 除了 C 以外的语言确实推荐少用, 是容易被喷.
watzds
2018-03-25 12:36:20 +08:00
|| 在其他语言里也差不多啊,不就是前面不满足就用后面嘛,只是其他语言里要求 bool
xjp
2018-03-25 12:42:10 +08:00
&& || 返回的值并不是 boolean
codermagefox
2018-03-25 13:42:25 +08:00
@gam2046 说&&炫技我资磁,但是||咋就炫技了?
不用这个,如何确保自己传值的时候每个字段名都有缺省值?
raawaa
2018-03-25 14:12:12 +08:00
|| 不算啥,&& 才比较绕。
第一次见到 return a && b 的时候我是懵逼的。
不过弄懂了之后其实也很简单。
raawaa
2018-03-25 14:14:15 +08:00
其实很简单啊。
|| 是如果前面的结果是 true,就不运行后面的了。
&& 是如果前面的结果是 false,就不运行后面的了。
许多语言的 boolean 运算不都是这样的嘛。
lihongjie0209
2018-03-25 18:27:19 +08:00
@raawaa #18 真的简单的话就不需要你去弄懂了, 也不需要你去解释给我们听了
SoloCompany
2018-03-25 18:54:21 +08:00
只要写过 shell 脚本的根本不会存在理解门槛

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

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

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

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

© 2021 V2EX