运算符

运算符(Operators,也翻译为操作符),是发起运算的最简单形式。

运算符的分类见仁见智,我们的课程对运算符进行如下分类:

数学运算符(Arithmetic operators)      

比较运算符(Comparison operators)

逻辑运算符(Logical operators)

赋值运算符(Assignment operators)

按位运算符(Bitwise operators)

条件 (三元) 运算符(Conditional operator)

1.数学运算符

+ - * / % ()

  • 这里面要知道%的意思,我们昨天已经算过很多了,不赘述。
  • 要知道计算顺序,先乘除求余,然后加减,我们昨天已经算过很多了,不赘述。
  • 隐式转换,所有带有字符串的运算都会尽可能的转为数字进行计算,加号比较特殊。

数学运算符的正统,是numbernumber的数学运算,结果是number。出于面试的考虑,有一些奇奇怪怪的数学运算:

数学运算中,只有纯字符串、布尔值、null能够帮你进行隐式转换

//隐式转换:就是没有写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

不纯的字符串和undefined是不能帮你进行隐式转换的,结果都是NaN

console.log(3 * "8天");	//NaN	数学运算中,不纯的字符串没法隐式转换
console.log(3 * undefined); //NaN 数学运算中,undefined不能进行隐式转换

加法比较特殊,因为+同时是加法和连字符的符号,所以加法在面对字符串的时候没有隐式转换

//加法没有隐式转换
console.log(3 + "8"); //38
console.log(3 + undefined); //NaN
console.log(3 + null); //3
console.log(3 + false); //3
console.log(3 + true); //4

总结:

无论哪种运算,只要出现了undefined参与运算,结果都是NaN。

然后"4"、false、true、null都能进行隐式转换。

加号比较特殊,面对"4"没有隐式转换的

特殊数值的计算,就是NaN、Infinity参与的运算,我们看《高3》来学习。

我们就举几个例子:

Infinity + 1000   //Infinity
Infinity - 1000 //Infinity
Infinity / 1000 //Infinity
Infinity - Infinity //NaN
Infinity /Infinity //NaN
Infinity * Infinity //Infinity
0 / 0 //NaN
6 / 0 //Infinity
NaN / 8 //NaN

2.关系运算符

>     大于
<     小于
>=   大于等于
<=   小于等于
==   等于
!=    不等于
=== 全等于
!==  不全等

关系运算符的正统,numbernumber进行数学运算,得到的答案boolean

console.log(8 > 5); //true
console.log(7 < 4); //false

关系运算的结果,是boolean类型的。

true和false叫做布尔值。boolean类型,boolean类型只有两个值,就是true和false。表示真、假。

== 我们叫做“相等判断”,它会帮你进行一个隐式转换,尽可能的得到true的答案:

console.log(5 == "5"); //true

===我们叫做“全等判断”,不仅仅比较数值是否相等,还比较类型是否相等

!= 是的反面,如果运算是true,那么!=就是false

!是=的反面,如果=运算是true,那么!就是false

console.log(5 != "5");	//false ,脑子要反着想一下,5=="5"结果是t,所以就是f

console.log(5 !== "5");	//true ,脑子要反着想一下,5==="5"结果是f,所以就是t

正统的运算讲完了,number和number进行关系运算,结果是boolean。

现在我们讲一丢丢不正统的关系运算,为了面试,划一下重点,更多的自己通过《高三》P50、P51、P52:

stringstring 也能够进行关系运算,比较的就是字符编码顺序。

字符编码顺序,就是数字、大写字母、小写字母

"a" < "b" //true
"A" < "B" //true
"A" < "a" // true ,大写字母在字符集里面是在小写字母前面
"1" < "A" //true ,数字在字母前端
"blank" < "blue" //true 因为一位一位比,直到比出大小
"25678" < "3" //true 因为是string和string比,比的是字符编码顺序

② 与数字进行关系运算时,纯数字字符串被转为数字,null转换为0,true转换转为1, false转换为0,null不能进行和0的相等判定。

