当前位置: 首页 > Web前端 > HTML

浅谈逻辑运算符&&(与)和--(or)

时间:2023-04-02 22:40:31 HTML

我有一群奇怪的朋友,他们总是问我一些奇怪的问题。昨天有个叫周胖子的朋友(姓周因为崇拜某国领袖加上个人特点,外号三胖⊙﹏⊙)给我发了这样一张图:兄弟,上面几句话是什么意思?嘿!三个胖子生活贫困。我不会!大哥,真不知道怎么弄,求指点?%#@!#¥&.....经过三胖的苦逼、死缠烂打、威逼利诱,我终于沦陷在三胖的花言巧语和甜言蜜语中。我balabala.....吃瓜群众:吃完瓜,你们什么时候进入正题?====================================================================================================================================================================,我写了下面的代码functionfoo(){vara=1; varb=2;变量c=假;  vard=true;console.log(c||(a=1111),"此时a的值:",a);console.log(d||(b=2222),"此时b的值:",b); foo();马?那么,浏览器输出以下为什么???和缓慢。让我们再次修改foo函数: functionfoo(){vara=1; varb=2;  varc=false;变量d=真; console.log(c&&(a=1111),"此时a的值:",a);console.log(d&&(b=2222),"此时b的值:",b); } foo();然后我们会在浏览器中看到如下内容:ok,我们进入解释部分:&&和||operators在JavaScript中,我比较喜欢用初中物理的电功率的并联和串联,||&&运算符相当于一个并联电路如图所示,&&运算符用于串联。鉴于历史悠久,又是文科出身转工科的老人,我就不向理工科高手介绍什么是串并联了。三胖:你明明不知道怎么做!走走走,拿着饭盒,赶紧回公司拿代码!咳咳,继续。||运算符会先判断第一个操作数。如果第一个为真,则直接返回第一个操作数的判断结果,不会对第二个操作数进行判断。如果one为false值,则判断第二个操作数并对第二个操作数进行运算,然后返回执行运算判断值。所以对于||的描述,我们可以用代码这样安排:第一个操作数||第二个操作数代码解释:  if(第一个操作数){return第一个操作数; }else{返回第二个操作数;}进一步将上面的解释应用到c||(a=1111)infoo:if(c){returnc; }else{return(a=1111);      //直接在浏览器中这样写会报错,建议计算先取回返回值}同理,应用d||(b=2222)是if(d){returnd; }else{return(b=2222);      //直接在浏览器中这样写会报错,建议先计算再取回返回值}这样就会返回上面的结果。||运算符在我们处理事件兼容性的时候被广泛使用,比如:e=e||事件;这里使用的idea是这样的idea,如果e为false或者undefined,event就会赋值给e。同时,除了事件中的应用,我们还将其应用到函数的参数传递中,例如:functiontest(a){a=a||111;控制台日志(一);}使用this为函数参数指定默认参数,但这样做实际上是不安全的。比如我在调用test函数时,传入一个实参""(空串)或者实参为0,这时候浏览器会在浏览器中输出""(空串)而0等很多false值进行隐式类型转换,所以简单的做这样的判断是不严谨和不安全的,所以建议大家少用,这是一个知识点。三胖:不要'废话少说,盒饭都快吃完了还说这么多?我:格悟恩……各位读者别走,我们继续(笑脸)。&&运算符恰好与||相反,如果第一个操作数为真,则进行第二个操作数的判断操作,首先会对第二个操作数进行运算,得到第二个操作数的返回值,其次是第二个操作数的返回值。如果第一个操作数为false,则进入第二个操作数的判断,直接返回false。三胖:不然怎么办,我要晕了。我:ko,我们继续。按照||的套路操作员。我们继续把&&符号转换成半码半汉字:Operand1&&Operand2transformation:    if(firstoperand){returnsecondoperand;  }else{返回false;}继续应用上面的c&&(a=1111):  if(c){return(a=1111);          //直接在浏览器中这样写会报错,建议先计算再取出返回值}else{returnfalse;}同样d&&(b=2222)解释如下if(d){return(b=2222);          //浏览这里如果设备直接这样写,会报错。建议先计算再取出返回值}else{returnfalse;}输出结果如上。三胖:嗯。(思考脸)&&运算符一般用来判断一个对象下是否有某个属性。比如我有下面的代码varlist={obj:{},array:[1,2,3,4,5]}当我不确定这个数组是不是list下的一个属性时,我们通常写  if(list.hasOwnProperty("array")){//dosomething}else{//dosomething}结合&&我们可以这样写:list.hasOwnProperty("array")&&dosomething比较上面两种写法,很明显第二种写法在代码简洁性上胜出,但是在代码可读性上,两种写法都可以。看个人习惯,我个人更喜欢第二种写法。我:三胖,回答我一个问题,回答完就可以签到下班了,你知道逻辑运算符之间的优先级吗?三胖:不知道。我:格悟恩……三胖子:原来如此(笑脸)。放下,学生证。o(╯□╰)o回来,你回来找我。算了,评委们,我们继续。现在有如下代码: a="hello";b=假;c=假;console.log(a||b&&c)大家猜猜又会输出什么。按照正常的从右到左的逻辑思路,我们先得到一个||的值b,然后我们和c进行&&运算,最后会输出false。然而,事与愿违。浏览器最终输出----你好。这反映了逻辑运算符之间的优先级关系。事实上,浏览器在解析操作时会这样做:一个||(b&&c)是先获取b&&c的值,然后结合执行||操作,最后返回结果。这意味着||在执行逻辑运算时,运算符的优先级低于&&运算符。不过不建议大家这样写。这样会导致逻辑关系不清晰,代码可读性差。因此,读者在写这样的代码时最好加上一个()(手动滑稽)。以上就是这篇关于逻辑运算符的随笔。如果有什么不对的地方,请指出。文中我和三胖的日常生活大部分是剧情需要虚构的,如有雷同纯属巧合,语言风格不搞笑轻松。我是从北到南,游上岸的一条咸鱼。我的目标是翻身继续晒太阳。博客园首发地址http://www.cnblogs.com/blog-i...