全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

深入了解JavaScript的逻辑运算符(与、或)

十二月已经过半,冬季是一个美妙的季节,寒冷的空气逼得人们不得不躲在安逸舒适的环境里生活。冬季会给人一种安静祥和的氛围,让人沉浸在其中,仿佛是一个旧的阶段的结束,同时也是一个新的阶段的开始。这么说来,西方和中国的圣诞节和春节都选择在了冬季也不是没有道理,在一年中最寒冷的时候,人们拥簇在温暖的环境里,彼此诉说着过去一年里自己的成就,展望着新的一年里美好的愿望,相互挂念的人团聚,天气的寒冷和人情的温暖形成了强烈的对比。而在天寒地冻之中,仿佛更有利于人们思考,去探寻知识的真谛。

这次想分享的是 JS 当中的逻辑运算符与、或,也就是 && 、 || ,初来乍到的同学们看到这里就会觉得没趣了,这玩意有什么好分享的,刚开始学 JS 的时候不就会了吗,我用了无数遍都没有什么问题啊。而有经验的同学可能会陷入沉思,难不成这其中会有什么奥秘所在?没错,别看这简简单单的几个运算符,虽然这是最基础的知识,但其中隐藏的奥秘却十分耐人寻味,接下来我就为大家一一揭开这简答的运算符背后的奇妙之处。

基础的作用我就不说了,这两个符号是个程序员都能明白,这里首先我想先来说一说 JS 当中的隐式转换。

众所周知,JS 在做逻辑判断的时候会自动将非布尔类型的值进行隐式转换,转换成布尔类型的值然后在进行逻辑运算。在初学 JS 的时候,都会讲到在隐式转换中,除了几个特定的假值,其他的均会转换成真值,这些假值有:

 NaN;
 "";
 undefined;
 null;
 0;

有了这些隐式转换的规则,便构成了 JS 当中逻辑运算的核心基础。

其实在 JS 当中,要说“逻辑运算符”其实并不完全正确,Kyle Simpson 在《You Don't Know JS》系列书当中提到:“与其说是‘逻辑运算符',不如说是‘选择器运算符'。” 为什么大师要这样说呢?其实我们大多数人都被 JS 的表象给蒙蔽了,比如下面一段非常简单的代码:

 if( "hello" && 0 ) {
 console.log(true);
 } else {
 console.log(false);
 }

如果你对 JS 了解的不够深刻,你可能会这样解释这段代码:首先在逻辑判断中,"hello" 是一个真值,0 是一个假值,一个真值和一个假值进行与运算,结果为 false 。这也可能是大多数人的理解,但其实不然,其内部的原理可不止这么简单,因为 && 和 || 返回的并不是判断条件的真假 ,而是判断条件中的一个原始值。它将依次对条件判断中的值进行判断,如果是非布尔值,则转换成布尔值做判断,然后再根据判断条件来决定返回哪一个值。

对于 && :该运算符返回条件语句中的第一个假值,如果所有的值都为真,则返回最后一个值,&& 也被称为 “守护运算符” 。比如下面一段代码:

 var a = "hello" && "world";
 console.log(a); //world
 var b = 0 && 1;
 console.log(b); //0

可以看出,逻辑运算符其实返回的并不是条件的真假,而是原始值。如果条件语句中有多个 && 运算符,则一样遵循以上原则,从左向右依次判断,如果遇到了假值,就返回该假值,如果所有值都为真,则返回最后一个值。

对于 ||:该运算符与 && 运算符相反,它返回条件语句中的第一个真值,如果所有值都为假,则返回最后一个值。比如下面一段代码:

 var a = "hello" || 0;
 console.log(a); //hello
 var b = 0 || NaN;
 console.log(b); //NaN

同样,|| 返回的也不是布尔值。如果有多个 || 则同样遵循相同的原则,从左向右依次扫描。

讲到这里也就来到了本篇文章的核心,在 JS 当中,条件判断语句都是建立在隐式转换之上的,也就是说所谓的逻辑运算符,实际上是在条件判断语句中从左向右依次扫描,如果是一个布尔值,则判断该布尔值的真假,如果是一个非布尔值,则先对该值进行隐式转换,然后再判断真假,如果满足条件,则返回该值,如果没有满足条件值,则返回最后一个值,然后在对返回的这个值做判断,如果是一个布尔值,则直接判断,如果是一个非布尔值,则先隐式转换成布尔值,再做判断。所以我们也可以把 && 称为 “取假运算符” ,把 || 称为 “取真运算符” ,因为这两个运算符的实质都是取条件语句中的第一个真值或者假值,如果始终没有找到,则返回最后一个值。而这样的算法也恰好满足逻辑判断的需求,比如 && 运算符,如果所有的值都是真值,那么返回哪个值其实都无所谓,因为所有值都能够被隐式转化为 true ,而只要有一个假值,则判断条件不成立,所以会返回第一个遇到的假值。而 || 运算符,如果所有的值都是假值,返回任意一个都会被隐式转换成 false ,但只要遇到了一个真值,则判断条件成立,所以会返回第一个遇到的真值。&& 和 || 运算符都是 “短路” 的。

所以我们可以自己实现一个逻辑运算的函数:

// && 等价于:
function AND () {
 for (var i = 0; i < arguments.length; i++) {
 if (!arguments[i]) {
  return arguments[i];
 }
 }
 return arguments[i-1];
}
// || 等价于:
function OR () {
 for (var i = 0; i < arguments.length; i++) {
 if(arguments[i]) {
  return arguments[i];
 }
 }
 return arguments[i-1];
}