null < 0.00001  //true
null > -0.0001 //true
null == 0 //false 具体原因,我们后面讲解Object的时候介绍
false == 0 //true
true == 1 //true

③ NaN不等于自己,不全等于自己

NaN == NaN  //false
NaN === NaN //false
NaN != NaN //true
NaN !== NaN //true

④ string 和 number比,string会被隐式转换为number

"25" < 3 //false

需要注意的是,我们已经了解了一些不正统的运算,所以不要出洋相,不能连续使用关系运算符!!

比如我们想验证3大于2,2大于1:

表达式:

3 > 2 > 1

的值是多少?

解:原式=(3>2) >1 = true > 1 = false (因为true会被当做1来与1进行比较)

也就是说,不能连续使用关系运算符!!因为一旦连续使用了,实际上还是从左至右计算,所以就有上一步的boolean参与了下一步的运算。

剧透一下,如果想要使用连续关系运算,1<2 && 2<3

3.逻辑运算符

逻辑运算符就三个:

&& 	逻辑与运算
|| 逻辑或运算
! 逻辑非运算

正统来说,参与逻辑运算的是booleanboolean,得到的结果也是boolean

值按照真值表来定。

&& 逻辑与,“且”

“都真才真”,“有假就假”。

命题1:“地球是圆的” 真的

命题2:“宋仲基很帅” 真的

命题1 且 命题2 真的

命题1:“1+1=3” 假的

命题2:“地球是方的” 假的

命题1 且 命题2 假的

//逻辑运算符
console.log(true && true); //t
console.log(true && false); //f
console.log(false && true); //f
console.log(false && false); //f

“有真就真”,“都假才假”

命题1: 1 + 1 = 2

命题2:“邵老师很帅”

命题1 或者 命题2 总结果是真

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

运算顺序是非、与、或

true || false && !true || false;
解:原式 = 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

正性的:除了上面的,全是正性的。

false && 8   //false  因为计算机发现,且运算a已经是false了,直接输出false
null && 8 //null 因为计算机发现,且运算a已经是false性的了,直接扔出来null
true && 13 //13 因为计算机发现,且运算a是true,所以总结果就是看b,直接扔出b
12 && 13 //13 因为计算机发现,12当做true,所以总结果看b,直接扔出b
13 && 12 //12 因为计算机发现,13当做true,所以总结果看b,直接扔出b
undefined && 哈哈 //undefined 不报错,因为a已经是负性的了,所以直接扔出a,哈哈不管
哈哈 && undefined //报错
true && NaN //NaN 扔后面

|| 逻辑或的短路也是类似的,a||b

计算机发现a是真,那么扔a;如果a是假,那么扔b

0 || 18   //18 前面假,扔后面
18 || 0 //18 前面真,扔前面
undefined || NaN //NaN 前面假,扔后面
NaN || undefined //undefined 前面假,扔后面

88 || 99 && 66 || 55

解:原式 = 88 || 66 || 55

= 88 || 55

= 88

undefined && ("3" != 3) || NaN && null

解: 原式 = 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。

千万不要背,从真值表中自己推倒。

4.赋值运算符

=	赋值
+= 简便写法
-= 简便写法
*= 简便写法
/= 简便写法
%= 简便写法
++
--

赋值运算的参与者,一定是变量。

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 a = "我";
a += "爱";
a += "你";
console.log(a);

++运算符:

var e = 10;
e++; //等价于e=e+1
console.log(e); //11

++可以与输出语句写在一起,++写在变量前和写在变量后不是一个意思。

a++ : 先用a的原值,然后a加1;

++a :先给a加1,然后用a的新值

var f = 10;
console.log(f++); //10 ,先引用原值,然后加1

等价于:

//等价于
var f= 10;
console.log(f); //先输出f
f++; //然后f加1 var g = 10;
console.log(++g); //11 , 这次是先加1,然后输出

++有花式玩儿法,仅面试有用:

