摘要:是中最簡單的操作符。在變量前使用一元減操作符遵循一元加操作符規則,最后將得到的數值轉換為負數。位操作符位操作符是按內存中表示數值的位來操作數值。位操作符就是先將位的值轉換成位的整數,然后執行操作,再將結果轉換為位。位操作符對和當做來處理。
一元操作符
只能操作一個值的操作符叫做一元操作符。是ECMAScript中最簡單的操作符。
遞增和遞減操作符執行前置遞增遞減操作時,變量的值是在語句被求值之前改變的。(在計算機科學領域,這種情況通常被稱為副效應).
執行后置遞增遞減操作時,變量的值是在語句被求值之后改變的。
當一條語句只有遞增或遞減操作時,前置和后置沒有區別。
let num1 = 1; ++num1; console.log(num1); // 2 let num2 = 1; num2++; console.log(num1); // 2 let num3 = 1; console.log(++num3); // 2 let num4 = 1; console.log(num4++); // 1 let num5 = 2; let num6 = 20; let num7 = --num5 + num6; // 21 let num8 = num5 + num6; // 21 上面的語句改變了num5的值 let num9 = 2; let num10 = 20; let num11 = num9-- + num10; // 22 let num12 = num9 + num10; // 21 上面的語句改變了num5的值
除了適用于整數,還有可以用于字符串、布爾值、浮點數值、對象。最終都變為數值變量。
String:包含有效數字字符則先轉為數值,再執行加減1;不包含有效數字字符則將變量值設置為NaN。
Boolean:將 true(false) 轉為 1(0),再執行加減1。
Object: 先調用 valueOf() 獲得一個可供操作的值,然后對該值應用前述規則。如果結果是NaN,則調用 toString() 后再應用前述規則。
let s1 = "2", s2 = "str"; let b1 = true, b2 = false; let f = 1.1; let o1 = { valueOf() { return 10; } } let o2 = { valueOf() { return NaN; } } console.log(++s1); // 3 console.log(++s2); // NaN console.log(++b1); // 2 console.log(++b2); // 1 console.log(--f); // 0.10000000000000009 (由于浮點舍入錯誤所致) console.log(--o1); // 9 console.log(--o2); // NaN一元加和減操作符 在變量前使用一元加操作符:
Number: 不變
String:包含有效數字字符則先轉為數值;不包含有效數字字符則將變量值設置為NaN。
Boolean:將 true(false) 轉為 1(0)。
Object: 先調用 valueOf() 和(或)toString() 方法,再轉換得到的值。
let n = 1; let s1 = "10", s2 = "10a", s3 = "a10", s4 = "a"; let b1 = true, b2 = false; let f = 1.1; let o1 = { valueOf(){ return 10; } }, o2 = { valueOf(){ return NaN; } } console.log(+n); // 1 console.log(+s1); // 10 console.log(+s2); // NaN console.log(+s3); // NaN console.log(+s4); // NaN console.log(+b1); // 1 console.log(+b2); // 0 console.log(+f); // 1.1 console.log(+o1); // 10 console.log(+o2); // NaN在變量前使用一元減操作符:
遵循一元加操作符規則,最后將得到的數值轉換為負數。
位操作符位操作符是按內存中表示數值的位來操作數值。速度快。
位操作符就是先將64位的值轉換成32位的整數,然后執行操作,再將結果轉換為64位。ECMAScript中的數值都是以IEEE-754 64位格式存儲。
位操作符對 NaN 和 Infinity 當做 0 來處理。
對于非數值,會先使用 Number() 函數將該值轉換為一個數值(自動完后),再執行操作,最終得到一個數值。
在處理有符號的整數時,是不能訪問位31的。
對于有符號的整數,32位中的前31位用于表示整數的值。第32位用于表示數值的符號:0表示整數,1表示負數。這個表示符號的位叫做符號位,它的值決定了其他位數值的格式。默認情況下,ECMAScript 中的所有整數都是有符號整數,不過也存在無符號整數。對于無符號整數,第32位不再表示符號,那么它能表示的值自然可以更大。
正數以純二進制格式存儲:
例如數值18的二進制:00000000000000000000000000010010
負數以二進制補碼的格式存儲:
二進制補碼計算方式:
求這個數值絕對值的二進制碼。
求二進制反碼。0替換為1,1替換為0。
得到的二進制反碼加1。
獲取 -18 的二進制碼:
首先求得 18 的二進制碼即:
0000 0000 0000 0000 0000 0000 0001 0010
求二進制反碼:
1111 1111 1111 1111 1111 1111 1110 1101
將二進制反碼加1:
1111 1111 1111 1111 1111 1111 1110 1110
ECMAScript會盡力向我們隱藏所有上面的這些操作,以更合乎邏輯的形式展現出來:
const num = -18; num.toString(2); // "-10010"按位非(NOT)
由符號 ~ 表示,返回數值的反碼。本質就是操作數的負值減1。
const n1 = 25; // 二進制 00000000000000000000000000011001 const n2 = ~n1; // 二進制 11111111111111111111111111100110 console.log(n2); // -26 這里也解釋了為什么計算二進制補碼的第3步要加1。按位與(AND)
由符號 & 表示。兩個數值對應位都是1才返回1,否則返回0。
const result = 25 & 3; console.log(result); // 1 // 二進制: // 25 = 00000000000000000000000000011001 // 3 = 00000000000000000000000000000011 // AND = 00000000000000000000000000000001按位或(OR)
由符號 | 表示。兩個數值對應位有一個1就返回1,否則返回0。
const result = 25 | 3; console.log(result); // 27 // 二進制: // 25 = 00000000000000000000000000011001 // 3 = 00000000000000000000000000000011 // OR = 00000000000000000000000000011011按位異或(XOR)
由符號 ^ 表示。兩個數值對應位只有一個1才返回1,否則返回0。
const result = 25 ^ 3; console.log(result); // 26 // 二進制: // 25 = 00000000000000000000000000011001 // 3 = 00000000000000000000000000000011 // OR = 00000000000000000000000000011010左移
由符號 << 表示。將數值的所有位向左移動指定位數。
左移不會影響操作數的符號位。例如:將 -2 向左移動 5 位,結果將是 -64 ,而非 64。
const result = 2 << 5; console.log(result); // 64 // 二進制: // 2 = 00000000000000000000000000000010 // result = 00000000000000000000000001000000有符號的右移
由符號 >> 表示。將數值的向右移動指定位數,保留符號位,并且用符號位的值來填充空位。
有符號的右移與左移恰好相反。例如:將 64 向右移動 5 位,結果將是 2。
const result = 64 >> 5; console.log(result); // 2 // 二進制: // 64 = 00000000000000000000000001000000 // result = 00000000000000000000000000000010無符號的右移
由符號 >>> 表示。將數值的所有位向右移動指定位數,不 保留符號位,并且使用 0 來填充空位。
對于正數來說,無符號右移與有符號右移沒區別。對于負數來說:首先空位是由 0 來填充,而不是符號位的值;其次,會把負數的二進制碼(是正數二進制碼的反碼加1)當成正數的二進制碼,也就會導致結果非常之大。
const result1 = 64 >>> 5; console.log(result1); // 2 // 二進制: // 64 = 00000000000000000000000001000000 // result1 = 00000000000000000000000000000010 const result2 = -64 >>> 5; console.log(result2); // 134217726 // 二進制: // -64 = 11111111111111111111111111000000 // result2 = 00000111111111111111111111111110參考
《JavaScript高級程序設計》(第三版)
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/105033.html
摘要:函數式編程前端掘金引言面向對象編程一直以來都是中的主導范式。函數式編程是一種強調減少對程序外部狀態產生改變的方式。 JavaScript 函數式編程 - 前端 - 掘金引言 面向對象編程一直以來都是JavaScript中的主導范式。JavaScript作為一門多范式編程語言,然而,近幾年,函數式編程越來越多得受到開發者的青睞。函數式編程是一種強調減少對程序外部狀態產生改變的方式。因此,...
摘要:基礎鞏固基礎總結使用已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現的使用范圍原來越廣泛。這里要注意,務必將基礎部分掌握牢靠,磨刀不誤砍柴功,只有將基礎部分掌握并建立起系統的知識體系,在后面學習衍生的其他模式才能游刃有余。 基礎鞏固:JavaScript基礎總結 使用JavaScript已經好幾年了,由于工作主要是做服務端開發,在工作中逐漸發現JavaScript的使用范圍原...
摘要:在上百種語言中算是命好的一個,還有就是最近納入高考體系的。由以下三個部分構成。就是對實現該標準規定的各個方面內容的語言的描述。是針對但經過擴展的用于的應用程序編程接口。將頁面映射為由節點構成的樹狀結構。 JavaScript的歷史這里就不再贅述了,當然JavaScript的歷史還是比較有意思的。在上百種語言中JavaScript算是‘命’好的一個,還有就是最近納入高考體系的python...
摘要:引子前不久我建立的技術群里一位問了一個這樣的問題,她貼出的代碼如下所示執行結果如下所示第一個第二個這是一個令人詫異的結果,為什么第一個彈出框顯示的是,而不是呢這種疑惑的原理我描述如下一個頁面里直接定義在標簽下的變量是全局變量即屬于對象的變量 1) 引子 前不久我建立的技術群里一位MM問了一個這樣的問題,她貼出的代碼如下所示: var a = 1; function hehe...
摘要:中的一切都可以視為對象,除了兩個特例和。上例中的第三個情形已說明刪除對象的屬性刪除屬性的唯一方法是使用,將屬性值設置為或只是移除了與屬性相關的值,并沒有真正刪除屬性本身。命名對象的屬性對象的屬性可以用普通字符或字符串來命名。 Javascript 中的一切都可以視為對象,除了兩個特例:null 和 undefined。 false.toString(); // false [1, 2...
摘要:但事實上,位操作符并不是這么認為的。再者,在中使用位操作符的地方畢竟太少,如果你執意使用位操作符,未來維護這段代碼的人又對中的位操作符的坑不熟悉,這也會造成不利的影響。所以,我對大家的建議是,盡量在中別使用位操作符。 本文最早在我的個人博客《咀嚼之味》發布:http://jerryzou.com 如果你的第一門編程語言不是 JavaScript,而是 C++ 或 Java,那...
閱讀 3686·2021-11-12 10:36
閱讀 3831·2021-09-22 15:48
閱讀 3542·2019-08-30 15:54
閱讀 2592·2019-08-29 16:44
閱讀 2363·2019-08-29 16:08
閱讀 2408·2019-08-29 16:06
閱讀 1280·2019-08-29 15:21
閱讀 3171·2019-08-29 12:39