1.运算符和运算元
运算元----运算符应用的对象
比如乘法运算5*2,有两个运算元
左运算元5和右运算元2
有时候人们也称其为参数
如果一个运算符对应的只有一个运算元,那么它是一元运算符
比如说一元负号运算符(unary negation)-,它的作用是对数字进行正负转换
如果一个运算符拥有两个运算元,那么它是二元运算符
比如2+3
2.算数运算符
算数运算符用在数学表达式,它的使用方式和数学中是一致的
幂运算ES7
<script>// + - *var num1 =5var num2 =8var result=num1+num2console.log(result)//%var num=100var result2=num%8console.log(result2)//**console.log(2**2)console.log(Math.pow(2,2))</script>
3.赋值运算符
前面我们所使用的=其实也是一个运算符,被称之为赋值(assignments)运算符
=是一个运算符,而不是一个有着“魔法” 作用的语言结构
语句x=value 将value写入x然后返回x
链式赋值(Chaining assignments)
let a,b,c
a=b=c=2+2
console.log(a,b,c) //4
链式赋值从右到左进行运算
从代码的可读性来说,不推荐这种写法;
<script>var num1=1var num4=num2=num3=4console.log(num1,num2,num3,num4)</script>
3.1原地修改
什么是原地运算符?
我们经常需要对一个变量做运算,并将新的结果存储在同一个变量中
可以使用运算符+=或者*=来缩写这种表示
所有算术和位运算都有简短的“修改并赋值”运算符:/=和-=等等
<script>//原地修改var n=10n=n+5n=n*2//语法糖var n1=10n1 += 5n1 *= 2console.log(n,n1)</script>
4.自增和自减
对一个数进行加一、减一是最常见的数学运算符之一
所以,对此有一些专门的运算符
自增++将变量加一
自减--将变量减一
自增/自减只能应用于变量
将其应用于数值(比如5++),则会报错
<script>var currentIndex=5;//方法一:// currentIndex=currentIndex+1//方法二:// currentIndex+=1//方法三:自增currentIndex++console.log(currentIndex)//自减currentIndex--;console.log(currentIndex)</script>
4.1自增和自减的位置
运算符++和--可以置于变量前,也可以置于变量后。
当运算符置于变量后,被称为“后置形式”:counter++。
当运算符置于变量前,被称为“前置形式”:++counter。
两者都是做同一件事情。将变量counter与1相加
他们有什么区别呢:
有,但是只有我们使用++/--的返回值的时候才能看到区别
如果自增/自减的值不会被使用,那么两者的形式没有区别
如果我们想要对变量进行自增操作,并且需要立刻使用自增的值,那么我们需要使用前置形式;
前置形式返回一个新的值,但是后置返回原来的值
在开发中,我们一般都不会把自增和自减和其他的表达式写在一行上面。
因为阅读性比较差
我们一般写成两行代码
current++
result=current+100
<script>var currentIndex1=5var currentIndex2=5// ++currentIndex1// console.log(currentIndex1)// --currentIndex2// console.log(currentIndex2)//自增和自减表达式本身又在其他的表达式中,那么就有区别var result1=100+currentIndex1++console.log("输出++在后"+currentIndex1,result1)var result2=100+ ++currentIndex2console.log("输出++在前"+currentIndex2,result2) </script>
5.运算符优先级
运算符中在一起使用会有使用的先后顺序
在MDN中有详细介绍
运算符优先级 - JavaScript | MDN (mozilla.org)
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_precedence
6.比较运算符
我们知道,在数学中有很多用于比较大小的运算符,在JS中也有相似的比较
<script>var num1=10var num2=20//1.比较运算符var isResult=num1>num2console.log(isResult)//2.判断console.log(num1==num2)console.log(num1!=num2)//需求:获取到比较大的那个值// var result =0// if(num1>num2){// result=num1// }else{// result=num2// }</script>
6.1==和===的区别
普通的相等性检查==存在一个问题,它不能区分初0和false,或者空字符串和false这类的运算符
这是因为在比较不同的类型的值的时候,处于判断符号==两侧的值会先被转换为数字
空字符和fasle也是如此,转化后它们都是数字0
如果我们需要区分0和fasle,该怎么办
严格相等运算符===在进行比较的时候不会做出任何的类型转换
换句话说,如果a和b属于不同的数据类型,那么a===b不会做任何的类型转换而是立刻返回false
同样的,“不相等”符号!=类似,“严格不相等”表示为!==
严格相等的运算符虽然写起来稍微长一些,但是它能够很清楚的显示代码的意图,降低犯错的可能性
<script>var foo1=nullvar foo2=0//==运算符,会将运算元先转换成Number类型的值,再来进行比较(隐式转换)//null比较特殊,null在进行比较的时候,会被当成一个对象和原始类型进行比较console.log(Number(foo1))console.log(foo1==foo2)//===运算符,在类型不相同的情况下,直接返回falseconsole.log(foo1===foo2)</script>