JavaScript——运算符
运算符1、赋值运算符2、数学运算符2.1、一元数学运算符2.2、二元数学运算符2.3、计算顺序与优先级3、比较运算符4、逻辑运算符5、Nullish Coalescing运算符6、三目运算符7、位运算符7.1、与运算7.2、或运算7.3、异或运算7.4、取反运算7.5、左移运算7.6、右移运算7.7、补零右移运算8、组合运算符9、优先级1、赋值运算符leta10;//把10赋值给a,a是左侧表达式letobj{};obj.propvalue;//把value值赋给obj对象的prop属性,obj是左侧表达式赋值运算符的计算顺序是从右向左的如果使用了多个赋值运算符则会从最右边开始把值依次赋给左侧表达式。这里需要注意的是因为只有左侧表达式才能被赋值所以在使用多个赋值运算符时只有最右边的可以是任意表达式中间及最左边的所有表达式必须为能够被赋值的左侧表达式代码如下letb10;letab5;//b5,ab,先把b的值改成5,再把b的值赋给a//Uncaught SyntaxError:Invalid left-hand side in assignmentletc67;//6不是左侧表达式,不能被赋值2、数学运算符2.1、一元数学运算符这类运算符包括、-、和–4种可用于单一操作数。5;//5-5;//-51.23;//1.230;//0一元有一个使用技巧可以把非数字类型的值转换为数字作为快速显式类型转换的方式之一代码如下7;//7true;//12.2、二元数学运算符二元数学运算符有、-、∗、/、%、∗∗(ES2020)分别代表加、减、乘、除、取模求余数和幂运算。加法12;//30.20.5;//0.7加法除了用于数字相加还能用于字符串拼接它会把进行加法操作的字符串合并成一个例如helloworld会返回helloworld。如果将数字和字符串相加则会先把数字转换为字符串然后进行拼接例如12会返回12。对于其他类型遵循以下规则如果数字与布尔类型相加则会把true转换为1把false转换为0。如果与null相加则会把null转换成0。如果与undefined相加则会把undefined转换为NaN任何数字与NaN进行计算都会返回NaN。如果与对象相加对象实现了valueOf()方法并且返回数字则会使用它进行相加否则会把对象转换为字符串然后进行拼接。如果与数组相加则会把数字转换为字符串然后进行拼接。//chapter3/addition1.js5true;//65null;//55undefined;//NaN5{};//5[object Object]5{valueOf(){return10}};//155[];//5减法减法使用-符号。减法及后面要介绍的数学运算符不会把操作数转换为字符串字符串只能使用进行拼接而是都转换为数字类型不能转换的则直接返回NaN。//chapter3/substraction1.js10-1;//910-true;//910-null;//1010-5;//510--5;//15,含义为10减去-5,两个减号中间需要有空格,否则会被认为是自减10-str;//NaN乘法3*2;//65*6;//305*a;//NaN除法除法使用/符号与Java等编程语言不同的是JavaScript的除法得到的商并不是取整数部分而是包含完整的浮点数部分代码如下6/3;//2整除3/2;//1.5包括小数如果除数为0则任何数与0相除会得到Infinity代码如下1/0;//Infinity3.5/0;//Infinity需要注意的是Number类型因为都有正数和负数表示法0也不例外虽然0和-0是相同的但是在作为除数时任何数与-0相除都会得到-Infinity代码如下-10/0;//-Infinity-2.33/0;//-Infinity取模10%3;//1,商为3,余数为110%2;//0-9%2;//-1取模也可以用在浮点数上商是整数部分余数则包括剩余的部分代码如下10.25%3;//1.25利用取模运算可以把取值限定在一个范围内例如访问数组中的元素可以对数组的长度进行取模运算这样就不会超过数组的最大索引了代码如下letarr[1,2,3];leti0;arr[(i)%arr.length];//1,其中 i0arr[(i)%arr.length];//2,其中 i1arr[(i)%arr.length];//3,其中 i2arr[(i)%arr.length];//1,其中 i0幂运算幂运算是在ES2020推出的新语法使用∗∗符号表示左边为底数右边为指数幂然后对底数进行幂运算代码如下3**2;//96**3;//216(-3)**3;//-27(-4)**2;//1610**-2;//0.015**0;//14**0.5;//2如果底数为负数并且幂为奇数则结果仍然是负数。如果底数为负数并且幂为偶数则结果为正数。如果幂为负数则把幂当作正数然后对底数进行幂运算最后取结果的倒数。如果幂为小数则进行开方运算。2.3、计算顺序与优先级如果一个表达式中有多种数学计算则不同的运算符有不同的优先级优先级高的先进行计算优先级低的后进行计算相同优先级的则按运算符的计算顺序依次进行计算数学运算符的优先级从高到低分别为自增和--自减。∗∗幂运算。∗乘、/除、%取模。加、-减。3、比较运算符比较运算符用来判断两个操作数之间的关系所以又称为关系运算符。根据操作数关系的成立与否比较运算符会返回布尔类型的结果true代表关系成立false代表关系不成立。比较运算符既可以用于变量之间也可以用于字面值之间的比较常用的比较运算符有、、、、、、!、!下边分别看一下它们的用法和注意事项。、、、最常见的用法是对数字进行比较即左边的操作数是否大于、小于、大于或等于、小于或等于右边的操作数如果成立则返回true如果不成立则返回false代码如下//chapter3/comparison1.js56;//falseleta10;a10;//truea4;//falseatrue;//false,这里true被转换成了数字1,10不大于1,所以返回false99999999n100000//false,BigInt和Number类型可以进行混合比较如果操作数为boolean、null、undefined或字符串类型则会先把它们转换为数字再进行比较boolean类型的true和false分别会被转换为1和0,null会被转换为0,undefined会被转换为NaN任何数字与NaN比较都会返回false。至于字符串类型如果字符串中的内容是数字则会转换为数字非数字则会转换为NaN代码如下53;//true5a;//false5a;//false如果操作数两边同时为字符串类型则会按字符串比较规则进行比较。由于字符串底层是使用UTF-16编码进行表示的实际上是对UTF-16代码点逐位进行比较且每个代码点在Unicode字符中都有不同的顺序所以可以用于比较大小。字符串比较的方式如下如果第1个字符串的第1个字符和第2个字符串的第1个字符不同则直接把这两个字符比较的结果作为整体结果返回。如果相同则比较第二位以此类推直到有不同的字符。若每位都相同且两个字符串长度也相同则它们是相等的。若每位都相同但是字符串长度不同则长度大的比长度小的大。ab;//true,a为97,b为98abcdabbb;//false,长度相同,c比b大,所以abcd应大于abbbabcdab;//false,ab字符都相同,长者为大,所以abcd应大于ab、是用来比较两个操作数的值是否相等的如果两个操作数都是基本类型且内容相同则这两个运算符都会返回true否则会返回false代码如下//chapter3/comparison2.js1010;//true1212;//trueleta5,b5;ab;//trueab;//true它们两个虽然用法是一样的但是对于比较的方式有一定的区别。是松散的比较方式在比较的过程中如果两边的操作数类型不同会先把类型转换为相同的之后再进行比较。使用比较两个值时发生的类型转换可能与预想的不一样遇到这种情况需要注意代码如下nullundefined;//true1true;//true0false;//true11;//true这里可以看到null和undefined被认为是相等的当布尔类型和字符串类型分别与数字类型进行比较时会先把布尔类型或字符串类型转换为数字类型再进行比较。对于数字类型的比较还要注意一点比较NaN无论是使用还是使用都会返回false。是严格的比较方式因此也称为严格相等(Strict Equality)它不会发生类型转换只有类型和值完全相同时才返回true其他情况无论是值还是类型不同都会返回false。为了减少Bug建议全部使用除非有特别的业务需要再使用代码如下//chapter3/comparison3.jsnullundefined;//false1true;//false0false;//false11;//falseleta10,b10;ab;//true4、逻辑运算符逻辑运算符可以对表达式进行与()、或(||)、非(!)运算。一般地进行与运算时只有所有表达式结果都为true时才成立。进行或运算时只要有一个表达式结果为true就会成立。非运算则是对自身进行取反为真时返回假为假时返回真。一般逻辑运算符会跟比较运算符结合使用来形成更复杂的逻辑判断表达式代码如下//chapter3/logical1.jsletmin10;letmax100;letvalue25;valueminvaluemax;//truevalue125;valuemin||valuemax;//true!(valuemin);//false5、Nullish Coalescing运算符Nullish Coalescing空值合并运算符是在ES2020规范中定义的使用表示。它的含义与使用逻辑或设置默认值类似只是在进行运算时只有当左侧操作数为null或undefined的时候才会使用右侧操作数的值否则返回左侧操作数的值代码如下??10;//false??no;//falsenull??100;//100undefined??empty;//emptyNullish Coalescing运算符的应用场景可以是把、false、0等值当作正常的值只有遇到null和undefined时才设置默认值。6、三目运算符三目运算符使用表示问号前边是要判断的条件问号与冒号中间是条件成立时要执行的表达式冒号后边是条件不成立时要执行的表达式。这里的条件判断与逻辑运算符一样会使用逻辑意义上的真、假值进行判断代码如下letshowfalse;show?visible:hidden;//hidden,show为false,所以执行冒号后边的表达式leta10;a?a5:0;//15,a为10,是真值,所以会执行冒号前边的表达式7、位运算符位运算的操作数是32位的整数而不是64位的浮点数如果使用浮点数则它会把小数部分截掉然后把它转换成32位之后再进行计算。位运算符有与()、或(|)、异或(^)、取反(~)、左移()、右移()、补0右移()这几种。与、或、异或、取反这几种操作跟逻辑运算符类似只是它们比较的是1和0然后返回逐位运算的结果。7.1、与运算与运算的计算方法是当两个操作数位都是1时返回1其他情况返回0。例如计算35会分别先把3和5转换成二进制形式二进制位数不同的在长度短的一方的前边用0补齐例如下方展示了35的计算过程代码如下011//3101//5---------001//1这样进行与运算后的结果为001即十进制的1。另外在进行与运算时任何数字跟它本身做与运算返回的都是它自己跟0进行与运算则都返回0代码如下1010;//10999999;//999100;//07.2、或运算或运算的计算方法是只有当两个操作数位都是0时才返回0其余情况返回1。例如计算3|5的过程代码如下011//3101//5---------111//7在进行或运算时任何数字跟它本身和0进行运算时都会返回数字本身代码如下10|10;//1010|0;//10-5|-5;//-5-5|0;//-57.3、异或运算异或运算的计算方法是当两个操作数位不相同时返回1相同则返回0。例如计算3^5的过程如下011//3101//5---------110//67.4、取反运算取反运算会把一个操作数的所有二进制位进行取反操作1变为0,0变为1。这样得出来的结果是数字本身加一之后再取相反数代码如下~3;//-4,即-(31)~-9;//8,即-(-91)7.5、左移运算左移会把二进制位向左移动若干位右边用0补足空白位置。例如23结果为16计算过程如下00010;//2//把 1左移3位10000;//16如果左移后有二进制位超过了32位则超出部分将直接被舍弃例如计算2530的结果为1073741824计算过程如下00000000000000000000000000011001//2501000000000000000000000000000000//107374182425的二进制位表示为00011001在左移30位之后只剩下最后一个1还在有效范围内所以结果会变成上方计算过程所示。需要注意的是左移的位数只能取0~31的数字如果大于31则会取对32进行取模之后得到的余数例如左移35位会变为左移3位。7.6、右移运算右移会进行与左移相反的运算并且超过32位的部分也会被舍弃。在移动时左侧空位会复制最左侧符号位的数值如果是负数则为1如果是正数则为0。例如计算-51的结果为-3计算过程如下11111111111111111111111111111011//-5,最左侧为符号位,-5的二进制表示其实//是对4的二进制表示进行取反运算11111111111111111111111111111101//-37.7、补零右移运算补零右移(Zero-Fill Right Shift)又称为无符号右移与右移不同的地方在于右移后左侧的空位会用0补齐这样只要移动的位数大于或等于1那么它的符号位就始终是0例如计算-51的结果是2147483645计算过程如下11111111111111111111111111111011//-501111111111111111111111111111101//21474836458、组合运算符组合运算符指的是把赋值运算符和其他运算符组合起来进行使用是先计算后赋值的一种简写形式代码如下letspeed10,delta0.5;speeddelta;//10.59、优先级