1. 算術(shù)運(yùn)算符
+
加
-
減
*
乘
/
除
%
余
算術(shù)優(yōu)先級(jí) *
/
%
優(yōu)先級(jí)要高于 +
-
無(wú)論是 +
-
*
/
%
都是左結(jié)合性(從左至右計(jì)算)
var num1 = 10;
var num2 = 20;
var res1 = num1 + num2;
console.log(res1); // 30
var res2 = num1 - num2;
console.log(res2); // -10
var res3 = num1 * num2;
console.log(res3); // 200
var res4 = num2 / num1;
console.log(res4); // 2
var res5 = num2 % num1;
console.log(res5); // 0
1.1 加法運(yùn)算的注意點(diǎn)
-
任何非數(shù)值類(lèi)型的數(shù)據(jù)在參與加法運(yùn)算之前,都會(huì)被轉(zhuǎn)成數(shù)值類(lèi)型,再參與運(yùn)算
var num1 = 1; // 先把true轉(zhuǎn)換成數(shù)值類(lèi)型,轉(zhuǎn)成1 var num2 = true; // 計(jì)算 1 + 1 var res1 = num1 + num2 console.log(res1); // 2 // null 轉(zhuǎn)換成數(shù)值類(lèi)型0 var res2 = 1 + null; console.log(res2); // 1
-
任何數(shù)據(jù)和NaN進(jìn)行運(yùn)算,結(jié)果都是NaN
// undefined 轉(zhuǎn)換成數(shù)值類(lèi)型 NaN var res3 = 1 + undefined; console.log(res3); // NaN // 字符串轉(zhuǎn)換成數(shù)值類(lèi)型 NaN var res4 = 1 + Number("abc"); console.log(res4); // NaN
-
任何數(shù)據(jù)和字符串類(lèi)型相加,都會(huì)被先轉(zhuǎn)換成字符串之后再運(yùn)算
// 加法運(yùn)算只要有字符串類(lèi)型都是字符串的拼接 var res5 = 1 + "abc"; console.log(res5); // 1abc
1.2 減法運(yùn)算注意點(diǎn)
-
任何非數(shù)值類(lèi)型的數(shù)據(jù)在參與減法運(yùn)算之前,都會(huì)被自動(dòng)轉(zhuǎn)換成數(shù)值類(lèi)型之后再參與運(yùn)算
var res1 = 1 - true; console.log(res1); // 0 var res2 = 1 - null; console.log(res2); //1
-
任何數(shù)據(jù)和NaN進(jìn)行運(yùn)算,結(jié)果都是NaN
var res3 = 1 - undefined; console.log(res3); // NaN var res5 = 1 - 'abc'; console.log(res5); // NaN
-
任何數(shù)據(jù)和字符串相減,都會(huì)把字符串轉(zhuǎn)換成數(shù)值類(lèi)型之后再運(yùn)算
var res4 = 1 - '12'; console.log(res4); // -11
1.3 乘法注意點(diǎn)
- 和減法運(yùn)算的注意點(diǎn)一模一樣
var res1 = 1 * true;
console.log(res1); // 1
var res2 = 1 * null;
console.log(res2); // 0
var res3 = 1 * undefined;
console.log(res3); // NaN
var res4 = 1 * '12';
console.log(res4); // 12
var res5 = 1 * 'abc';
console.log(res5); // NaN
1.4 取模(取余)運(yùn)算注意點(diǎn)
格式: m % n
= 余數(shù)
-
如果m>n的, 那么就正常取余
var res1 = 10 % 3; console.log(res1); // 1
-
如果m<n的, 那么結(jié)果就是m
var res2 = 3 % 4; console.log(res2); // 3
-
如果n是0, 那么結(jié)果就是NaN
var res3 = 10 % 0; console.log(res3); // NaN
-
取余運(yùn)算結(jié)果的正負(fù)性, 取決于m而不是n
var res4 = 10 % -2; console.log(res4); // 0 var res5 = -10 % 2; console.log(res5); // -0 var res6 = -10 % -2; console.log(res6); // -0
2. 賦值運(yùn)算符
賦值運(yùn)算符就是將等號(hào)右邊的值存儲(chǔ)到等號(hào)左邊的變量中
2.1 賦值運(yùn)算符
=
、+=
加等于贬墩、-=
減等于媳危、*=
乘等于惠勒、/=
除等于止状、%=
模等于
// =
// 把5賦值給res這個(gè)變量
var res = 5;
// 加等于
var number = 3;
// 會(huì)將等號(hào)左邊存儲(chǔ)的值取出來(lái)和右邊進(jìn)行指定的運(yùn)算, 運(yùn)算完畢之后再將運(yùn)算的結(jié)果存儲(chǔ)到左邊
// number += 2 相當(dāng)于 number = number + 2 那么就是 number = 3 + 2
// -=币励、*=、/=、%=恳守、也是一樣的步驟
number += 2;
console.log(number); // 5
2.2 賦值運(yùn)算的優(yōu)先級(jí)和結(jié)合性
-
賦值運(yùn)算優(yōu)先級(jí)低于算術(shù)運(yùn)算
// 由于算術(shù)運(yùn)算符的優(yōu)先級(jí)高于賦值運(yùn)算符,所以先計(jì)算1+1然后把結(jié)果賦值給res1這個(gè)變量 var res1 = 1 + 1 console.log(res1); // 2
賦值運(yùn)算符的結(jié)合性是右結(jié)合性(從右至左的計(jì)算)
// 由于賦值運(yùn)算符的結(jié)合性是右結(jié)合性,所以將會(huì)把5賦值給num2然后再將num2中的值賦給num1
var num1, num2;
num1 = num2 = 5;
console.log(num1); // 5
console.log(num2); // 5
- 賦值運(yùn)算符的左邊只能放變量贩虾,不能放常量
3. 自增自減運(yùn)算符
3.1 自增運(yùn)算符 ++
可以快速的對(duì)一個(gè)變量中保存的數(shù)據(jù)進(jìn)行+1的操作
var num1 = 2;
//num1 = num1 + 1
// num1 += 1; ===> num1 = num1 + 1;
// num++; ===> num1 = num1 + 1;
++num1
console.log(num1); // 3
3.2 自減運(yùn)算符 --
可以快速的對(duì)一個(gè)變量中保存的數(shù)據(jù)進(jìn)行-1的操作
let num2 = 2;
// num2 = num2 - 1;
// num2 -= 1; ===> num2 = num2 - 1
// num2--; ===> num2 = num2 - 1
--num2;
console.log(num2); // 1
3.3 自增自減寫(xiě)在變量前面和后面的區(qū)別
- 自增自減寫(xiě)在變量的前面催烘,表示變量先自增或自減,然后再參與其他運(yùn)算
- 自增自減寫(xiě)在變量的后面缎罢,表示變量先進(jìn)行運(yùn)算伊群,然后再自增或自減
// 寫(xiě)在變量的后面
var num = 1;
// 這里拆解成這樣 var res = 1 + 1; num++;
var res = num++ + 1;
console.log(res); // 2
console.log(num); // 2
// 寫(xiě)在變量的前面
var num = 1;
// 這里拆解成這樣 ++num; var res = 2 + 1;
var res = ++num + 1;
console.log(res); // 3
console.log(num); // 2
// 在企業(yè)開(kāi)發(fā)中不推薦這樣寫(xiě)法 var res = a++ + b; // var res = a + b; a++;
var a = 5;
var b = 10;
var res = a + b;
a++;
console.log(res); // 15
console.log(a); // 6
4. 關(guān)系運(yùn)算符
>
大于
<
小于
>=
大于等于
<=
小于等于
==
等于
!==
不等于
===
全等于
!==
不全等于
關(guān)系運(yùn)算符只有兩個(gè)返回值,true
和 fasle
關(guān)系成立策精,返回 true
關(guān)系不成立舰始,返回 false
console.log(1 > 2); // false
console.log(5 > 2); // true
console.log(1 == 1); // true
關(guān)系運(yùn)算符的注意點(diǎn)
-
如果是非數(shù)值類(lèi)型比較,那么會(huì)先轉(zhuǎn)換成數(shù)值類(lèi)型再比較
console.log(1 > false); // true console.log(1 > true); // false console.log(1 > undefined); // false console.log(1 > null); // true console.log(1 > ''); // true console.log(1 > ' '); // true console.log(1 > 'a'); //flase
-
對(duì)于關(guān)系運(yùn)算符來(lái)說(shuō)咽袜,任何數(shù)據(jù)和
NaN
比較都是false
console.log(1 > NaN); // false console.log(undefined == NaN); // false console.log(null == NaN); // false console.log('a' > NaN); // false console.log(true == NaN); // false //如果想判斷某一個(gè)數(shù)據(jù)是否是NaN那么可以通過(guò)isNaN來(lái)進(jìn)行判斷 let num = NaN; let res = isNaN(num) console.log(res); // true
-
如果是兩邊都是字符串類(lèi)型丸卷,那么不會(huì)轉(zhuǎn)換成數(shù)值類(lèi)型,而是比較字符串相對(duì)應(yīng)的Unicode編碼
console.log('a' > 'b'); // false console.log('a' < 'b'); // true // 如果字符串中有多個(gè)字符, 會(huì)從左至右的依次比較, 直到條件不滿(mǎn)足為止 console.log( "ab" > "ac"); // false
-
===
和!==
會(huì)比較值和數(shù)據(jù)類(lèi)型是否相等==
和!=
只會(huì)比較值console.log("123" == 123); // true console.log("123" != 123); // false console.log("123" === 123); // false console.log("123" !== 123); // true
-
關(guān)系運(yùn)算符都是左結(jié)合性(從左往右運(yùn)算)
// 因?yàn)殛P(guān)系運(yùn)算符是左結(jié)合性 所以會(huì)先運(yùn)算 10 > 3 返回 true 再計(jì)算 1 > 2 最后的結(jié)果為false console.log(10 > 3 >2); // STEP1 10 < 25 返回true STEP2 運(yùn)算 1 < 20 結(jié)果為true console.log(10 < 25 < 20);
-
關(guān)系運(yùn)算符中
>
大于询刹、<
小于谜嫉、>=
大于等于、<=
小于等于的優(yōu)先級(jí)大于==
凹联、!=
沐兰、===
、!==
// 先會(huì)計(jì)算 10 > 3 返回 true 再計(jì)算 1 == 5 最后結(jié)果返回false console.log(10 > 3 == 5); // 先會(huì)計(jì)算 10 > 0 返回 true 再計(jì)算 10 == 1 最后結(jié)果false console.log(10 == 10 > 0);
5. 邏輯運(yùn)算符
邏輯運(yùn)算符往往用于多個(gè)表達(dá)式的求值蔽挠。
5.1 邏輯與(&&
)
格式: 條件表達(dá)式A
&& 條件表達(dá)式B
返回值: true/false
特點(diǎn):如果有一個(gè)條件表達(dá)式為假則為假
// true && false 結(jié)果為false
console.log((10 > 5) && (1 > 2)); // false
console.log(true && true); // true
console.log(true && false); // false
console.log(false && false); // false
5.2 邏輯或(||
)
格式: 條件表達(dá)式A
&& 條件表達(dá)式B
返回值: true/false
特點(diǎn):如果有一個(gè)條件表達(dá)式為真則為真
// true || false 結(jié)果為true
console.log((10 > 5) || (1 > 2)); // true
console.log(true || true); // true
console.log(true || false); // true
console.log(false || false); // false
5.3 邏輯非(!
)
格式: 住闯!條件表達(dá)式
返回值: true/false
特點(diǎn):真變假,假變真
// 非true 就是 false
console.log( !true ); // false
// 先計(jì)算括號(hào)里的 1 > 2 返回 false 取反 變?yōu)?true
console.log( !(1 > 2) ); // true
5.4 邏輯運(yùn)算符的優(yōu)先級(jí)和結(jié)合性
邏輯運(yùn)算符的結(jié)合性是左結(jié)合性
邏輯與的優(yōu)先級(jí)大于邏輯或
// 左結(jié)合性就是從左往右運(yùn)算 就計(jì)算 true && false 結(jié)果為 false
var res = true && false;
console.log(res); // false
// 賦值運(yùn)算就是右結(jié)合性 先運(yùn)算 1 + 1 返回把結(jié)果賦值給 res 這個(gè)變量
var total = 1 + 1
console.log(total); // 2
5.5 邏輯運(yùn)算符的注意點(diǎn)
-
在邏輯與運(yùn)算中, 如果參與運(yùn)算的不是布爾類(lèi)型, 返回值有一個(gè)特點(diǎn)
如果條件A不成立, 那么就返回條件A
如果條件A成立, 無(wú)論條件B是否成立, 都會(huì)返回條件B
// 條件A為flase 那么就會(huì)返回條件A 值為0 console.log(0 && 123); // 0 // 條件A為true 那么條件B 不論真假都會(huì)返回B console.log(1 && 123); // 123
-
在邏輯或運(yùn)算中, 如果參與運(yùn)算的不是布爾類(lèi)型, 返回值有一個(gè)特點(diǎn)
如果條件A成立, 那么就返回條件A
如果條件A不成立, 無(wú)論條件B是否成立, 都會(huì)返回條件B
// 條件A為flase 那么就會(huì)返回條件B 值為123 console.log(0 || 123); // 123 // 條件A為true 那么條件B 不論真假都會(huì)返回A 值為1 console.log(1 || 123); // 1
6. 三元(目)運(yùn)算符
三元運(yùn)算符格式:條件表達(dá)式 ? 返回結(jié)果A : 返回結(jié)果B
在三元運(yùn)算符中如果條件表達(dá)式為真澳淑,那么返回結(jié)果A
在三元表達(dá)式中如果條件表達(dá)式為假比原,那么返回結(jié)果B
// 10 > 6 返回 true 返回條件A Hello
console.log(10 > 6 ? 'Hello' : 'World'); // Hello
// 5 > 6 返回 false 返回條件B World
console.log(5 > 6 ? 'Hello' : 'World'); // World