成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 操作符(一)

lbool / 1362人閱讀

摘要:是中最簡單的操作符。在變量前使用一元減操作符遵循一元加操作符規(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ì) NaNInfinity 當(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

相關(guān)文章

  • JavaScript系列(四) - 收藏集 - 掘金

    摘要:函數(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)生改變的方式。因此,...

    cfanr 評(píng)論0 收藏0
  • 基礎(chǔ)鞏固:JavaScript基礎(chǔ)總結(jié)(基本概念篇)

    摘要:基礎(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的使用范圍原...

    YuboonaZhang 評(píng)論0 收藏0
  • JavaScript高級(jí)程序設(shè)計(jì)學(xué)習(xí)筆記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...

    supernavy 評(píng)論0 收藏0
  • 談?wù)?em>javascript語法里些難點(diǎn)問題(

    摘要:引子前不久我建立的技術(shù)群里一位問了一個(gè)這樣的問題,她貼出的代碼如下所示執(zhí)行結(jié)果如下所示第一個(gè)第二個(gè)這是一個(gè)令人詫異的結(jié)果,為什么第一個(gè)彈出框顯示的是,而不是呢這種疑惑的原理我描述如下一個(gè)頁面里直接定義在標(biāo)簽下的變量是全局變量即屬于對(duì)象的變量 1) 引子 前不久我建立的技術(shù)群里一位MM問了一個(gè)這樣的問題,她貼出的代碼如下所示: var a = 1; function hehe...

    huaixiaoz 評(píng)論0 收藏0
  • 細(xì)說 Javascript 對(duì)象篇() : 對(duì)象的使用和屬性

    摘要:中的一切都可以視為對(duì)象,除了兩個(gè)特例和。上例中的第三個(gè)情形已說明刪除對(duì)象的屬性刪除屬性的唯一方法是使用,將屬性值設(shè)置為或只是移除了與屬性相關(guān)的值,并沒有真正刪除屬性本身。命名對(duì)象的屬性對(duì)象的屬性可以用普通字符或字符串來命名。 Javascript 中的一切都可以視為對(duì)象,除了兩個(gè)特例:null 和 undefined。 false.toString(); // false [1, 2...

    codecook 評(píng)論0 收藏0
  • 為什么不要在 JavaScript 中使用位作符?

    摘要:但事實(shí)上,位操作符并不是這么認(rèn)為的。再者,在中使用位操作符的地方畢竟太少,如果你執(zhí)意使用位操作符,未來維護(hù)這段代碼的人又對(duì)中的位操作符的坑不熟悉,這也會(huì)造成不利的影響。所以,我對(duì)大家的建議是,盡量在中別使用位操作符。 本文最早在我的個(gè)人博客《咀嚼之味》發(fā)布:http://jerryzou.com 如果你的第一門編程語言不是 JavaScript,而是 C++ 或 Java,那...

    eternalshallow 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<