js - 補(bǔ)充(1) -- 運(yùn)算符

運(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)行操作

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容