JS基本操作

林品儒

2015/10/12

今日重點

數字系統

數學運算

位元運算

比較運算

邏輯運算

數字系統

數字系統

做運算之前先來點前前情提要...

重點A: 數字進位法

重點B: 數字表現實作

數字進位法

2進位

8進位

10進位

16進位

2進位

電腦使用的基本進位法

可用符號:0,1

前綴字:0b,0B

0b11010010

1x27+1x26+1x24+1x21

8進位

用在檔案權限管理

可用符號:0~7

前綴字:0

0755

7x82+5x81+5x80

10進位

給電腦用還得另外處理

...

16進位

用來表現2進位數

0xF vs 0b1111

可用符號:0~9,A~ F

前綴字:0x,0X

0xDEADFACE

13x167+14x166+10x165+13x164+ 15x163+10x162+12x161+14x160

數字表現實作

有號整數

無號整數

浮點數

補數系統

0b01101110 正數

0b10010001 1的補數

0b10010010 2的補數

至少知道關鍵字可以上網查

有號整數

使用2的補數

有1,2,4,8位元組的整數實作

數字範圍:-2(位元數-1)~2(位元數-1)-1

大部份的語言實作有號整數的方法

無號整數

直接表達該數字

有1,2,4,8位元組的整數實作

數字範圍:0~2位元數-1

沒有負號,非常正向

浮點數

IEEE 754

分為三部份:符號、指數、尾數

利用科學記號的方法表現數字

浮點數誤差

使用console.dir(obj)觀察

0.1+0.2

987654321+0.123456789

!!記得浮點數沒有稠密性!!

JS的數字

Number

使用IEEE754雙精度64位元浮點數作為實作

符號 指數 尾數
1 11 52

接下來

實際對數字進行運算啦~~

也可以對非數字NaN進行運算

數學運算

四則運算

取餘數

加法

+ +=

var a=0x16+10+010

a+=0b1100

NaN,Infinity做加法仍保持原樣

減法

- -=

var b=0x7f-255

b-=3

試試看Inifity減去Infinity

NaN是最強的

乘法

* *=

先乘除後加減

var c=15+3*5

c*=2.5

毫無反應,只是個NaN和Infinity

除法

/ /=

一樣先乘除後加減

var d=15+6*5/15

d/=1.7

0除以0為NaN,其他數除以0為正負無限大

取餘數

% %=

此運算也是先乘除後加減

var e=5+3*3%2*5

e%=0.2

!!注意浮點數的誤差又出現了!!

進階運算

萬惡的++以及--

使用Math物件

加加與減減

++ --

C語言統治世界啦!!

var a=b=1

c=a++

d=++b

能不要用就不要用...

Math物件

console.dir(Math)

以下內容按讚即可閱覽

當然還是要說明一下啊~~

常數定義

Math.PI

Math["SQRT1_2"]

Math['SQRT2']

記得Math是個物件

三角函數

角度吃弳度量

記得使用Math.PI

sin,cos,tan,csc,sec,cot

另有反三角函數回傳弳度量

對數函數

Math.log(n)

Math.log2(n)

Math.log10(n)

記得底數的不同

指數函數

Math.pow(x,y)

取得x的y次方

Math.pow(10,64)

也可以用來開方根

Math.pow(256,0.125)

接下來

JS的浮點數還有更加困難的挑戰...

位元運算

位元運算

以二進位法對位元進行操作

不是說JS是用浮點數嗎??

先轉換成32位元整數運算後再轉回來...

位元運算子

互斥或

左移,右移

反向

~

一元運算子

~0xff

把各位元位反向

&

0b1100&0b1010

2147483648&0x80000000

絕對不是BUG,這是功能

|

0b1100|0b1010

Math.pow(2,31)|1

正正得負...

互斥或

^

可以用來做簡單的加密解密

0b1100^0b1010

放棄吐嘈了...

左移

<<

將位元往左邊移動

相當於乘以2

1<<32

最大可以左移31

數學右移

>>

將位元向右移動並維持符號

相當於整數除法除以2

-0xFF1111>>16

-0xFF0000>>16

對於負數的計算要小心

位元右移

>>>

將位元右移左側補0

部份相當於整數除法除以2

2147483648>>16

2147483648>>>16

聰明的你是否不知道答案呢?

不要用

在JS中位元運算就是坑

那為何我還要說明

???

因為別的語言會用到...

接下來

JS恐怖的地方又來了...

JavaScript驚魂夜

比較運算

JS的相等性

分成嚴格相等(===)與相等(==)

張大眼睛看仔細

相等(==)

會轉換成相等型別再比較

"1"==1

undefined==null

儘量不要使用...

嚴格相等(===)

先比較型別是否相等

再比較非number的值是否相等

比較number是否相等或為正負0且兩者不為NaN

相近於強型別語言的相等運算

比較運算子

不相等,嚴格不相等

大於,大於等於

小於,小於等於

不相等(!=)

會轉型再比較是否不相等

"2"!=2

"1"!=true

反正也是很難用啦~~

嚴格不相等(!==)

不轉換型別直接比較

比較法類似於嚴格相等

誠心推薦保證不騙

大於(>)大於等於(>=)

一樣有型別轉換

"100">"99"

"100">99

用在同類型的比較運算就好

小於(<)小於等於(<=)

還是有型別轉換

null<0

null==0

null<=0

太恐怖了...

接下來

剩下簡單的邏輯運算

應該比上面講的簡單很多了...

邏輯運算

邏輯運算

反向(!)

且(&&)

或(||)

互斥或(^)

反向

~10
 01

短路運算

當前面條件不滿足後面就不看

節省不必要的浪費

且(&&)

&&10
110
000

或(||)

||10
111
010

互斥或(^)

^10
101
010

以上為JS的基本運算介紹

各位是否沒問題?

關鍵字

Mozilla Developer Network

w3schools