前端-JavaScript2-5——JavaScript之运算符进阶
运算符(Operators,也翻译为操作符),是发起运算的最简单形式。
运算符的分类见仁见智,我们的课程对运算符进行如下分类:
数学运算符(Arithmetic operators)
比较运算符(Comparison operators)
逻辑运算符(Logical operators)
赋值运算符(Assignment operators)
按位运算符(Bitwise operators)
条件 (三元) 运算符(Conditional operator)
3.1 数学运算符
+ - * / % ()
■ 这里面要知道%的意思,我们昨天已经算过很多了,不赘述。
■ 要知道计算顺序,先乘除求余,然后加减,我们昨天已经算过很多了,不赘述。
■ 隐式转换,所有带有字符串的运算都会尽可能的转为数字进行计算,加号比较特殊。
数学运算符的正统,是number和number的数学运算,结果是number。出于面试的考虑,有一些奇奇怪怪的数学运算:
数学运算中,只有纯字符串、布尔值、null能够帮你进行隐式转换:
|
1 //隐式转换:就是没有写parseInt()、parseFloat()自己帮你转格式 2 3 console.log(3 * "8"); //24 4 console.log("3" * "8"); //24 5 console.log("48" / "2"); //24 6 console.log("24" % 55); //24 |
|
1 console.log(3 * null); //0 隐式转换的时候null将被转为0 2 console.log(3 * false); //0 隐式转换的时候false将被转为0 3 console.log(3 * true); //3 隐式转换的时候true将被转为1 |
不纯的字符串和undefined是不能帮你进行隐式转换的,结果都是NaN
|
1 console.log(3 * "8天"); //NaN 数学运算中,不纯的字符串没法隐式转换 2 console.log(3 * undefined); //NaN 数学运算中,undefined不能进行隐式转换 |
加法比较特殊,因为+同时是加法和连字符的符号,所以加法在面对字符串的时候没有隐式转换
|
1 //加法没有隐式转换 2 console.log(3 + "8"); //38 3 console.log(3 + undefined); //NaN 4 console.log(3 + null); //3 5 console.log(3 + false); //3 6 console.log(3 + true); //4 |
总结:
无论哪种运算,只要出现了undefined参与运算,结果都是NaN。
然后"4"、false、true、null都能进行隐式转换。
加号比较特殊,面对"4"没有隐式转换的
特殊数值的计算,就是NaN、Infinity参与的运算,我们看《高3》来学习。
我们就举几个例子:
|
1 Infinity + 1000 //Infinity 2 Infinity - 1000 //Infinity 3 Infinity / 1000 //Infinity 4 Infinity - Infinity //NaN 5 Infinity /Infinity //NaN 6 Infinity * Infinity //Infinity 7 0 / 0 //NaN 8 6 / 0 //Infinity 9 NaN / 8 //NaN |
//隐式转换:就是没有写parseInt()、parseFloat()自己帮你转格式
// console.log(3 * "8"); //24
// console.log("3" * "8"); //24
// console.log("48" / "2"); //24
// console.log("24" % 55); //24 // console.log(3 * null); //0 隐式转换的时候null将被转为0
// console.log(3 * false); //0 隐式转换的时候false将被转为0
// console.log(3 * true); //3 隐式转换的时候true将被转为1 // console.log(3 * "8天"); //NaN 数学运算中,不纯的字符串没法隐式转换
// console.log(3 * undefined); //NaN 数学运算中,undefined不能进行隐式转换 // //加法没有隐式转换
console.log(3 + "8"); //
console.log(3 + undefined); //NaN
console.log(3 + null); //
console.log(3 + false); //
console.log(3 + true); //
3.2 关系运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
== 等于
!= 不等于
=== 全等于
!== 不全等
关系运算符的正统,number和number进行数学运算,得到的答案boolean。
|
1 console.log(8 > 5); 2 console.log(7 < 4); |
关系运算的结果,是boolean类型的。
true和false叫做布尔值。boolean类型,boolean类型只有两个值,就是true和false。表示真、假。
== 我们叫做“相等判断”,它会帮你进行一个隐式转换,尽可能的得到true的答案:
|
1 console.log(5 == "5"); //true |
===我们叫做“全等判断”,不仅仅比较数值是否相等,还比较类型是否相等
!= 是==的反面,如果==运算是true,那么!=就是false
!==是===的反面,如果===运算是true,那么!==就是false
|
1 2 |
正统的运算讲完了,number和number进行关系运算,结果是boolean。
现在我们讲一丢丢不正统的关系运算,为了面试,划一下重点,更多的自己通过《高三》P50、P51、P52:
① string 和 string 也能够进行关系运算,比较的就是字符编码顺序。
字符编码顺序,就是数字、大写字母、小写字母
|
1 2 3 4 5 6 |
② 与数字进行关系运算时,纯数字字符串被转为数字,null转换为0,true转换转为1, false转换为0
null不能进行和0的相等判定
|
1 2 3 4 5 |
③ NaN不等于自己,不全等于自己
|
1 2 3 4 |
④ string 和 number比,string会被隐式转换为number
|
1 |
需要注意的是,我们已经了解了一些不正统的运算,所以不要出洋相,不能连续使用关系运算符!!
比如我们想验证3大于2,2大于1:
表达式:
|
1 |
的值是多少?
解:原式=(3>2)
>1 = true > 1 = false
(因为true会被当做1来与1进行比较)
也就是说,不能连续使用关系运算符!!因为一旦连续使用了,实际上还是从左至右计算,所以就有上一步的boolean参与了下一步的运算。
剧透一下,如果想要使用连续关系运算,1<2 &&
2<3
// console.log(8 > 5); //true
// console.log(7 < 4); //false
// console.log(9 >= 8); //true
// console.log(9 >= 9); //true
// console.log(5 <= 9); //true
// console.log(5 <= 5); //true
// console.log(5 <= 4); //false //==表示相等,会帮你进行隐式转换
// console.log(5 == 8); //false
// console.log(5 == 5); //true
// console.log(5 == "5"); //true
// console.log("5" == 5); //true //===表示全等,不仅仅比较数值是否相等,还比较类型是否相等
// console.log(5 === 5); //true
// console.log(5 === "5"); //false
// console.log("5" === 5); //false // != 和 !==
console.log(5 != 6); //true
console.log(5 != "5"); //false , 脑子要反着想一下,5=="5"结果是t,所以就是f
console.log(5 !== "5"); //true , 脑子要反着想一下,5==="5"结果是f,所以就是t
3.3 逻辑运算符
逻辑运算符就三个:
&& 逻辑与运算
|| 逻辑或运算
! 逻辑非运算
正统来说,参与逻辑运算的是boolean和boolean,得到的结果也是boolean
值按照真值表来定
&& 逻辑与,“且”
|
a && b |
||
|
a |
b |
结果 |
|
真 |
真 |
真 |
|
真 |
假 |
假 |
|
假 |
真 |
假 |
|
假 |
假 |
假 |
“都真才真”,“有假就假”。
命题1:“地球是圆的” 真的
命题2:“宋仲基很帅” 真的
命题1 且 命题2 真的
命题1:“1+1=3” 假的
命题2:“地球是方的” 假的
命题1 且 命题2 假的
|
1 2 3 4 5 |
|| 逻辑或,“或者”的意思
|
a || b |
||
|
a |
b |
结果 |
|
真 |
真 |
真 |
|
真 |
假 |
真 |
|
假 |
真 |
真 |
|
假 |
假 |
假 |
“有真就真”,“都假才假”
命题1: 1 + 1 = 2
命题2:“邵老师很帅”
命题1 或者 命题2 总结果是真
|
1 2 3 4 |
!就是“逻辑非”,相反的
|
1 2 3 |
运算顺序是非、与、或
|
1 |
解:原式 = true
|| false && false || false
= true || false || false
= true || false
= true
逻辑运算符最最有意思的事情,就是所谓的“短路语法”。
就是你发现没有,
如果计算一个且运算的时候,比如a
&& b,a如果就是一个false,那么就不会管b是什么,直接输出false就行了,等于说直接输出a。
如果计算一个且运算的时候,比如 a
&& b ,a如果就是一个true,那么也不用管b是什么,直接把b当做结果输出就行了。
也就是说,本质上计算机进行a&&b运算的时候,不是在进行逻辑分析,这小子就想着要么扔a,要么扔b。如果a是负性的,那么直接扔出a;如果a是正性的,直接扔出b。
—— 短路语法。 要么a被短路,要么b被短路。
负性的:false,null, 0, NaN, 空字符串(""),undefined
正性的:除了上面的,全是正性的。
|
1 2 3 4 5 6 7 8 |
|| 逻辑或的短路也是类似的,a||b
计算机发现a是真,那么扔a;如果a是假,那么扔b
|
1 2 3 4 |
|
1 |
解:原式 = 88 ||
66 || 55
= 88 || 55
= 88
|
1 |
解: 原式 = undefined
&& false || NaN && null
= undefined || NaN
&& null
= undefined || NaN
= NaN
总结一下短路语法:
a&&b,
计算机要么执行a要么执行b。a真执行b,a假执行a;
a||b,
计算机要么执行a要么执行b。a真执行a,a假执行b。
千万不要背,从真值表中自己推倒。
console.log(true && true); //t
console.log(true && false); //f
console.log(false && true); //f
console.log(false && false); //f console.log(true || true); //t
console.log(true || false); //t
console.log(false || true); //t
console.log(false || false); //f console.log(!true); //f
console.log(!false); //t
console.log(!!!!!!!!!false); //t 运算顺序是非、与、或
var a = true || false && !true || false;
console.log(a);
3.4 赋值运算符
= 赋值
+= 简便写法
-= 简便写法
*= 简便写法
/= 简便写法
%= 简便写法
++
--
赋值运算的参与者,一定是变量。
|
1 var a = 1; 2 a += 2; //这行语句等价于a = a + 2; 3 console.log(a); //3 |
|
1 var b = 6; 2 b /= 3; //等价于b = b / 3 3 console.log(b); //2 |
|
1 var c = 100; 2 c %= 10; //等价于c = c % 10; 3 console.log(c); //0 |
|
1 var a = "我"; 2 a += "爱"; 3 a += "你"; 4 console.log(a); |
++运算符:
|
1 var e = 10; 2 e++; //等价于e=e+1 3 console.log(e); //11 |
++可以与输出语句写在一起,++写在变量前和写在变量后不是一个意思
a++ : 先用a的原值,然后a加1;
++a :先给a加1,然后用a的新值
|
1 var f = 10; 2 console.log(f++); //10 ,先引用原值,然后加1 |
等价于:
|
1 //等价于 2 var f= 10; 3 console.log(f); //先输出f 4 f++; //然后f加1 |
|
1 var g = 10; 2 console.log(++g); //11 , 这次是先加1,然后输出 |
++有花式玩儿法,仅面试有用:
|
1 var a = 8; 2 console.log(4 + a++); //12 , 先使用原来的a的值,就是4+8,输出12.然后a加1 3 console.log(a); //9 |
|
1 var i = 9; 2 console.log(++i % 5); //0 , 先把i加1,然后使用i,10%5=0 3 console.log(i); //10 |
运算符的计算顺序:
++ -- !贴身的 →→→ 数学 →→→ 比较 →→→ 逻辑 →→→赋值
|
1 |
原式 = true
&& true
= true
|
1 |
原式 = 3 <
6 && 7 < 14
= 上一题
= true
|
1 |
原式 = 0 + 1
&& 13
= 1 && 13
= 13
|
1 1 |
原式 = false
+ 15 + true > 8 && 13 || 6
= 16 > 8 && 13
|| 6
= true && 13 || 6
= 13 || 6
= 13
用户输入一个数字,告诉用户是否已经成年 //第1步,用户输入一个年龄
var age = parseInt(prompt("请输入你的年龄"));
//第2步输出
// (age >= 18) && alert("你已经成年了!!");
// (age < 18) && alert("你没有成年啊!!!"); // 也可以这么写,程序是对的:
(age < 18) || alert("你已经成年了");
(age >= 18) || alert("你没有成年啊!!");
赋值运算符
// var a = 1;
// a += 2; //这行语句等价于a = a + 2;
// console.log(a); //3 // var b = 6;
// b /= 3; //等价于b = b / 3
// console.log(b); //2 // var c = 100;
// c %= 10; //等价于c = c % 10;
// console.log(c); //0 // var d = "我";
// d += "爱";
// d += "你";
// console.log(d); // var e = 10;
// e++; //等价于e=e+1
// console.log(e); //11 // var f = 10;
// console.log(f++); //10 // //等价于
// var f= 10;
// console.log(f);
// f++; // var g = 10;
// console.log(++g); //11 // //等价于
// var g = 10;
// g++;
// console.log(g); // var h = 8;
// console.log(4 + h++);
// console.log(h); // var i = 9;
// console.log(++i % 5); //0 , 先把i加1,然后使用i,10%5=0
// console.log(i); //10
综合运算符
// var a = 3 < 6 && 7 < 14; //true
// console.log(a); // var a = 1 + 2 < 3 + 3 && 3 + 4 < 2 * 7; //true
// console.log(a); var a = false + true && 13;
console.log(a);
前端-JavaScript2-5——JavaScript之运算符进阶的更多相关文章
- JavaScript instanceof 运算符深入剖析
简介: 随着 web 的发展,越来越多的产品功能都放在前端进行实现,增强用户体验.而前端开发的主要语言则是 JavaScript.学好 JavaScript 对开发前端应用已经越来越重要.在开发复杂产 ...
- 前端开发之JavaScript篇
一.JavaScript介绍 前端三剑客之JavaScript,简称js,可能是这三个里面最难的一个了.很早以前,市面上流通着三种js版本,为了统一,ECMA(欧洲计算机制造协会)定义了规范的版本, ...
- 前端基础之JavaScript day51
前端基础之JavaScript JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中) ...
- 前端三剑客之javascript
前端三剑客之javascript 给个小目录 一.JavaScript介绍 二.ECMAScript(核心) 三.BOM对象(浏览器对象) 四.DOM对象(文档对象模型) 总结: JS的组成: a ...
- javascript中&&运算符和||运算符的使用
前言 我们在前端开发中,&&运算符和||运算符是使用率和频繁度比较高的,&&运算符和||运算符的功能特别强大,想成为一名优秀的前端工程师,&&运算符和| ...
- 前端第三篇---前端基础之JavaScript
前端第三篇---前端基础之JavaScript 一.JavaScript概述 二.JavaScript的基础 三.词法分析 四.JavaScript的内置对象和方法 五.BOM对象 六.DOM对象 七 ...
- 前端面试之JavaScript中数组的方法!【残缺版!!】
前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...
- day34 前端基础之JavaScript
day34 前端基础之JavaScript ECMAScript 6 尽管 ECMAScript 是一个重要的标准,但它并不是 JavaScript 唯一的部分,当然,也不是唯一被标准化的部分.实际上 ...
- 03 前端基础之JavaScript
目录 前端基础之JavaScript JavaScript JavaScript注释 变量与常量 基本数据类型 number类型 string类型 boolean类型 null与undefined类型 ...
随机推荐
- 【原创项目】GC Server 更新
GC Server 是自己2年前开坑的一个项目,主要是为coder提供方便,内含轻便编译器(不含代码编辑器,就是你把.c/.cpp代码文件放到指定目录下然后打开程序编译),还有各种各样的有助于提升智力 ...
- vue-router路由传参
da给我们点击父组件之后跳转到子组件之后,需要携带参数,便于子组件获取数据.传参方式有三种:一. getDescribe(id) { // 直接调用$router.push 实现携带参数的跳转 thi ...
- [转载]Fiddler为所欲为第四篇 直播源抓取与接口分析 [四]
今天的教程,主要是教大家如何进行“封包逆向”,关键词跳转,接口分析.(怎么样,是不是感觉和OD很像~~~)今天的教程我们以[麻花影视]为例,当然,其他APP的逻辑也是一样,通用的哦~ 首先需要做好准备 ...
- 日志管理中获取浏览器、操作系统、IP等信息。。。
今天在书写日志管理的模块的时候,遇到了一些问题,首先是日志的添加,就是在登录的时候记下他登录的名字以及登录的时间和登录的一些信息给存入到日志表中,这一下给蒙了,于是就查找资源,在这里我就简单地总结一下 ...
- Linux_系统管理_网络配置_命令行配置网络
因为格了系统,重新安装了VMware,加载了原来的虚拟机后,因为VMware虚拟网卡Vmnet8的地址已经变了,所以要改变下客户操作系统的地址,结果搞了半天才搞定,这里记下来,希望能够为遇到这类问题的 ...
- modelSIM仿真ROM核报错
用Quartus Prime 15.1调用modelSIM进行RTL仿真,modelSIM的transcript框框总是有Failed to Open Readmem File提示. 错误原因:IP核 ...
- Vue源码之目录结构
Vue版本:2.6.9 源码结构图 ├─ .circleci // 包含CircleCI持续集成/持续部署工具的配置文件 ├─ .github // 项目相关的说明文档,上面的说明文档就在此文件夹 ├ ...
- JS之clientX,clientY,screenX,screenY,offsetX,offsetY区别
首先需要知道clientX,clientY,screenX,screenY,offsetX,offsetY 是鼠标事件对象下的几个属性. 之前也一直对这些属性搞的稀里糊涂,看文档上说的也是不太理解,反 ...
- ubuntu18安装网易云音乐
1.打开ubuntu软件搜索网易云安装 2.解决ubuntu18.04下网易云音乐打不开的问题 修改/etc/sudoers文件 sudo vi /etc/sudoers 在最后增加一行: usern ...
- LeetCode - Robot Room Cleaner
Given a robot cleaner in a room modeled as a grid. Each cell in the grid can be empty or blocked. Th ...