赋值本质上也是一种运算。运算所使用的符号叫做运算符,所以等号(=)也是一种运算符(operator)。
赋值运算符是右连接的:即在一个表达式中,运算是从右到左进行的。比如:
int a, b, c; a = b = c = 50;
运算顺序是:
接下来讲的运算符大多数都是左连接的。
其他常见的运算大致包括:
32 + 3; fee - 1; 2 * pai; 16.5 / 5;
还有我们前面所说的取余,运算符是百分号(%):
7%2 //结果为余数1
这种运算代码被称之为表达式。
@试一试@:0.1+0.2,结果是多少?
这不是bug,是计算机进行小数运算时很难解决的问题。
简单的解释是:计算机在把十进制的0.1或0.2转换成二进制时丢失了“精度(precision)”,就好像我们在把1/3转换成0.333333333333333333时丢失了一点点数据一样。
这里有一种初学者可能有点奇怪的写法:
fee = fee + 10;这一行的代码,意思是:
所以实际上的结果是fee的值增加了10。
这种可以被简写成:
fee += 10;
加减乘除都可以这样组合,比如:减等于(-=)、乘等于(*=)、除等于(/=)……
如果只是加/减(乘除不行)1的话,还可以被进一步简写成:
fee++; //右加加 ++fee; //左加加 fee--; //右减减 --fee; //左减减
#常见面试题#:左右加加区别是什么?^_^
为了说明这个问题,我们引入:
alert(fee++); //先console.log(),再++ alert(++fee); //先++,在console.log()
很坑,有时候阴沟里翻船……(历史遗留问题,不够优雅)
3+2-5*0 //结果是什么?回答0的同学:面壁,深刻反省,小学数学体育老师教的?
先乘除,后加减:这就是优先级(priority)。一个表达式里面有多个运算符,按优先级从高到低依次运算。
但是,飞哥推荐优先使用圆括号((),注意:没有中括号[],中括号在编程语言中有其他含义),提高代码的可读性。圆括号具有最高优先级,总是会被首先计算,比如:
alert((3 + 2 - 5) * 0); // 结果是0
PS:牛逼的代码,不是别人读不懂的代码,而是别人能读懂的代码!千万千万不要搞反了。
代码让人读不懂,是坑人!会被打的。
典型的就是比较运算:
fee > 18; //大于 fee < 18; //小于 fee <= 18; //小于等于,≤ fee >= 18; //大于等于,≥ score == 0; //等于,注意是两个等号 token != '飞哥最帅' //不等于
返回的值被称之为布尔(bool)值,又是一种数据类型,包括:真(true)和假(false)
bool值之间还可以进行计算,包括:
演示:true || false,true && true,!true
逻辑预算可以一直连缀,产生比较复杂的表达式:
//假设fee=101 fee > 80 || fee < 100 && fee%2==0 (fee > 80 || fee < 100) && fee%2==0 //加圆括号修改优先级 (fee > 80 || fee < 100) && !fee%2==0 //还加上了取反
演示:优先级 ! > && > ||,建议:
#常见面试题#:和位运算的区别
实际上,还有两个运算符:按位或(|)和按位与(&),和逻辑运算符很类似,而且作用也类似:
alert(true | false); //结果为true alert(true & false); //结果为false
既然这样的话,这种位运算和逻辑运算又什么区别呢?
首先,位运算本质上是在二进制上运算的,它可以把bool值都先转换成二进制,把1当成true,0当成false,按逻辑或/且进行运算
学习完函数之后再演示:短路运算
在软件开发中,如何存储一个用户的权限/角色,也是一个比较麻烦的事情。
源栈的学生,可以是:
每个同学可以是上面一种或多种角色,而且可以随时增减。
让你来记录同学的角色,你怎么办?一种更“专业”更有“逼格”的方法是:使用2的整数次方的数值代表角色,对他们进行位运算,完成权限的增、删、查:
十进制 |
二进制 |
权限/角色 |
1 |
0001 |
Student |
2 |
0010 |
TeacherAssist |
4 |
0100 |
TeamLeader |
8 |
1000 |
DormitoryHead |
@想一想@,这可以用来干嘛?
当所有参与运算成员的数值都是:
他们就会有如下规律:
所以,@想一想@:这是不是就是天然的权限管理方案啊?以下current表示当前所有权限
通常,都会提供一个字符串的拼接运算。字符串用引号包裹,所以,"32"和32是不一样的。
转义
@想一想@:假如我们的字符串中包含了引号怎么办?比如:"大"神"小"班。
如果我们这样写:
let slagon = ""大"神"小"班"";是会直接报错的。因为计算机搞不懂这里面的引号("")那些是定义字符串的,哪些是字符串中本身包含的。
这时候我们需要由反斜杠(\)引导的转义字符:
let slagon = "\"大\"神\"小\"班\"";
\" 就意味着一个作为字符串内容的双引号。
\后面还可以跟其他字符,代表不同的意思,常见的有:
运算符也是加号(+):
greet = "源栈欢迎你," + "阿泰";
+可以被多次使用,拼接多个字符串。
@试一试@:将字符串和数值进行加号运算,会有什么结果?
最后,字符串也可以进行比较:
"abc" == "ABC" "abc" != "ABC"
number>0
多快好省!前端后端,线上线下,名师精讲
更多了解 加: