運(yùn)算符
大多數(shù)的運(yùn)算符是由標(biāo)點(diǎn)符號(hào)表示的,比如"=","+"。還有由關(guān)鍵字表示,如:delete,instanceof
這里有我想到的大部分的運(yùn)算符

符號(hào)表.png
- 結(jié)合性:L(從左到右運(yùn)算),R(從右到左運(yùn)算)
- 類型:期望的操作類型,-> 之后的為期望的結(jié)果類型
- lval:一個(gè)古老的術(shù)語,“左值”(left-value):表達(dá)式只能出現(xiàn)在賦值運(yùn)算符的左側(cè)
- str: string
- bool: boolean
- &: 按位與
var a = 9;
9 --二進(jìn)制--> 1001
補(bǔ)足32位:0000 0000 0000 0000 0000 0000 0000 1001
var b = 5;
5 --二進(jìn)制--> 101
補(bǔ)足32位:0000 0000 0000 0000 0000 0000 0000 0101
a & b = 9 & 5
9和5中每一位都進(jìn)行比較,如果兩個(gè)均為1,則輸出1,若其中有一個(gè)不為1,則輸出0;
結(jié)果為:
0000 0000 0000 0000 0000 0000 0000 0001 ----> 1
console.log(a & b) // => 1
- |: 按位或同上,只要一個(gè)為1,則輸出1. 上述結(jié)果為console.log(a | b) = 13
- ^: 同,兩數(shù)相等,輸出0.反之輸出1.上述結(jié)果為console.log(a ^ b) = 12
- ~: 按位求反
var a = 5
5 --二進(jìn)制--> 1001
補(bǔ)足32位:0000 0000 0000 0000 0000 0000 0000 0101
取反:1111 1111 1111 1111 1111 1111 1111 1010
因?yàn)殚_頭為1,則為負(fù)數(shù),先反碼:0000 0000 0000 0000 0000 0000 0000 0101
再+1得到補(bǔ)碼:
0000 0000 0000 0000 0000 0000 0000 0110 --十進(jìn)制--> -6
- <<: 左位移
a << 2
var a = 5
5 --二進(jìn)制--> 1001
補(bǔ)足32位:0000 0000 0000 0000 0000 0000 0000 0101
即向左移動(dòng)兩位:0000 0000 0000 0000 0000 0000 0001 0100 --十進(jìn)制--> 20
(左移1位相當(dāng)于x2,左移2位相當(dāng)于x4)
- 帶符號(hào)右移
正數(shù):
5 >> 2
5 --二進(jìn)制--> 1001
補(bǔ)足32位:0000 0000 0000 0000 0000 0000 0000 0101
右移2位:0000 0000 0000 0000 0000 0000 0000 0001(高位補(bǔ)0) --十進(jìn)制--> 1
console.log(5 >> 2) // => 1
負(fù)數(shù):
-5 >> 2
5 --二進(jìn)制--> 1001
補(bǔ)足32位:0000 0000 0000 0000 0000 0000 0000 0101
取反:1111 1111 1111 1111 1111 1111 1111 1010
再+1,得補(bǔ)碼:1111 1111 1111 1111 1111 1111 1111 1011
右移兩位,高位補(bǔ)1:1111 1111 1111 1111 1111 1111 1111 1110 --十進(jìn)制--> -2
console.log(-5 >> 2) // => -2
- 無符號(hào)右移
>>>: 同 >> 運(yùn)算,不同的是高位總是補(bǔ)0
- =,==,===
盡管這三個(gè)符號(hào)都稱為“相等”,但為了減少概念混淆,則
"=": 可稱“賦值或者得到”。
"==": 可稱為“相等”.
"===": 可稱為“恒等,也叫嚴(yán)格相等”.
另"!"為邏輯非,“!=”為不相等,“!==”為不完全相等
之前文中提到的:
- 當(dāng) “==” 兩邊數(shù)據(jù)類型不相等時(shí),相等運(yùn)算符會(huì)嘗試進(jìn)行一些數(shù)據(jù)轉(zhuǎn)換
- 而 “===“ 不僅要求數(shù)據(jù)相等,數(shù)據(jù)類型要求相等
- 比較運(yùn)算符
”<“,">","<=",">="
比較操作符的操作數(shù)可能是任意值,但是只有數(shù)字和字符才能真正執(zhí)行
如:
1 < 2 // => true
"one" < 3 // => false
"Zoo" < "addrdvark" // => true
ASCII字母中 “大寫”字母 < "小寫"字母
- in
in運(yùn)算符期望左側(cè)是個(gè)字符串或者可以轉(zhuǎn)為字符串,右側(cè)則是個(gè)對(duì)象
var point = {x:1, y:2}
"x" in point // => true
"z" in point // => false
"toSreing" in poiont // => true(point是個(gè)對(duì)象,繼承toString方法)
var data = [7,8,9]
"0" in point // => true
1 in point // => true
3 in point // => false,沒有索引3
- instanceof
instanceof期望左側(cè)是一個(gè)對(duì)象,右側(cè)為標(biāo)識(shí)符對(duì)象的類
var d = new Date()
d instanceof Date // => true,d是由Date創(chuàng)建的
d instanceof Object // => true,對(duì)象是Object實(shí)例
d instanceof Number // => false,d不是一個(gè)Number對(duì)象
var a = [1, 2, 3]
a instanceof Array // => true
a instanceof Object // => true
a instanceof RegExp // => false,數(shù)組不為正則
注:理解instanceof如何工作,參考“原型鏈”。(以后會(huì)詳細(xì)說明)
為了計(jì)算表達(dá)式o instanceof f,首先會(huì)計(jì)算f.prototype,然后在原型鏈中找o,如果找到,那么o是f(或f的父類)的一個(gè)實(shí)例,返回true,反之則返回false。
- “&&”, “||”, “!”
邏輯運(yùn)算符
邏輯與:&&
全部為真值時(shí)返回true
邏輯與可以從三個(gè)層次去理解
1.第一個(gè)層次,最簡單的一層:當(dāng)操作數(shù)都是布爾值時(shí),若都為true,則返回true,反之,返回false
2.可以對(duì)真值和假值進(jìn)行布爾操作,都為真,返回一個(gè)真值
3.運(yùn)算符首先計(jì)算左側(cè),若為假,則一定返回false,則不會(huì)去計(jì)算右側(cè)的表達(dá)式。
邏輯或:||
至少一個(gè)真值返回true
邏輯非:!
是一個(gè)一元運(yùn)算符,目的是將操作數(shù)取反
優(yōu)先級(jí):"!" > "&&" > "||"
這里有幾個(gè)對(duì)上表的解釋:

賦值運(yùn)算.png
- 三元運(yùn)算符
a ? b : c
條件a是否成立,成立,執(zhí)行b,不成立,執(zhí)行c
如:
x > 0 ? x : -x // 求x的絕對(duì)值
一個(gè)“?:”的典型應(yīng)用場景
greeting = "hello";
if(username){
greeting += username;
}else{
greeting += "there";
}
上述可以等價(jià)于
greeting = "hello" + (username ? username : "there");
- typeOf運(yùn)算符
typeof最常用的用法是寫在表達(dá)式中
typeof [val] == "string" ? "'" + [val] + "'" : [val]
如:
typeof null = 'object'
- delete運(yùn)算符
delete可以刪除一個(gè)屬性或者一個(gè)元素,但并不是將其“抹掉”,而是替換一個(gè)undefined
var a = {x: 1, y: 2}
delete a.x
"x" in a // => false,x不存在
var a = [1, 2, 3]
delete a[2] // =>delete索引2;
2 in a // => false
a.length // => 3,數(shù)組長度未改變
delete a // => false,不能刪除var聲明的變量
delete 1 // => 對(duì)象不是一個(gè)左值,返回true,不進(jìn)行操作