var a = 8;
console.log(4 + a++); //12 , 先使用原来的a的值,就是4+8,输出12.然后a加1
console.log(a); //9 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
原式 = true && true
= true var a = 1 + 2 < 3 + 3 && 3 + 4 < 2 * 7;
原式 = 3 < 6 && 7 < 14
= 上一题
= true var a = false + true && 13;
原式 = 0 + 1 && 13
= 1 && 13
= 13 var a = 15;
false + a++ + true > 8 && 13 || 6
原式 = false + 15 + true > 8 && 13 || 6
= 16 > 8 && 13 || 6
= true && 13 || 6
= 13 || 6
= 13

条件分支语句

1.if语句

如果……否则…… , 让程序出现分支

<script type="text/javascript">
var a = 8;
if(a >= 60){
alert("及格了");
}else{
alert("不及格");
}
</script>

语法:

if(测试表达式){
测试表达式为真执行的语句
}else{
测试表达式为假执行的语句5 }

if英语里面的如果的意思,else就是否则的意思。else不要拼写为eles。

在语法层面有两个特例:

① 可以没有else部分

var a = 1;
if(a >= 60){
alert("及格了");4 }

② 如果要执行的语句,只有一行语句,那么就是单行if,就可以省略大括号。

var a = 112;
if(a >= 60)
alert("及格了");
else
alert("不及格");

注意if语句是一个结构体,注意哪些语句是在结构体中,哪些语句不是结构体:

var a = 355;
if(a > 30){
console.log("哈哈");
console.log("嘻嘻");
console.log("呵呵");
}else{
console.log("纳尼");
console.log("呸呸")
}
console.log("么么哒"); /*一定会执行,在if结构体外面*/

小练习:用户输入一个年龄,判断用户能不能考取驾照。交规说: 大于等于18,小于等于70才能考取驾照。

//让用户输入年龄
var age = parseInt(prompt("请输入年龄"));
//判断
if(age >= 18 && age <= 70){
alert("可以考取驾照");
}else{
alert("年龄不符合要求");
}
alert("谢谢惠顾");

多分支的if

if……else if …… else if…… else if…… else ……

如果……否则如果……否则如果……否则如果……否则……

跳楼现象,用户会选择一个分支执行(跳楼),选择这个分支了,就暗含了上一个分支没有满足:

var score = 76;

if(score >= 85){
alert("优秀"); //不满足条件,所以不执行,走楼梯下楼
}else if(score >= 70){
alert("良好"); //走到这个楼层的,一定暗含小于85。这一楼层满足,跳楼了
}else if(score >= 60){
alert("及格"); //不执行
}else{
alert("不及格") //不执行
}

语法:

if(测试表达式1){
测试表达式1为真的时候做的事情
}else if(测试表达式2){
测试表达式1为假,且测试表达式2为真的时候做的事情
}else if(测试表达式3){
测试表达式1为假,测试表达式2为假,且测试表达式3为真的时候做的事情
}
……

if语句的嵌套:

用户先输入自己的性别,比如男、女。然后输入自己的年龄。判断能否结婚。

男的22以上

女的20以上

if语句可以嵌套,如果里面再套一层如果:

//判断
if(sex == "男"){
//男
if(age >= 22){
alert("男同志你好,可以结婚");
}else{
alert("你还是个小正太,不能结婚!");
}
}else{
//女
if(age >= 20){
alert("女同志你好,可以结婚");
}else{
alert("你还是个小萝莉,不能结婚!");
}
}

楼层中else只能有一个。 else if可以有多个。