(注:在这里我同时也想对 ! 这个运算符做讲解,但考虑到内容和篇幅的问题,暂时不做深入探究,仅做简单讲述。 ! 运算符实际上运行机制与 && 和 || 是一样的,首先会对参数值做判断,如果是一个布尔值,则进行取反运算,如果是一个非布尔值,则先进行隐式转换,再进行取反运算。而我们通常写的 if (something) 语句,实际上的意思 if (!!something))

然后我们可以这样使用:

 var a = ["hello", undefined, "world"];
 console.log(AND.apply(null, a)); //undefined
 var b = ["", 0, NaN];
 console.log(OR.apply(null, b)); //NaN

进而,我们就可以推断出一下结论:

a = x || y;
//等价于:
a = x ? x : y;

a = x && y;
//等价于:
a = x ? y : x;

这通常也是一些压缩工具所做的事情,它们尽可能的将繁杂的条件判断语句转换成 && 或者 || ,因为这样代码更加的精简,但是可读性则就不那么可观了。

对于最开始的那一段代码:

if( "hello" && 0 ) {
 console.log(true);
 } else {
 console.log(false);
 }

我们现在就要这样解释:首先这是个与运算符,与运算符的作用是取第一个假值,如果所有的值都为真,那么则返回最后一个值。所以在这条语句中,第一个值是 "hello" ,因为该值是一个非布尔值,JS 引擎会先将它隐式转换成布尔值,而该值不在假值的范围内,所以会被转化成 true 。随后 JS 引擎会继续查找,第二个值是 0 ,该值同样也不是一个布尔值,所以 JS 引擎也会先将它隐式转换成布尔值,而该值在假值的范围内,所以会被转化成 false ,满足 && 运算符的查找条件,则将值 0 返回。而条件判断语句接受到了值 0 ,该值不是一个布尔类型的值,所以会先对它进行隐式转换,而该值在假值范围内,所以会被转化成 false ,然后控制台会输出 false。

所以说以后当我们看到 && 和 || 时候,就不要仅仅的从字面上的意义去理解了,在看完了这篇文章之后,你就可以很自豪很有底气的对别人说,你真的会用逻辑运算符吗?

好了,就这么两个小玩意居然背后也有着这么多的精髓,看来知识的深度是无穷的,冬季还真是一个能引发人们思考的季节。圣诞节即将到来,在这里提前预祝大家圣诞快乐,Merry Christmas!

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# JavaScript  # 逻辑运算符  # js的逻辑运算符 ||  # js比较和逻辑运算符的介绍  # javascript运算符——逻辑运算符全面解析  # 巧用Javascript的逻辑运算符  # javaScript 逻辑运算符使用技巧整理  # JS逻辑运算符短路操作实例分析  # JavaScript逻辑运算符相关总结  # 一文总结JS中逻辑运算符的特点  # JavaScript逻辑与运算举例详解  # 运算符  # 是一个  # 布尔值  # 第一个  # 隐式  # 都是  # 转换成  # 都为  # 布尔  # 冬季  # 有什么  # 几个  # 我就  # 转化成  # 多个  # 而该  # 我们可以  # 这两个  # 然后再  # 大多数人 


相关文章: 上海网站制作开发公司,上海买房比较好的网站有哪些?  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  建站上市公司网站建设方案与SEO优化服务定制指南  php json中文编码为null的解决办法  如何彻底删除建站之星生成的Banner?  建站之星后台密码遗忘如何找回?  如何在新浪SAE免费搭建个人博客?  黑客如何利用漏洞与弱口令入侵网站服务器?  ppt在线制作免费网站推荐,有什么下载免费的ppt模板网站?  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  如何零基础开发自助建站系统?完整教程解析  如何处理“XML格式不正确”错误 常见XML well-formed问题解决方法  如何用VPS主机快速搭建个人网站?  如何在IIS7上新建站点并设置安全权限?  简历在线制作网站免费版,如何创建个人简历?  湖州网站制作公司有哪些,浙江中蓝新能源公司官网?  文字头像制作网站推荐软件,醒图能自动配文字吗?  如何确保FTP站点访问权限与数据传输安全?  电商网站制作价格怎么算,网上拍卖流程以及规则?  如何用美橙互联一键搭建多站合一网站?  如何通过商城自助建站源码实现零基础高效建站?  建站之星代理如何优化在线客服效率?  深圳网站制作的公司有哪些,dido官方网站?  网站建设制作需要多少钱费用,自己做一个网站要多少钱,模板一般多少钱?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  相册网站制作软件,图片上的网址怎么复制?  如何通过西部数码建站助手快速创建专业网站?  网站制作培训多少钱一个月,网站优化seo培训课程有哪些?  如何快速打造个性化非模板自助建站?  免费视频制作网站,更新又快又好的免费电影网站?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  ,有什么在线背英语单词效率比较高的网站?  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  如何选择美橙互联多站合一建站方案?  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  导航网站建站方案与优化指南:一站式高效搭建技巧解析  定制建站方案优化指南:企业官网开发与建站费用解析  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何撰写建站申请书?关键要点有哪些?  常州自助建站费用包含哪些项目?  Swift中swift中的switch 语句  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  微课制作网站有哪些,微课网怎么进?  如何自定义建站之星模板颜色并下载新样式?  极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?  香港服务器WordPress建站指南:SEO优化与高效部署策略  佛山企业网站制作公司有哪些,沟通100网上服务官网?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  ,制作一个手机app网站要多少钱?  如何在IIS中新建站点并配置端口与IP地址? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。