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

8971 次点击
所在节点    JavaScript
57 条回复
LeungJZ
2018-03-26 10:35:38 +08:00
楼上说炫技的,估计不是写前端的吧??

data.errors = data.unusual ? data.unusual.map(error => ({
type: errorTypes[error.unusualType],
record: error['unusualRecord'],
time: error['unusualTime']
})) : []

难道我每次都要用 if else 去校验存在不存在????
LeungJZ
2018-03-26 10:42:13 +08:00
@Daoma
a && b 的意思是,先执行 a 语句,如果执行结果不是假值(不一定必须是 true ),则执行 b 并返回 b 的执行结果。
多数用于判断 a 是否存在,并执行 b 语句。如根据是否传入回调来判断是否需要执行回调:
function(cb => {
// do sth.
cb && cb(result)
})
a || b 的意思是,先执行 a 语句,如果执行结果不是假值(不一定必须是 true ),则直接返回。否则,则执行 b 并返回 b 的执行结果。
以前多数用来判断是否传参,是否使用默认值。
function (one, two) {
one = one || 'one'
two = two || 'two'
}
uolcano
2018-03-26 11:26:41 +08:00
codehz
2018-03-26 11:40:57 +08:00
@uolcano #43 所以你是没看二元这个词吗,用三元运算符要表达同样的意思就得 a ? a : b 不仅看着长而且如果 a 是一个有副作用的求值表达式就会出问题
GabrielChen
2018-03-26 12:36:19 +08:00
这样设置默认值也有 falsy 值问题,这样写比较好
ES6:
```
function fn(opts = {}) {
// ...
}
```

ES5:
```
function fn(opts ) {
opts = (typeof opts !== 'undefined') ? opts : {};
//..
}
```
GabrielChen
2018-03-26 12:42:27 +08:00
如果执行 a 后返回 false,则整个表达式返回 a 的值,b 不执行。
应该为如果执行 a 后返回假值,则整个表达式返回 a 的值,b 不执行,所以用来做默认参数是不安全的

```
var a=undefined ,b=true ; a&&b;
//=>undefined
var a=null,b=true ; a&&b;
//=>null
var a=0,b=true ; a&&b;
//=>0
var a="",b=true ; a&&b;
//=>""
var a=false,b=true ; a&&b;
//=>false
var a="1",b=true ; a&&b;
//=>true
var a=1,b=true ; a&&b;
//=>true

```
uolcano
2018-03-26 12:44:40 +08:00
@codehz ?:在语言标准里,不都是三元的么?我是直接忽略了你说的“二元”。你说的 gcc 和 js 本就没有可比性,?: 二元是哪个语言的标准,还是插件支持?比较也要将基本法吧。
wangcheng
2018-03-26 12:47:38 +08:00
不要写这样的代码,别人看了会骂的。反正最后要 uglify,何必呢?
codehz
2018-03-26 13:27:40 +08:00
@uolcano #47 都是 C-like 语言,有何不可比较的? 二元 ?: 是 GCC 和 clang 支持的扩展,好多项目里都有使用,目的就是提供类似 Csharp 的那种??的语法(以及单次求值的特性) https://gcc.gnu.org/onlinedocs/gcc-5.3.0/gcc/Conditionals.html 我只是随口提了一下,你要较真就看这个链接吧
SimbaPeng
2018-03-26 14:00:31 +08:00
写个短路求值就要被骂了?还傻逼写法?真是笑喷。最近爬微信公众号的文章,微信 web 端的 js 代码全是这种写法,某些人没那个实力还喜欢喷人装逼,真是醉了。。。
SimbaPeng
2018-03-26 14:01:40 +08:00
一个成语能搞定的事情,非要别人用一段话来描述,到底是谁的问题?
AV1
2018-03-26 14:21:02 +08:00
知道 JAVA 语法为何啰嗦冗长么?就是因为想加一点方便的语法就被喷成炫技。
说好的,谁在 JAVA 用 lambda 和 var 谁是小狗。
grewer
2018-03-26 15:47:38 +08:00
这也算炫技? 前端工作 1,2 年后只能算基础写法吧
当然 && 这种 1 行最多一个,不然可读性太差
duzhihao
2018-03-26 16:59:16 +08:00
我也不理解为什么这么写是"炫技",自从用了 react 感觉三元表达式和一元表达式太好用了。阅读起来也没什么障碍
imn1
2018-03-26 17:07:08 +08:00
其实,我不太明白这问题跟&&||有啥关系
h1367500190
2018-03-26 17:14:56 +08:00
其它语言中 a ?: b 是正常的写法,到了 JS 里 a || b 就成了炫技,也是佩服一些人的思维
zhengxiaowai
2018-03-27 10:13:05 +08:00
JS 中 || 和 && 还算常用,但是有人和我炫 !!'' 我也是比较无语的

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

https://ex.noerr.eu.org/t/441152

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

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

© 2021 V2EX