日期:2024年10月18日

运算符(operators)

运算符用来对一个值或多个值进行运算或操作,所以运算符也被翻译为操作符。例如:+(加号)用来对两个值进行加法运算并将结果返回。JS中包含有非常非常多的运算符。

算术运算符( Arithmetic operators)

符号作用示例
+用于对两个值进行加法运算1 + 2 // 结果3
用于对两个值进行减法运算3 - 1 // 结果2
*用于对两个值进行乘法运算3 * 2 // 结果6
/用于对两个值进行除法运算6 / 2 // 结果3
%用于对两个值进行取余运算9 % 4 // 结果1
**用于对两个值进行幂运算2 ** 3 // 结果8

加减乘除四则运算我们已经非常熟悉了,除此之外JS中还提供了%(两个数相除取余数),**(求某个数的几次幂)。如果是单纯的运算应该是没有什么太大的问题,但这里还是要强调一下需要注意的地方。

首先这些个算数运算符都不会变量产生任何影响。

let a = 10
let b = 20
a + b // 不会对a和b产生任何影响

上边案例中,两个变量a和b,对两个变量进行加法运算后,不会对a和b产生影响。算数预算符的作用仅仅是对两个值进行算数运算,然后返回结果。要想得到就需要创建一个变量用来存储运算结果。

let a = 10
let b = 20
let c = a + b // 将a+b的结果赋值给c,同样不会影响a和b

除此之外也可以这样写

let a = 10
a = a + 20 // 将a+10的结果赋值给a

这样写的意思表示将a+20的结果在赋值给a,这样a的值最终将会变成30。第一次接触语言的同学可能会觉得这种写法比较奇怪,奇怪也没有办法,就是可以这么写。要理解这个先要明确一点,变量在等号左边和右边所代表的意义是不同的,变量在等号左边时表示变量,在右边时表示的是它所代表的值。上例中等号左侧的(a =)此时的a没什么好说的就是一个变量。右边的a(= a + 20)此时a表示的是它所代表的值也,也就是10,所以 = a + 20实际上就相当于 = 10 + 20。

而且进行赋值的时候,等号右边是先执行的,所以a = a + 20可以看作是a = 10 + 20,这是完全等价的。

上一个例子中对变量a进行了重新赋值,所以如果这么写就会导致变量的改变,但是变量改变也和算术运算符没有什么关系,变量改变是由于赋值运算符=所导致的。

其他类型的值

算术运算符除了可以完成数值间运算以外,也可以对其他类型对值进行运算。比如可以让true和false进行相加。

true + false // 1

呃?true和false是怎么算的?很简单,在JS中有自动的类型转换机制,当你对非数字类型的值进行算术运算时,浏览器会自动将其转换为数字然后再进行运算。true和false相加,true会被转换为1,false会被转换为0,所以true+false结果为1。其实true和false在程序底层就是以1和0表示的,true就是1,false就是0。

那么,其他类型的值会如何转换呢?可以直接给一个值减,然后直接查看结果就OK了。

console.log(`true - 0 = ${true - 0}`)
console.log(`false - 0 = ${false - 0}`)
console.log(`null - 0 = ${null - 0}`)
console.log(`undefined - 0 = ${undefined - 0}`)
console.log(`NaN - 0 = ${NaN - 0}`)
console.log(`Infinity - 0 = ${Infinity - 0}`)

执行结果:

运行结果

通过这个示例结果就比较清晰了,true转换为1,false转换为0,null转换为0,undefined转换为NaN。除此之外下边还举了两个例子NaN和Infinity,一个数字和NaN作用运算,最终结果为NaN。一个数字和Infinity,最终结果为Infinity。

字符串的情况比较特殊,我们单独来说一下

console.log(`"123" - 0 = ${"123" - 0}`)
console.log(`'hello' - 0 = ${'hello' - 0}`)
console.log(`'123px' - 0 = ${'123px' - 0}`) 
运算结果

对于字符串来说,如果字符串本身是一个合法的数字(不包括大整数)”123″、”3.14″会直接转换为对应的数字。如果字符串不是一个合法的数字”hello”、”123px”会转换为NaN。

最后一种特殊情况就是字符串的加法:

console.log('hello' + 123) // "hello123"
console.log('hello' + true) // "hellotrue"
console.log('hello' + false) // "hellofalse"
console.log('hello' + null) // "hellonull"
console.log('hello' + undefined) // "helloundefined"

任何的值和字符串做加法时都会转换为字符串(123变’123’、true变’true’等),然后和字符串进行拼接字符串的操作。例如:’hello’ + 123 会把123转换为’123’,然后将’hello’和’123’拼接为一个字符串’hello123’。

自增和自减

和算术运算符不同,自增和自减运算符只能用于变量。自增运算符++,自减运算符–。先来看自增,自增可以这样使用。

let a = 10
a++
console.log(a) // 输出11

let a = 10
++a
console.log(a) // 输出11

自增运算符会直接修改变量的值(不需要赋值),这一点和算术运算符有很大的区别。所以自增以后,无论++写在变量的前边还是后边,变量的a的值都会立即增加1。原来是1变成2,原来是2变成3,原来是10变成11,所以上例中两个a最终输出的值都是11。

那么二者有何区别呢?这里就要回顾我们之前的内容,之前我们提到过代码通常会有两个层面,一个是它做的事情,还有一个是它返回的结果。这里自增所做的事情就是使变量在其原值的基础上加1。然而,除了做事情以外自增也会返回一个结果,我们可以这样接收。

let a = 10
let b = ++a // 将表达式的返回值赋值给b
console.log(`a = ${a}`) // a = 11 
console.log(`b = ${b}`) // b = 11

上例中,调用了++a,同时将++a的返回值赋值给了b,打印后发现a和b的值都是11,这就意味着,++a的返回值和变量a最终的值是一样的。

let a = 10
let b = a++ // 将表达式的返回值赋值给b
console.log(`a = ${a}`) // a = 11 
console.log(`b = ${b}`) // b = 10

上例中,将a++的返回值赋值给b,此时a的值依然是11,但是b的值是10。也就是a++返回的是a原来的值。

这里你需要明确一点a和a++不是一回事,a是一个变量,而a++是一个表达式。就好像a和a+1一样,一定不要掺合到一起。a和a+1的值不一样,同理a和a++的值也不一定一样。

所以最后总结起来,无论++写在变量的前边或后边对于变量本身都是一样的,都会增加1(a++和++a都会使a的值增加1),不同点在于++写在后边,它的返回值是变量的原来的值(a++的值是a增加前的值),而++写在前边,它的返回值是变量增加后的值(++a的值是a加一后的新值)。

这一块对于初学者可能会有点难以理解,你要做的事情就是现在自己写一下,写一下你就明白了,自减就不说了,自己实验实验吧。

0 0 投票数
文章评分
订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x