js中的逻辑运算符详解(||、&&、!)
视频地址:https://www.bilibili.com/video/BV1Y7411K7zz?p=1
一直以来都没弄清楚js中的逻辑运算符是怎么回事 , 一直都以为他们的用法和java一样 , 今天才发觉以前的认知是错误的。因为js中不光可以处理false或true类型的,同时返回的值也不一定是true或false,他们的结果可以是任意类型。
Js中的逻辑运算符
JavaScript中有三个逻辑运算符,&&与、||或、!非,虽然他们被称为逻辑运算符,但这些运算符却可以被应用于任意类型的值而不仅仅是布尔值,他们的结果也同样可以是任意类型。
描述
如果一个值可以被转换为true,那么这个值就是所谓的truthy,如果可以被转换为false,那么这个值就是所谓的falsy。会被转换为false的表达式有: null、NaN、0、空字符串、undefined。
尽管&&和||运算符能够使用非布尔值的操作数,但它们依然可以被看作是布尔操作符,因为它们的返回值总是能够被转换为布尔值,如果要显式地将它们的返回值或者表达式转换为布尔值,可以使用双重非运算符即!!或者Boolean构造函数。
- &&: AND,逻辑与,expr1 && expr2,若expr1可转换为true则返回expr2,否则返回expr1。
- ||: OR,逻辑或,expr1 || expr2,若expr1可转换为true则返回expr1,否则返回expr2。
- !: NOT,逻辑非,!expr,若expr可转换为true则返回false,否则返回true。
短路计算
由于逻辑表达式的运算顺序是从左到右,是适用于短路计算的规则的,短路意味着下面表达式中的expr部分不会被执行,因此expr的任何副作用都不会生效。造成这种现象的原因是,整个表达式的值在第一个操作数被计算后已经确定了。
- (some falsy expression) && (expr)短路计算的结果为假。
- (some truthy expression) || (expr)短路计算的结果为真。
强制转换类型
使用双重非运算符能够显式地将任意值强制转换为其对应的布尔值,这种转换是基于被转换值的truthyness和falsyness的。
console.log(!!true); // true
console.log(!!{}); // true // 任何对象都是truthy的
console.log(!!(new Boolean(false))); // true // 此为对象而不是字面量
console.log(!!false); // false
console.log(!!""); // false
console.log(!!Boolean(false)); // false // 调用构造函数生成字面量
演示示例
/* javascript中除了以下这些之外,其余都为真:
* 0、""、null、false、undefined、NaN
*/
//逻辑与(&&)算法:
//如果第一个为true , 则返回第二个值
//如果第一个为false, 则返回false
alert('=============================&&=============================');
alert(true && false); //-->false
alert(false && true); //-->false
alert(true && 'aaa'); //-->aaa
alert('aaa' && true); //-->true
alert(false && 'aaa'); //-->false
alert('aaa' && false); //-->false
alert('aaa' && 'bbb'); //-->bbb
alert(null && 'aaa'); //-->null
alert('aaa' && undefined); //-->''
alert('aaa' && ''); //-->''
alert('aaa' && NaN); //-->NaN
//逻辑或(||)算法:
//如果第一个为true , 则true
//如果第一个为false, 则返回第二个值
alert('=============================||=============================');
alert(true || false); //-->true
alert(false || true); //-->true
alert(true || 'aaa'); //-->true
alert('aaa' || true); //-->aaa
alert(false || 'aaa'); //-->aaa
alert('aaa' || false); //-->aaa
alert('aaa' || 'bbb'); //-->aaa
alert(null || 'aaa'); //-->aaa
alert('aaa' || undefined); //aaa
alert('aaa' || ''); //-->aaa
alert('aaa' || NaN); //-->aaa
//逻辑非( ! )算法:
//将值转换为boolean值,类似于parseBoolean()操作(注意:说的是类似哦,事实上js并没有parseBoolean方法哈)
alert('=============================!=============================');
alert(! 'aaa'); //-->false
alert(!! 'aaa'); //-->true
alert(! NaN); //-->true
alert(!! ''); //-->false
js中的逻辑运算符详解(||、&&、!)的更多相关文章
- JS中this关键字详解
本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 阅读此文章,还需要心平气和的阅读完,相信一定会有所收获,我也会不定期的发布,分享一些文章,共同学习 首先,必须搞清楚在JS里面,函数 ...
- JS 中 this 关键字详解
本文主要解释在JS里面this关键字的指向问题(在浏览器环境下). 首先,必须搞清楚在JS里面,函数的几种调用方式: 普通函数调用 作为方法来调用 作为构造函数来调用 使用apply/call方法来调 ...
- Bom和Dom编程以及js中prototype的详解
一.Bom编程: 1.事件练习: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "h ...
- JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解
前 言 JRedu 学过程序语言的都知道,我们的程序语言进化是从"面向机器".到"面向过程".再到"面向对象"一步步的发展而来.类似于 ...
- JS中navigator对象详解
<code class="language-html"><!doctype html> <html> <head> <meta ...
- js中Date()对象详解
var myDate = new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-???? ...
- js中window对象详解以及页面跳转
1.window.top.window.location = "index.asp"; 2.window.top.location.href="index.asp&quo ...
- node.js中express-session配置项详解
官方地址:https://www.npmjs.com/package/express-session 作用:用指定的参数创建一个session中间件,sesison数据不是保存在cookie中,仅仅s ...
- js中的三目运算符详解
判断 javascript中的三目运算符用作判断时,基本语法为: expression ? sentence1 : sentence2 当expression的值为真时执行sentence1,否则执行 ...
随机推荐
- 解决Github下载仓库慢的正确姿势
上个月刚安装了 Manjaro ,然后最近在Manjaro下载Github的项目竟然只有几十b/s,这能忍?对于下载Github上的代码是硬需求,没办法直接探索一下突破的方法了. 方法一:安装chro ...
- UML第二次结对作业
|作业要求|https://edu.cnblogs.com/campus/fzzcxy/2018SE1/homework/11250| | ---------- | ----------------- ...
- Logstash学习之路(四)使用Logstash将mysql数据导入elasticsearch(单表同步、多表同步、全量同步、增量同步)
一.使用Logstash将mysql数据导入elasticsearch 1.在mysql中准备数据: mysql> show tables; +----------------+ | Table ...
- 5款极简极美WordPress主题,亲测可用附送源码
2020年深冬,新闻上报道是.从1950年以来最寒冷的冬天. 一个周六的下午,我找遍了全网的简约博客主题,搭建了三年来的第7个独立博客, 多么难得的周末啊,我却在家花了一整天的时间.整理出直接套用5️ ...
- PHP 导出到Excel表格中
/** * 导出excel * @throws \PHPExcel_Exception * @throws \PHPExcel_Reader_Exception * @throws \PHPExcel ...
- 利用github给国外文件下载加速
前言 作为一名程序员,经常需要下载一些编程相关的环境,而国内的网络环境大家都知道,有的文件用浏览器是下载不动的,于是我有了利用github下载文件的想法. 我的demo项目地址:https://git ...
- 【Java基础】常用类
常用类 字符串相关的类 String类:代表字符串,使用一对 "" 引起来表示. public final class String implements java.io.Seri ...
- Openstack Ocata 负载均衡安装(二)
Openstack OCATA 负载节点(二) 安装haproxy: apt install haproxy 配置haproxy: vim /etc/haproxy/haproxy.cfg globa ...
- Java Mybatis快速入门之基本使用
目录 搭建环境 编写 Mybatis 核心配置文件 pom导出资源失败 测试 搭建环境 新建Maven项目 导入Maven依赖 <dependencies> <!--mysql驱动- ...
- Mongodb 安装和副本集集群搭建
通用步骤,适用于所有你需要用的软件. 总结为5大步骤: 找到官网-->下载包-->解压-->修改配置-->启动 不懂的,首选官网api,次选百度 1.安装mongodb mon ...