Javascript中的運算符大多是由標點符號少數由關鍵字表示。可以根據其操作數的個數進行分類.大多數運算符是一個二元運算符,將兩個表達式合成一個比較復雜的表達式。還有需要注意的一點是運算符的優先級,它控制着運算符的執行順序,優先級高的運算符的執行總是優先於運算符低的運算符。進行以下大致的分類:
一、算術運算符
算術運算符包括一元算術運算符和二元算術運算符兩種。
1、一元運算符
一元算術運算符包括一元加法(+)、一元減法(-)、遞增(++)和遞減(--)。只對一個表達式執行操作,並產生一個新值。
+/-:一元加減運算符
一元加法運算符把操作數轉換為數字或者是NaN(用函數Number());
一元減法運算符它會根據需要把操作數轉換為數字,然后改變運算結果的符號。
所以可以看出一元的加和一元減運算符主要用於基本的算術運算,也可以用於轉換數據類型
<script>
let a=25; let b='1.1'; let c=false; let d=1.1; let e=NaN; let f=undefined; a=+a; b=+b; c=+c; d=+d; e=+e; f=+f; a1=-a; b1=-b; c1=-c; d1=-d; e1=-e; f1=-f; console.log(a,b,c,d,e,f);//25 1.1 0 1.1 NaN NaN
console.log(a1,b1,c1,d1,e1,f1);//-25 -1.1 -0 -1.1 NaN NaN
</script>
++/--:遞增和遞減
運算符對其操作數進行加1或者是減1的操作,操作數是一個左值(value)。運算符將操作數轉換為數字,然后給數字加1或者是減1,並將加1或減1后的數值重新賦值給變量,數組元素或者對象屬性。
"++"運算符的返回值依賴於它相對於操作數的位置。當運算符在操作數之前稱為”前增量“運算符,當運算符在操作數之后稱為”后增量“。
如果只操作自己:++放在前面還是后面是一樣的,讓自己加1;
--放在操作符的前面或者后面是一樣的,讓自己減1;
如果是操作別人(在賦值給其它的變量):
++放在后面,先把自己賦值給另外一個變量,自己再加1;++放在前面,先把自己加1賦值給另外一個變量,然后自己再加一個1;
--放在后面,先把自己賦值給另外一個變量,自己再減1;--放在前面,先把自己減1然后賦值給另外一個變量,然后自己再減一個1;
不管是前增還是后增,這個運算符通常用在for循環中,用於控制循環內的計數器
<script>
let n = 10; let b = 20; n++; //11
n--; //10
b--; //19
--b; //18
//console.log(n,b);
let c1 = 1; //2
let d1 = c1++; //1
let c2 = 1; //2
let d2 = ++c2; //2
console.log(c1,d1,c2,d2); let e1=0; //-1
let f1=--e1; //-1
let e2=0; //-1
let f2=e2--; //0
console.log(e1,f1,e2,f2); </script>
2、二元運算符
二元運算符包括+,-,*,、/,%(求余)
加法(+):
在多數的程序設計語言中,加法通常是簡單的數字運算符,但在Javascript中,加法可以進行數字和數字的相加,也可進行字符串的相加。所有其它類型的值都會自動轉換成這兩種類型的值(這其中涉及到隱式類型的轉換,Number()將值轉換為數字,toString()將值轉換成字符串)。
遵循如下的規則:
如果其中一個操作數是對象,則對象會轉換成原始值,日期對象通過toString()進行轉換,其它對象能過valueOf()方法進行轉換。由於多數對象valueOf()方法無法返回一個原始值,所以還是通過toString()方法來執行轉換,轉成一個字符串;
【注意】:除了單數值數組會轉換為數字外
在進行了對象到原始值的轉換后,如果其中一個操作數是字符串,另一個操作數也會轉換成字符串,進行字符串連接;否則,兩個操作數都將轉換成數字或NaN,進行加法操作。
知識點回顧:
在Javascript有兩種類型的值:基本類型:undefined, null, boolean, number,string,symbol,bigInt 引用類型:Array,[],function......
從上面在原則中我們可以看出加法運算會觸發三種類型的轉換:轉為原始值,轉為數字,轉為字符串。
轉原始值能過ToPrimitive()方法:如果是一個原始值,則直接返回,如果是一個對象,則用obj.value()方法,如果返回的是原始值,那就是這個原始值,如不是調用obj.toString()方法,如果返回值是一個原始值,那就返回這個原始值,再不是那就是拋出異常。
<script>
let a = 1; let b = ''; let c = '1'; let d = [1, 2]; let e = NaN; let f = undefined; let g = false; let h = { valueof: function () { return vuleof; } } let n = [2]; let m = null; //原生對象轉成字符串
console.log(a, a + b); //1 "1"
console.log(a, a + c);//1 "11"
console.log(a, a + d);//1 "11,2"
console.log(a, a + e);//1 NaN
console.log(a, a + f);//1 NaN
console.log(a, a + g);//1 1
console.log(a, a + h);//1 "1[object Object]"
console.log(a+new Date());// 1Wed Nov 06 2019 10:04:45 GMT+0800 (中國標准時間)
//特例:單數值組和valueof()返回為數值的自定義對象會轉換為數值
console.log(a,a+n); //1 "12"
//如果進行算術加法,undefined轉換成'undefined',null轉換成'null',false轉換成0,true轉換成1
console.log(f+f); //NaN
console.log(e+e); //NaN
console.log(g+g); //0
//如果進行字符串連接,undefined轉換成'undefined',null轉換成'null',false轉換為'false',true轉換為'true'
console.log(c+d); console.log(c+e); console.log(c+f); console.log(c+g); console.log(c+m); //所以利用加號運算的特性,可以+任意的字符串
減法(-):
減法的話只涉及到數字的減法運算,使用Number()轉型函數將非數值類型轉為數值或者是NaN.
<script>
// undefined轉換為NaN,null轉換為0,false轉換為0,true轉換為1
console.log(1-{});//NaN
console.log(1-[]);//1
console.log(1-[1,2]);//NaN
console.log(1-NaN);//NaN
console.log(1-undefined); //NaN
</script>
乖法(*):
用於計算兩個數值的乖積,會通過Numbe()方法將非數值轉換成數值或者是NaN.
<script> console.log(1*{});//NaN
console.log(1*[]);//0
console.log(1*[1,2]);//NaN
console.log(1*NaN);//NaN
console.log(1*undefined); //NaN
</script>
除法(/):
執行第一個操作數除以第二個操作數的運算,通過Number()轉型將非數值類型轉換為數值或NaN
<script> console.log(1/{});//NaN
console.log(1/[]);//Infinity
console.log(1/[1,2]);//NaN
console.log(1/NaN);//NaN
console.log(1/undefined); //NaN
</script>
求模(%):
取模的時候如果前面的數字比后面的小,那得到的值就是前面的數字,求模結果與第一個操作數的符號保持一致,前面的數字為infinity,后面的數字為0時,結果為NaN。
<script> console.log(3%5);//3
console.log(-5%1);//0
console.log(1%{});//NaN
console.log(1%[]);//Infinity
console.log(1%[1,2]);//NaN
console.log(1%NaN);//NaN
console.log(1%undefined); //NaN
</script>