12_JavaScript基础入门(2)的更多相关文章

  1. js学习笔记:webpack基础入门(一)

    之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...

  2. 「译」JUnit 5 系列:基础入门

    原文地址:http://blog.codefx.org/libraries/junit-5-basics/ 原文日期:25, Feb, 2016 译文首发:Linesh 的博客:JUnit 5 系列: ...

  3. .NET正则表达式基础入门

    这是我第一次写的博客,个人觉得十分不容易.以前看别人写的博客文字十分流畅,到自己来写却发现十分困难,还是感谢那些为技术而奉献自己力量的人吧. 本教程编写之前,博主阅读了<正则指引>这本入门 ...

  4. 从零3D基础入门XNA 4.0(2)——模型和BasicEffect

    [题外话] 上一篇文章介绍了3D开发基础与XNA开发程序的整体结构,以及使用Model类的Draw方法将模型绘制到屏幕上.本文接着上一篇文章继续,介绍XNA中模型的结构.BasicEffect的使用以 ...

  5. 从零3D基础入门XNA 4.0(1)——3D开发基础

    [题外话] 最近要做一个3D动画演示的程序,由于比较熟悉C#语言,再加上XNA对模型的支持比较好,故选择了XNA平台.不过从网上找到很多XNA的入门文章,发现大都需要一些3D基础,而我之前并没有接触过 ...

  6. Shell编程菜鸟基础入门笔记

    Shell编程基础入门     1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...

  7. [Spring框架]Spring AOP基础入门总结二:Spring基于AspectJ的AOP的开发.

    前言: 在上一篇中: [Spring框架]Spring AOP基础入门总结一. 中 我们已经知道了一个Spring AOP程序是如何开发的, 在这里呢我们将基于AspectJ来进行AOP 的总结和学习 ...

  8. [Spring框架]Spring AOP基础入门总结一.

    前言:前面已经有两篇文章讲了Spring IOC/DI 以及 使用xml和注解两种方法开发的案例, 下面就来梳理一下Spring的另一核心AOP. 一, 什么是AOP 在软件业,AOP为Aspect ...

  9. RobotFramework - 基础入门

    Robot Framework Wiki HomePage Robot Framework User Guide Robot Framework documentation Robot Framewo ...

随机推荐

  1. AJ学IOS(54)多线程网络之NSOperation重要知识

    AJ分享,必须精品 一:队列的类型与队列添加任务 1: 主队列 [NSOperationQueue mainQueue] 添加到”主队列”中的操作,都会放到主线程中执行. 2:非主队列 [[NSOpe ...

  2. layoutInflater参数解析与源码分析

    关于LayoutInflater方法,无论是在listview的适配器中,还是在动态添加view的时候,都会出现它的身影,最开始我在看<第一行代码>时,不知道这个方法实际的参数到底指的是什 ...

  3. PHP代码审计(初级篇)

    一.常见的PHP框架 1.zendframwork: (ZF)是Zend公司推出的一套PHP开发框架 功能非常的强大,是一个重量级的框架,ZF 用 100%面向对象编码实现. ZF 的组件结构独一无二 ...

  4. App 开发中判断 ios 和 andriod 常用方法便于修复在两类机型样式不一样等缺陷

    判断安卓, ios

  5. The equation SGU - 106

    题目链接:https://codeforces.com/problemsets/acmsguru/problem/99999/106 这个题是关于EXGCD特别好的一个题目.题目大意:有一个等式ax+ ...

  6. mybatis一级缓存让我憔悴

    Mybatis对缓存提供支持,是默认开启一级缓存. 来一段代码,这边使用的是mybatis-plus框架,通过构建 QueryWrapper 查询类来实现的. @Transactional publi ...

  7. 一个可能是世界上最全的 API 接口集合库开源项目

    对于程序员来说,为自己的程序选择一些合适的API并不是那么简单,有时候还会把你搞得够呛,今天猿妹要和大家分享一个开源项目,这个项目汇集了各种开发的api,涵盖了音乐.新闻.书籍.日历等,无论你是从事W ...

  8. ubuntu(Linux)下,查看CPU性能集合

    CPU: 详细:cat /proc/cpuinfo型号:grep "model name" /proc/cpuinfo |awk -F ':' '{print $NF}'数量:ls ...

  9. 什么是LVM

    LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性.前面 ...

  10. Win7+Linux双系统,完美解决删除Linux后出现的任何问题!

    首先,进入到Win7,安装MiniTool Partition Wizard Home Edition删除掉Linux分区, 点Yes 然后选中 这里选中这个,重写MBR,开机神马grub神马问题都没 ...