JavaScript運算符


運算符


JavaScript中運算符主要用於鏈接簡單表達式,組成一個複雜的表達式。常見的有算數表達式、比較表達式、邏輯表達式、賦值表達式等,也有單目運算符,指操做原始表達式。大多數運算符都由標點符號組成(+、>=、!),也有關鍵字表示的運算符,如typeof、delete、instanceof等。javascript

一些運算符能夠做用於任何數據類型(typeof),但大部分操做符但願操做數是特定的類型,並且大部分操做符會計算出(咱們也常說返回)一個特定類型的值(typeof返回的全是string)。在JavaScript中運算符一般會根據須要對操做數進行類型轉換,乘法操做符但願操做數是數字,可是 "3" * "5"也是合法的,JavaScript會自動將其轉換爲數字計算,返回Number 15。前端

有些操做符對不一樣的數據類型有不一樣的含義,好比 +java

  • 在兩個操做數都是數字的時候,會作加法運算
  • 兩個參數都是字符串或在有一個參數是字符串的狀況下會把另一個參數轉換爲字符串作字符串拼接
  • 在參數有對象的狀況下會調用其valueOf或toString(valueof的優先級大於tpstring)
  • 在只有一個字符串參數的時候會嘗試將其轉換爲數字
  • 在只有一個數字參數的時候返回其正數值
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
複製代碼

運算符類型


算數運算符

  • 加法運算符(Addition):x + y
  • 減法運算符(Subtraction): x - y
  • 乘法運算符(Multiplication): x * y
  • 除法運算符(Division):x / y
  • 餘數運算符(Remainder):x % y
  • 自增運算符(Increment):++x 或者 x++
  • 自減運算符(Decrement):--x 或者 x--
  • 求負運算符(Negate):-x
  • 數值運算符(Convert to number): +x

賦值運算符

賦值運算符用於給變量賦值,最多見的賦值運算符,固然就是等號,表達式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

  • = 大於或等於函數


布爾運算符

  • ! 取反運算符
  • && 且運算符
  • || 或運算符
  • condition? true case : false case 三元條件運算符

位運算符

  • 或運算(or):符號爲|,表示兩個二進制位中有一個爲1,則結果爲1,不然爲0。
  • 與運算(and):符號爲&,表示兩個二進制位都爲1,則結果爲1,不然爲0。
  • 否運算(not):符號爲~,表示將一個二進制位變成相反值。
  • 異或運算(xor):符號爲ˆ,表示兩個二進制位中有且僅有一個爲1時,結果爲1,不然爲0。
  • 左移運算(left shift):符號爲<<
  • 右移運算(right shift):符號爲>>
  • 帶符號位的右移運算(zero filled right shift):符號爲>>>

其餘


小括號

在JavaScript中,圓括號是一種運算符,它有兩種用法:若是把表達式放在圓括號之中,做用是求值;若是跟在函數的後面,做用是調用函數。post

把表達式放在圓括號之中,將返回表達式的值。測試


void

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

MDN運算符優先級

有幾個咱們須要注意的地方

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會幫咱們作類型轉換,形成一些匪夷所思的結果,那麼使用==的時候會在哪些狀況下作類型轉換,又會換成什麼樣子?

  • 若是兩個值類型相同,則執行嚴格相等的運算
  • 若是兩個值的類型不一樣 1.若是一個是null,一個是undefined,那麼相等 2.若是一個是數字,一個是字符串,先將字符串轉爲數字,而後比較 3.若是一個值是true/false則將其轉爲1/0比較 4.若是一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換後比較 5.其它就不相等了
null==undefined;
NaN==NaN
"1"==true
複製代碼

解密類型轉換

ps: 不要在工做中出現下面相似的誤導性的寫法


if的判斷

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

答案

  • 1,3,4,5爲 true
  • 2 爲 false

== 的判斷

對於==的判斷,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

toNumber

type Result
Undefined NaN
Null 0
Boolean ture -> 1, false -> 0
String 「abc」 -> NaN, 「123」 -> 123

toPrimitive

對於 Object 類型,先嚐試調用 .valueOf 方法獲取結果。 若是沒定義,再嘗試調用 .toString方法獲取結果

相關文章
相關標籤/搜索