JavaScript中運算符主要用於鏈接簡單表達式,組成一個複雜的表達式。常見的有算數表達式、比較表達式、邏輯表達式、賦值表達式等,也有單目運算符,指操做原始表達式。大多數運算符都由標點符號組成(+、>=、!),也有關鍵字表示的運算符,如typeof、delete、instanceof等。javascript
一些運算符能夠做用於任何數據類型(typeof),但大部分操做符但願操做數是特定的類型,並且大部分操做符會計算出(咱們也常說返回)一個特定類型的值(typeof返回的全是string)。在JavaScript中運算符一般會根據須要對操做數進行類型轉換,乘法操做符但願操做數是數字,可是 "3" * "5"也是合法的,JavaScript會自動將其轉換爲數字計算,返回Number 15。前端
有些操做符對不一樣的數據類型有不一樣的含義,好比 +java
console.log(2+4);//6
console.log("2"+"4");//"24"
console.log(2+"4");//"24"
console.log(2+new Date());//"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"
console.log(+"4");//4
複製代碼
賦值運算符用於給變量賦值,最多見的賦值運算符,固然就是等號,表達式x=y表示將y賦值給x。除此以外,JavaScript還提供其餘11個賦值運算符。express
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個比較運算bash
大於ide
= 大於或等於函數
在JavaScript中,圓括號是一種運算符,它有兩種用法:若是把表達式放在圓括號之中,做用是求值;若是跟在函數的後面,做用是調用函數。post
把表達式放在圓括號之中,將返回表達式的值。測試
void運算符的做用是執行一個表達式,而後返回undefined。ui
逗號運算符用於對兩個表達式求值,並返回後一個表達式的值。
結合性是指多個具備一樣優先級的運算符表達式中的運算順序。有的運算符是左結合的,即運算從左到右執行,下面兩個運算是同樣的
w = x + y + z;
w = (x + y) + z;
複製代碼
有的運算符是右結合的
w = x = y = z;
w = (x = (y = z));
w = a: b: c ? d : e? f : g;
w = a? b : (c? d: (e? f : g));
複製代碼
運算符的優先級《JavaScript權威指南》中有個表闡述的很好(我去掉了位運算部分),其中R/L表明結合性是右結合仍是左結合,num->num表示操做符指望的數據類型和計算結果類型,lval指左值
運算符 | 操做 | 結合性 | 類型 |
---|---|---|---|
++ | 自增 | R | lval->num |
-- | 自減 | R | lval->num |
- | 求反 | R | num->num |
+(一個操做數) | 轉換爲數字 | R | num->num |
~ | 按位求反 | R | int->int |
! | 邏輯非 | R | bool->bool |
delete | 刪除屬性 | R | lval->bool |
typeof | 檢測數據類型 | R | any->str |
void | 返回undefined | R | any->undefined |
------ | ------ | ---- | ---- |
------ | ------ | ---- | ---- |
*、/、% | 乘、除、求餘 | L | num,num->num |
------ | ------ | ---- | ---- |
------ | ------ | ---- | ---- |
+、- | 加、減 | L | num,num->num |
+ | 字符串拼接 | L | str,str->str |
<、<=、>、>= | 數字大小或字母表順序 | L | num/str,num/str->bool |
instanceof | 對象類型 | L | obj,function->bool |
in | 測試屬性是否存在 | L | str,obj->bool |
------ | ------ | ---- | ---- |
------ | ------ | ---- | ---- |
== | 判斷相等 | L | any,any->bool |
!= | 判斷不等 | L | any,any->bool |
=== | 判斷恆等 | L | any,any->bool |
!== | 判斷非恆等 | L | any,any->bool |
------ | ------ | ---- | ---- |
------ | ------ | ---- | ---- |
&& | 邏輯與 | L | any,any->any |
|| | 邏輯或 | L | any,any->any |
?: | 條件運算符 | R | bool,any,any->any |
=賦值 *=、/=、+=、-= | 賦值 運算且賦值 | R | lval,any->any |
, | 忽略第一個操做數,返回第二個操做數 | L | any,any->any |
有幾個咱們須要注意的地方
1.typeof的優先級至關的高,比加減乘除神馬的都高,因此雖然是操做符,在在複雜表達式的時候咱們仍是習慣加括號,看個例子
typeof 2*3;//NaN
typeof (2*3);//"number"
typeof 2+3;// "number3"
複製代碼
2.++、--是右結合的操做符(優先級最高的幾個都是右結合),並且比加減乘除優先級高。同時自增、自減運算符的運算數得是左值(能夠放在賦值符號左邊的值),而不能是常數
4++; //ReferenceError: Invalid left-hand side expression in postfix operation
var a=0,b=0;
a+++b;//0
a;//1,++優先級比+高,因此至關於(a++)+b
b;//0
複製代碼
3.賦值運算符的優先級至關的低
a = b == c; //等同於a = (b==c)
複製代碼
4.邏輯非!也在優先級隊列的前端,比加減乘除高,但邏輯與、邏輯或優先級很低,不如加減乘除
!2*0; //0, 等價於(!2)*0
5.一個關於邏輯運算符的有意思地方是其「短路」功能,相信你們都有所瞭解,但有些題目不那麼單純,會結合表達式計算值來考察
1 && 3;
1 && "foo" || 0;
1 || "foo" && 0
複製代碼
瞭解了邏輯運算符的「短路」特色,在知道原始表達式的「返回值」就是自己,題目就很簡單了
咱們知道可使用==或===判斷兩個值的相等性,其中區別相信你們清楚,===是嚴格意義的相等,只需注意NaN和NaN不等就好了。而使用==的時候,javascript會幫咱們作類型轉換,形成一些匪夷所思的結果,那麼使用==的時候會在哪些狀況下作類型轉換,又會換成什麼樣子?
null==undefined;
NaN==NaN
"1"==true
複製代碼
ps: 不要在工做中出現下面相似的誤導性的寫法
if(xxx){
}
複製代碼
js 是如何處理的?作幾道測試題看一看(空字符串是false其餘字符串都是true,對象都是true)
// 題目1:以下代碼輸出什麼?
if ("hello") {
console.log("hello")
}
// 題目2:以下代碼輸出什麼?
if ("") {
console.log('empty')
}
// 題目3:以下代碼輸出什麼?
if (" ") {
console.log('blank')
}
複製代碼
// 題目4:以下代碼輸出什麼?
if ([0]) {
console.log('array')
}
// 題目5:以下代碼輸出什麼?
if('0.00'){
console.log('0.0 複製代碼
對於括號裏的表達式,會被強制轉換爲布爾類型
類型 | 結果 |
---|---|
Undefined | false |
Null | false |
Boolean | 直接判斷 |
Number | +0, −0, 或者 NaN 爲 false, 其餘爲 true |
String | 空字符串爲 false,其餘都爲 true |
Object | true |
對於==的判斷,js是怎麼處理的?作幾道題看看(方法就是把==倆邊的都轉成number再進行比較,null==undefined要特殊的記起來)
"" == 0 //題目1
" " == 0 //題目2
"" == true //題目3
"" == false //題目4
" " == true //題目5
複製代碼
!" " == true //題目6
!" " == false //題目7
"hello" == true //題目8
"hello" == false //題目9
"0" == true //題目10
"0" == false //題目11
"00" == false //題目12
"0.00" == false //題目13
複製代碼
###題目
undefined == null //題目14
{} == true //題目15
[] == true //題目16
var obj = {
a: 0,
valueOf: function(){return 1}
}
obj == "[object Object]" //題目17
obj == 1 //題目18
obj == true //題目19
複製代碼
x | y | 結果 |
---|---|---|
null | undefined | true |
Number | String | x == toNumber(y) |
Boolean | (any) | toNumber(x) == y |
Object | String or Number | toPrimitive(x) == y |
otherwise | otherwise | false |
type | Result |
---|---|
Undefined | NaN |
Null | 0 |
Boolean | ture -> 1, false -> 0 |
String | 「abc」 -> NaN, 「123」 -> 123 |
對於 Object 類型,先嚐試調用 .valueOf 方法獲取結果。 若是沒定義,再嘗試調用 .toString方法獲取結果