算數運算符
運算符 + - * / %
+ 加號運算符
功能:
1.對數字代數求和
2.對字符串進行連接
3.將一個數值轉換成字符串 ——>數值+""
注意:任何數據類型+字符串都等于字符串
字符串拼接時:
數值+字符串——>將數值直接轉為字符串拼接
字符串+字符串——>兩者直接拼接
- 減號運算符
功能:
1.對數值進行減法操作;
2.對操作數進行“取反”操作;
3.將字符串轉換成數值;數值型字符串-0=該數值,非數值-0==NaN
* ?/ 乘號、除號運算符
功能:對兩個數進行乘法或除法運算
正負規則:同號為正,異號得負
% 取余運算符
兩個數相除取余數。
余數是正還是負,和第一個運算數的符號相同
復合賦值運算符 ?+= -= *= ?/= %=
分別相加、相減、相乘、相除和取余后賦值。
自增和自減運算符
++ ?--
對唯一的運算數進行遞增或者遞減操作(每次加1或者減1)
注意點:
1.運算數必須是一個變量、數組的一個元素或者對象的屬性
2.如果運算數是非數值則運算符會將它轉成數值直接返回,不會再+或-
3.符號位置決定運算結果:
運算數之前——>先進行遞增或者遞減,再進行求值
運算數之后——>先求值,再進行遞增或者遞減操作
關系運算符(比較運算符)
大小運算 > ?< ?>= ?<=
如果左邊 ?大于/小于/大于等于/小于等于 ?右邊,返回true,否則返回false
操作規則:
1.數值與數值比較——>比較代數值
2.僅一個運算數是數值——>將另一個運算數轉成數值,并比較它們的代數值
3.字符串與字符串——>逐個字符比較它們的Unicode數值
4.字符串與非數值——>將運算數轉換成字符串進行Unicode比較
5.運算數即非數字也非字符串——>轉換成數字或者字符串后進行比較
6.運算數無法轉換成數值或者字符串——>返回false
7.與NaN比較——>返回false
等值運算
相等比較== ? ?!=
比較兩個運算符的返回值,看返回值是否相等或不等
存在類型轉換:
布爾值:true-----1;false-----0;
對象:調用valueOf()
字符串與數值比較:字符串轉換成數值
比較原則:
1.null與undefined相等
2.NaN不等于任何數值,包括自身
3.對象,是不是同一對象,是的話 == 是true
相同比較 ?=== ? !==
不存在隱示類型轉換的絕對等于和絕對不等于,比較兩個運算數的返回值及數據類型是否相同或不同
比較原則:
1.只有數據類型和數值相同才為相同
2.原始值和引用值之間是絕對不等于
3.引用值之間比較的是它們的引用(內存地址)
對象運算符
in:判斷左邊是否是右邊的成員
instancesof:判斷左邊對象實例是否是右邊的這個類或構造函數構造出來的
new:創建并初始化一個新的對象
delete:刪除指定對象的屬性,數組元素或者變量
.和[]:存取對象和數組元素
():函數調用,改變運算符的優先級等 ? ?
邏輯運算符
&&邏輯與
規則:
1.第一個操作數是對象,返回第二個;
2.第一個操作數值為true,第二個為對象時,返回第二的對象;
3.兩個都是對象時,返回第二個;
4.其中一個操作數是null或者undefined或者NaN時,對應返回null、undefined、NaN,如果同時是這三個值中的兩個,返回第一個數;(暫時感覺0也是這個規律)
特性:
1.當且僅當兩個運算數的值為true時,返回true,否則返回false;
2.短路操作:當第一個操作數的值是false時,則不再對第二個操作數進行求值了,返回第一個。
|| 邏輯或
規則:
1.第一個操作數是對象,返回第一個;
2.第一個操作數值為false,返回第二個;
3.兩個都是對象時,返回第一個;
4.兩個操作數是null或者undefined或者NaN時,對應返回null、undefined、NaN(0也是這個規律)
特性:
1.當且僅當兩個運算數的值為false時,返回false,否則返回true;
2.短路操作:當第一個操作數的值是true時,則不再對第二個操作數進行求值了,返回第一個。
!邏輯非
非運算符返回值的為true的有:undefined、null、NaN、0、""
false的有:對象、非空字符串、非0數值
特性:
1.當運算的值為false則返回true,否則返回false。
2.連續使用兩次,可將任意類型轉成布爾值(true or false)。
位運算符
基礎知識:
1.類型:
(1).有符號:數字位是 前31位 ?,符號位是第32位
(2).無符號:只能是正數,第32位表示數值,數值范圍可以加大
2.數值范圍:-2147483648到2147483647
3.存儲方式:
正數:純二進制存儲,31位中每一位表示2的冪,用0補充無用位
負數:2進制補碼存儲,補碼的計算步驟:
(1.確定該數字的非負版本的二進制表示(例如,要計算 -18的二進制補碼,首先要確定 18 的二進制表示)
(2.求得二進制反碼,即要把 0 替換為 1,把 1 替換為 0
(3.在二進制反碼上加 1
4.當做0來處理的特殊值NaN和Infinity
邏輯位運算:
返回值為1的:按位非~0、按位與&對應位全是1、按位或| 任何一位是1、按位異或^ 即不同時為1也不同時為0????
返回值為0的:按位非~1、按位與&任意一位是0、按位或| 對應位全位0、按位異或^ 對應位全0或全1 ? ?
位移操作:
左移<<:將數值的所有位左移指定的位數,所有空位用0補充。左移1位對其乘2,左移2位對其乘4,以此類推;
有符號右移>>:將數值的所有位右移指定的位數,移出的位被舍棄,保留符號位,右移1位對其除2,右移2位對其除4,以此類推(在舍棄移出位后的基礎上除);
無符號右移>>>:
正數:與有符號右移結果相同
負號:會出現無限大的數值
復合賦值運算符?
位操作符與等號結合,復合賦值不會有性能方面的提升 ??
其他運算符
1.?: ?條件運算符,又叫三目運算符,是簡潔的if else
2.typeof 類型判定運算符
3.,逗號操作符,在一行語句中執行多個不同的操作,特殊的(1,2)會看一眼第一個,然后返回第二個數。
*以下是關于位運算符知識,來至于官方文檔:ECMAScript 位運算符
位運算符是在數字底層(即表示數字的 32 個數位)進行操作的。
ECMAScript 整數有兩種類型,即有符號整數(允許用正數和負數)和無符號整數(只允許用正數)。在 ECMAScript 中,所有整數字面量默認都是有符號整數,
有符號整數使用 31 位表示整數的數值,用第 32 位表示整數的符號,0 表示正數,1 表示負數。數值范圍從 -2147483648 到 2147483647。
可以以兩種不同的方式存儲二進制形式的有符號整數,一種用于存儲正數,一種用于存儲負數。正數是以真二進制形式存儲的,前 31 位中的每一位都表示 2 的冪,從第 1 位(位 0)開始,表示 20,第 2 位(位 1)表示 21。沒用到的位用 0 填充,即忽略不計。
負數也存儲為二進制代碼,不過采用的形式是二進制補碼。計算數字二進制補碼的步驟有三步:
1.確定該數字的非負版本的二進制表示(例如,要計算 -18的二進制補碼,首先要確定 18 的二進制表示)
2.求得二進制反碼,即要把 0 替換為 1,把 1 替換為 0
3.在二進制反碼上加 1
有趣的是,把負整數轉換成二進制字符串后,ECMAScript 并不以二進制補碼的形式顯示,而是用數字絕對值的標準二進制代碼前面加負號的形式輸出。
var iNum = -18;
iNum.toString(2);//輸出 "-10010"
這段代碼輸出的是 "-10010",而非二進制補碼,這是為避免訪問位 31。為了簡便,ECMAScript 用一種簡單的方式處理整數,使得開發者不必關心它們的用法。
另一方面,無符號整數把最后一位作為另一個數位處理。在這種模式中,第 32 位不表示數字的符號,而是值 231。由于這個額外的位,無符號整數的數值范圍為 0 到 4294967295。對于小于 2147483647 的整數來說,無符號整數看來與有符號整數一樣,而大于 2147483647 的整數則要使用位 31(在有符號整數中,這一位總是 0)。
把無符號整數轉換成字符串后,只返回它們的有效位。
注意:所有整數字面量都默認存儲為有符號整數。只有 ECMAScript 的位運算符才能創建無符號整數。
~位運算 NOT
位運算 NOT 由否定號(~)表示
~位運算 三步的處理過程:
1.把運算數轉換成 32 位數字
2.把二進制數轉換成它的二進制反碼
3.把二進制數轉換成浮點數
注:~位運算 實質上是對數字求負,然后減 1
& 位運算 AND
位運算 AND 由和號(&)表示,直接對數字的二進制形式進行運算。它把每個數字中的數位對齊,然后用對應的規則對同一位置上的兩個數位進行 AND 運算(兩個1才為1,否則為0)
|?位運算 OR
位運算 OR 由符號(|)表示,也是直接對數字的二進制形式進行運算。在計算每位時,OR 運算符采用OR對應的規則計算(有1即為1,否則為0)
^ ?位運算 XOR
位運算 XOR 由符號(^)表示,當然,也是直接對二進制形式進行運算。XOR 不同于 OR,當只有一個數位存放的是 1 時,它才返回 1。(相同為0,不同為1)
左移運算 <<
左移運算由兩個小于號表示(<<)。它把數字中的所有數位向左移動指定的數量的空位,用 0 填充這些空位。
注意:左移運算保留數字的符號位,即符號仍然存儲在第 32 位中
有符號右移運算 ? ?>>
有符號右移運算符由兩個大于號表示(>>)。它把 32 位數字中的所有數位整體右移,同時保留該數的符號(正號或負號)。有符號右移運算符恰好與左移運算相反。
同樣,移動數位后會造成空位。這次,空位位于數字的左側,但位于符號位之后。ECMAScript 用符號位的值填充這些空位,創建完整的數字
無符號右移運算?>>>
無符號右移運算符由三個大于號(>>>)表示,它將無符號 32 位數的所有數位整體右移。對于正數,無符號右移運算的結果與有符號右移運算一樣。
對于負數,情況就不同了。
無符號右移運算用 0 填充所有空位。對于正數,這與有符號右移運算的操作一樣,而負數則被作為正數來處理。
由于無符號右移運算的結果是一個 32 位的正數,所以負數的無符號右移運算得到的總是一個非常大的數字,如何得到這種結果的呢?
要實現這一點,需要把這個數字轉換成無符號的等價形式 如:-64 >>> 0;
然后,用 Number 類型的 toString() 獲取它的真正的位表示