JavaScript中的运算符主要用于连接简单的表达示,组成一个复杂的的表达式
一些运算符可以作用于任何数据类型(typeof),但大部分操作符希望操作数是特定的类型,而且大部分操作符会计算出(我们也常说返回)一个特定类型的值(typeof返的全是string)
在JavaScript中运算符通常会根据需要对操作数进行类型转换,乘法操作符希望操作数是数字,但是 "3" * "5"也是合法的,JavaScript会自动将其转换为数字计算,返回Number 15。
大多数运算符都是由标点符号组成(+、>、!),也有关键字运算符如typeof、delet、instanceof
加性操作符
加法和减法是最简单的算数操作符,但是在JavaScript中运算符会根据需要对操作数进行类型转换
+ 加法
如果两个操作数都是Number类型,则执行常规运算;
如果两个操作数不同类型则会按特定规则对操作数进行类型转换,规则如下:
只要其中有一个数是NaN结果就是NaN(任何涉及到NaN是运算都会返回NaN)
var numberNaN = 1 + NaN;
操作数涉及boolean值true会转换成1,false为0
var num = 1 + true;//2
涉及到字符串的运算
如果两个数值都是字符串就会把这两个字符串拼接起来
var java = "Java"
var javaScript = java + "Script";
console.log(javaScript);//"JavaScript" 两个字符被拼接了
如果其中只有一个操作数是字符串,会将另一个操作数转换成字符串,然后再拼接
var num = 456;
var str = num + "789"
console.log(typeof(str));//"string"
console.log(str)//"456789"
如果一个操作数是对象
会调用这个对象valueOf()或者toString()方法
var obj = {
toString: function(){
return "20"
},
valueOf:function(){
return 10;
}
}
console.log(1 + obj)//11 valueOf的优先级比toString高
+
号运算符会将操作数进行类型转换,这是我们可以利用的。
我们可以通过 +号运算符来把某个值按照转换规则转换成数值,规则如下
- 如果是Boolean值,true和false分别为0和1
- null 为0
- undefiend为NaN
涉及到字符串
如果字符串中只包含数值(包括前面带正号和负号的情况),会装换成十进制数字
var number = + "123"//结果为:number 123;
如果字符中包含有效的十六进制格式,则会转换成相同大小的十进制格式的整数
var number = + 0xf;//15
如果字符串为空""
则为0
var number = + "";//0
如果字符串中包含上面叙述格式外的字符则为NaN
var numberNaN = + "this is NaN"//NaN
- 减法
不同于+号运算符可以用于拼接字符串,减法只能用于运算,所以会尽量把操作数转换为数值
操作数中有无法转换成数值的字符串结果就会为NaN
var str1 ="aaaa"
var str2 ="bbbb"
var test = str1 - str2;//NaN
如果是操作数中的字符串能转换成数值的就转换成数值进行减发运算
var str1 = "1"
var str2 = "2"
var test = str1 - str2;//-1
如果操作数是对象依然和+好运算符一样调用valueOf和toString,然后进行减法运算
乘性操作符
乘性操作符和减号操作符其实很类似,它们的作用都限于数值操作所以都会把操作数尽可能的转换成数值
乘法
使用(*),用于计算两个数的乘积
- 如果两个操作数都是数值执行常规运算
- 如果一个操作数是为NaN,结果为NaN
- 如果一个操作数不是数值则转换为数值进行计算,如果无法转换为数值则为NaN;
除法
由(/)表示
- 如果两个操作数都是数值执行常规运算
- 如果一个操作数是为NaN,结果为NaN
- 如果一个操作数不是数值则转换为数值进行计算,如果无法转换为数值则为NaN;
求模
求摸(余数)操作符由(%)表示
- 如果两个操作数都是数值则执行常规除法,返回其余数
- 如果被余数为0,这返回0
- 如果操作数不是实在则转换为数值,无法转换为NaN
自增和自减操作符
分为前置型和后置型,前置型位于操作数之前而后置型反之
前置型自增与自减
前置型自增与自减都会在语句被求值之前作用在操作数上
var num1 = 2;
var num2 = 22;
var num3 = --num1 + num2;
var num4 = num1 + num2;
console.log(num3);//23
console.log(num4);//23
上面这个例子 num3之所以等于21是应为num1先减去了1才和num2相加。
而num4也等于21是因为num1已经被减去了1然后进行加上num2的22就是等于23
原理是前置自增和前置自减在操作符中的优先级比+
=
都要高所以在这两个操作符还没执行时,num1已经进行了自减
后置型自增和自减
后置型自增与自减会在语句被求值之后再作用于操作数上
var num1 = 2;
var num2 = 20;
var num3 = num1++ + num2;//22
var num4 = num1 + num3;//23
num3的结果为22,而num4的结果为23就是因为语句被后置++
或--
的优先级比=
赋值操作符的优先级低,所以num1+num2的计算结果都赋值给了num3后才执行。
赋值运算符
赋值运算符用于给变量赋值,最常见的赋值运算符,当然就是等号,表达式x=y表示将y赋值给x。除此之外,JavaScript还提供其他11个赋值运算符。
x += y // 等同于 x = x + y
x -= y // 等同于 x = x - y
x *= y // 等同于 x = x * y
x /= y // 等同于 x = x / y
x %= y // 等同于 x = x % y
x >>= y // 等同于 x = x >> y
x <<= y // 等同于 x = x << y
x >>>= y // 等同于 x = x >>> y
x &= y // 等同于 x = x & y
x |= y // 等同于 x = x | y
x ^= y // 等同于 x = x ^ y
比较运算符
比较运算符比较两个值,然后返回一个布尔值,表示是否满足比较条件。JavaScript提供了8个比较运算符。
== //相等
=== //严格相等
!= //不等于
!== //严格不等于
< //小于
<== //小于或等于
> //大于
>==//大于或等于
布尔运算符
布尔运算符非常重要
逻辑非(!)
可以应用于任何值。无论这个值是什么类型都会返回一个布尔值,当这个布尔值是求反后的结果
var num = 1;
var boo = !num;//false
但是使用两个逻辑非就会有和类型装换函数一样的效果
var num = 1;
var boo = !!num;//true
逻辑与(&&)
同样可以用于所以类型
如果第一个操作数为false就直接返回第一个操作数
如果第一个数为true则返回第二个操作数
var num1 = 1;
var num2 = NaN;
var test = num1 && num2;
console.log(test);//NaN;
操作数不是布尔值的情况下会按照Boolean()转型函数的规则来装换成布尔值进行比较
逻辑与的逻辑就是得两个操作数都为true才会得到ture,有一个为false就会返回false。如果第一个操作数是就是false那就不需要要看第二个操作数了所以会直接把第一个操作数返回,如果第一个操作数为true才会考虑第二操作数
逻辑或
由(||)表示
如果第一个操作数能转换为true就会返回第一个操作数
如果第一个操作数为false,则无论如何都会返回第二个操作数
var num1 = NaN;
var num2 = 2;
var test = num1 || num2
console.log(test);//2
逻辑或就是两个操作数中有其中一个为true就会返回true,所以第一个操作数为true时就不会考虑第二操作数,如果第一个操作数为fasle时返回第二操作数
三目运算符
condition? true case : false case
var a = 1;
var b = 3;
b > a ? console.log("b>a"):console.log("a>b")
//b>a