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