摘要:對(duì)于有符號(hào)的整數(shù),第一位是符號(hào)位正數(shù),負(fù)數(shù),后位表示數(shù)值。正數(shù)二進(jìn)制表示,沒(méi)有用到的位補(bǔ),如用二進(jìn)制表示為,第一位是符號(hào)位,后位均用補(bǔ)位,是有效位。按位非求反碼,本質(zhì)是求操作數(shù)的負(fù)值減一。
操作符 一元操作符
只能操作一個(gè)值的操作符叫一元操作符
前置遞增和遞減,在語(yǔ)句求值之前改變數(shù)值的大小
后置遞增和遞減,在語(yǔ)句求值之后改變數(shù)值的大小
比如:
var age = 18; var now = ++age - 10; // now = 9, age = 19 var now = age++ - 10; // now = 9, age = 20
前置遞增、遞減和后置遞增、遞減可用于操作整數(shù)、浮點(diǎn)數(shù)、布爾值、字符串、對(duì)象,ECMAScript會(huì)根據(jù)前面提到過(guò)的各種數(shù)據(jù)類(lèi)型轉(zhuǎn)化成數(shù)值類(lèi)型的規(guī)則,先將值轉(zhuǎn)化為數(shù)值,然后加減1
+放在數(shù)值前面,不會(huì)有任何影響,-使負(fù)數(shù)變?yōu)檎龜?shù),正數(shù)變?yōu)樨?fù)數(shù),當(dāng)一元+用在非數(shù)值前面,會(huì)試圖將它們轉(zhuǎn)化為數(shù)值,規(guī)則同之前講過(guò)的,而一元-用在非數(shù)值前面,會(huì)首先將它們轉(zhuǎn)化為數(shù)值,再變成相應(yīng)的負(fù)數(shù)。
位操作符ECMAScript中的數(shù)值以IEEE-754 64 位格式存儲(chǔ),使用位操作符操作數(shù)值時(shí),現(xiàn)將該數(shù)值轉(zhuǎn)化為32位,然后進(jìn)行計(jì)算,最后再轉(zhuǎn)化成64位。
對(duì)于有符號(hào)的整數(shù),第一位是符號(hào)位(0正數(shù),1負(fù)數(shù)),后31位表示數(shù)值。
正數(shù)
二進(jìn)制表示,沒(méi)有用到的位補(bǔ)0,如18用二進(jìn)制表示為00000000000000000000000000010010,第一位是符號(hào)位,后27位均用0補(bǔ)位,10010是有效位。
負(fù)數(shù)
二進(jìn)制補(bǔ)碼表示,計(jì)算一個(gè)數(shù)值如-18的補(bǔ)碼需要三步:
求這個(gè)數(shù)值絕對(duì)值的二進(jìn)制,即00000000000000000000000000010010
求二進(jìn)制的反碼(0為1,1為0),即11111111111111111111111111101101
加一,即11111111111111111111111111101110
注意(-18).toString(2)的結(jié)果是-10010而不是11111111111111111111111111101110,默認(rèn)情況下ECMAScript中的整數(shù)都是有符號(hào)的,存在無(wú)符號(hào)整數(shù),無(wú)符號(hào)整數(shù)能表示的數(shù)值更大。
對(duì)非數(shù)值應(yīng)用一下講述的位操作,會(huì)首先進(jìn)行Number()轉(zhuǎn)化,位操作視NaN Infinity為0
所有的按位操作符的操作數(shù)都會(huì)被轉(zhuǎn)成補(bǔ)碼形式的有符號(hào)32位整數(shù)。
求反碼,本質(zhì)是求操作數(shù)的負(fù)值減一。
為了方便驗(yàn)證,我們用五位表示
取反碼
abcde——1-a 1-b 1-c 1-d 1-e
負(fù)值減一
abcde——1-a 1-b 1-c 1-d 1-e——1-a 1-b 1-c 1-d 2-e
1-a 1-b 1-c 1-d 2-e - 1 = 1-a 1-b 1-c 1-d 1-e
可見(jiàn)是相等的。
將兩個(gè)數(shù)值按位對(duì)齊,如果同一位上均為1,則返回結(jié)果的這一位為1,否則為0。
比如:
45 & 67; //1
00000000000000000000000000101101
00000000000000000000000001000011
結(jié)果為:
00000000000000000000000000000001
將兩個(gè)數(shù)值按位對(duì)齊,如果同一位均為0,則返回結(jié)果的這一位為0,否則為1。
45 | 67; //111
0000000000000000000000000101101
0000000000000000000000001000011
結(jié)果為:
00000000000000000000000001101111
將兩個(gè)數(shù)值按位對(duì)齊,如果同一位數(shù)值不同,則返回結(jié)果的這一位為1,若相同,則為0。
45 ^ 67; //110
0000000000000000000000000101101
0000000000000000000000001000011
結(jié)果為:
00000000000000000000000001101110
向左移動(dòng)一定位數(shù),不改變符號(hào)位,空出來(lái)的位置補(bǔ)0(補(bǔ)0的個(gè)數(shù)與移動(dòng)位數(shù)相同)
45 ^ 5; //1440
0000000000000000000000000101101
結(jié)果為:
00000000000000000000010110100000
45 >> 5; //1
0000000000000000000000000101101
結(jié)果為:
00000000000000000000000000000001
向右移動(dòng)一定位數(shù),不改變符號(hào)位,空出來(lái)的位置補(bǔ)0(補(bǔ)0的個(gè)數(shù)與移動(dòng)位數(shù)相同)
向右移動(dòng)一定位數(shù),改變符號(hào)位,空出來(lái)的位置補(bǔ)0(補(bǔ)0的個(gè)數(shù)與移動(dòng)位數(shù)相同)
正數(shù)
同>>(用于填充空位的0與符號(hào)位相同,等于填充了符號(hào)位)
負(fù)數(shù)
無(wú)符號(hào)右移操作符會(huì)把負(fù)數(shù)的二進(jìn)制碼當(dāng)成正數(shù)的二進(jìn)制碼
-64>>>25; // 127
11111111111111111111111111000000
結(jié)果為:
00000000000000000000000001111111
可以操作任何數(shù)據(jù)類(lèi)型,首先對(duì)其取布爾值,然后取反
值 | 布爾值 |
---|---|
空字符串、0、undefined、null、NaN | true |
對(duì)象、非0、非空字符串 | false |
!!相當(dāng)于Boolean可以返回這個(gè)值真正對(duì)應(yīng)的布爾值。
邏輯與有兩個(gè)操作數(shù),只有true && true才會(huì)返回true,可以操作任何數(shù)據(jù)類(lèi)型。
如果有一個(gè)或兩個(gè)操作數(shù)不是布爾值,邏輯與不一定返回布爾值,規(guī)則如下:
如果第一個(gè)是對(duì)象,返回第二個(gè)操作數(shù)
如果第二個(gè)是對(duì)象,在第一個(gè)求值結(jié)果為true時(shí)返回第二個(gè)
如果第一個(gè)是null,返回null
如果第一個(gè)是undefined,返回undefined
如果第一個(gè)是NaN,返回NaN
邏輯與是短路操作,如果第一個(gè)操作數(shù)可以決定求值結(jié)果,就不會(huì)對(duì)第二個(gè)操作數(shù)求值,當(dāng)?shù)谝粋€(gè)操作數(shù)求值為false,則表達(dá)式結(jié)果為false。
邏輯或有兩個(gè)操作數(shù),只有false || false才會(huì)返回false,可以操作任何數(shù)據(jù)類(lèi)型。
如果有一個(gè)或兩個(gè)操作數(shù)不是布爾值,邏輯或不一定返回布爾值,規(guī)則如下:
如果第一個(gè)操作數(shù)是對(duì)象,則返回第一個(gè)操作數(shù)
如果第一個(gè)對(duì)象的求值結(jié)果為false,則返回第二個(gè)操作數(shù)
如果兩個(gè)操作數(shù)都是null,則返回null
如果兩個(gè)操作數(shù)都是NaN,則返回NaN
如果兩個(gè)操作數(shù)都是undefined,則返回undefined
邏輯或也是短路操作符,如果第一個(gè)求值結(jié)果為true,則返回true。
我們可以利用邏輯或的這一行為來(lái)避免為變量賦null 或undefined 值。
var myObject = preferredObject || backupObject;
如果preferredObject為null or undefined, 會(huì)將backupObject的值賦給myObject
乘性操作符如果參加乘性操作的操作符不是數(shù)值,會(huì)調(diào)用Number()將其轉(zhuǎn)為數(shù)值,這一過(guò)程在這一節(jié)中不再贅述。
乘法遵循以下規(guī)則:
如果操作數(shù)都是數(shù)值,執(zhí)行常規(guī)的乘法運(yùn)算
有一個(gè)操作數(shù)是NaN,則結(jié)果是NaN
Infinity * 0; // NaN
Infinity與非0(包括無(wú)窮)相乘,結(jié)果為無(wú)窮
除法遵循以下規(guī)則:
如果操作數(shù)都是數(shù)值,執(zhí)行常規(guī)的除法運(yùn)算
有一個(gè)操作數(shù)是NaN,則結(jié)果是NaN
Infinity/Infinity; // NaN
0/0; // NaN
非零的數(shù)除以0,結(jié)果為無(wú)窮
無(wú)窮被非零的數(shù)相除,結(jié)果為無(wú)窮
求模遵循以下規(guī)則:
如果操作數(shù)都是數(shù)值,執(zhí)行常規(guī)的求模運(yùn)算
無(wú)窮大除以有限大的數(shù)值,余數(shù)運(yùn)算結(jié)果為`NaN
有限大的數(shù)值除以0,余數(shù)運(yùn)算結(jié)果為NaN
Infinity除以Infinity,余數(shù)運(yùn)算結(jié)果為NaN
有限大的數(shù)值除以無(wú)窮大,余數(shù)運(yùn)算結(jié)果為被除數(shù)
被除數(shù)是0,除數(shù)不為NaN或0,結(jié)果為0
5 / 0 % 5; // NaN 5 % 0; // NaN 5 / 0 % (5 / 0); // NaN 5 % (5 / 0); // 5 0 % 0; // NaN 0 % (5 / 0); //0 0 % 5; //0 0 % (5 % 0); //NaN加性運(yùn)算符
如果兩個(gè)操作數(shù)都是數(shù)值,則遵循以下規(guī)則:
Infinity + Infinity; // Infinity
-Infinity + (-Infinity); // -Infinity
-Infinity + Infinity; // NaN
+0 + (+0); // +0
-0 + (-0); //-0
-0 + (+0); // +0
如果有操作符是字符串,則遵循以下規(guī)則:
如果兩個(gè)都是字符串,則將兩個(gè)字符串拼接起來(lái)
如果只有一個(gè)是字符串,則把非字符操作數(shù)轉(zhuǎn)化為字符串,拼接起來(lái)
忽視加法操作中的數(shù)據(jù)類(lèi)型是ECMAScript 編程中最常見(jiàn)的一個(gè)錯(cuò)誤。再來(lái)看一個(gè)例子:
var num1 = 5;
var num2 = 10;
var message = "The sum of 5 and 10 is " + num1 + num2;
alert(message); // "The sum of 5 and 10 is 510"
減法運(yùn)算遵循以下規(guī)則:
如果都是數(shù)值,執(zhí)行常規(guī)減法操作
如果有一個(gè)是NaN,則結(jié)果是NaN
Infinity - Infinity; // NaN
-Infinity - (-Infinity); // NaN
Infinity - (-Infinity); //Infinity
-Infinity - Infinity; //-Infinity
+0 - (+0); // +0
+0-(-0); // -0
-0 - (-0); // +0
關(guān)系操作符包括< > <= >=,遵循如下規(guī)則:
如果都是數(shù)值,進(jìn)行數(shù)值大小比較
如果都是字符串,則比較字符編碼值,有如下規(guī)則:
如果字符串相等返回值0
如果第一個(gè)字符和參數(shù)的第一個(gè)字符不等,結(jié)束比較,返回他們之間的編碼差值
如果第一個(gè)字符和參數(shù)的第一個(gè)字符相等,則以第二個(gè)字符和參數(shù)的第二個(gè)字符做比較,以此類(lèi)推,直至比較的字符或被比較的字符有一方全比較完,這時(shí)就比較字符的長(zhǎng)度。
如果一個(gè)是數(shù)值,則另一個(gè)轉(zhuǎn)化成數(shù)值,然后比較
對(duì)象執(zhí)行valueof(),如果沒(méi)有,調(diào)用其toString(),然后按上述規(guī)則比較
舉一些例子:
"23" < "3"; //true "23" < 3; //false "B" < "a"; //true,大寫(xiě)字母的字符編碼全部小于小寫(xiě)字母的字符編碼 "a" < 3; // false,"a"轉(zhuǎn)化為NaN,NaN參與任何操作都返回NaN "a" >= 3; //false相等操作符
先轉(zhuǎn)換操作數(shù),再比較相等性,轉(zhuǎn)換的規(guī)則如下:
如果有一個(gè)操作數(shù)是布爾型,將其轉(zhuǎn)化為數(shù)值
字符串與數(shù)值比較,字符串轉(zhuǎn)化為數(shù)值
對(duì)象與非對(duì)象比較,調(diào)用對(duì)象的valueof()得到基本類(lèi)型,再按以上規(guī)則比較
比較規(guī)則如下:
null == undefined; //true
不會(huì)轉(zhuǎn)換undefined與null
NaN與任何操作數(shù)相等性比較,返回false,不相等性比較,返回true,包括NaN
如果都是對(duì)象,看是否指向同一對(duì)象
舉一些例子:
undefined == 0; //false null == 0; //false NaN == NaN; //false NaN != NaN; //false true == 1; //true false == 0; //true "NaN" == NaN; // false
不轉(zhuǎn)換操作數(shù),直接比較,比較規(guī)則除了第一條均相同
undefined === null ; // false
可以看出全等比相等要安全,不會(huì)強(qiáng)制轉(zhuǎn)換。
條件運(yùn)算符variable = boolean_expression ? true_value : false_value;
boolean_expression 若為true,返回true_value,若為false,返回false_value
將右邊的值賦給左邊
*=
+=
-=
/=
%=
<<=
>>=
>>>=
num = num + 10;相當(dāng)于num += 10;
逗號(hào)操作符var a, b, c;
`a = (0, 1, 2, 3); //3, 只最后一項(xiàng)有效
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/94908.html
摘要:基礎(chǔ)鞏固基礎(chǔ)總結(jié)使用已經(jīng)好幾年了,由于工作主要是做服務(wù)端開(kāi)發(fā),在工作中逐漸發(fā)現(xiàn)的使用范圍原來(lái)越廣泛。這里要注意,務(wù)必將基礎(chǔ)部分掌握牢靠,磨刀不誤砍柴功,只有將基礎(chǔ)部分掌握并建立起系統(tǒng)的知識(shí)體系,在后面學(xué)習(xí)衍生的其他模式才能游刃有余。 基礎(chǔ)鞏固:JavaScript基礎(chǔ)總結(jié) 使用JavaScript已經(jīng)好幾年了,由于工作主要是做服務(wù)端開(kāi)發(fā),在工作中逐漸發(fā)現(xiàn)JavaScript的使用范圍原...
摘要:一數(shù)據(jù)類(lèi)型基本類(lèi)型引用類(lèi)型類(lèi)型判斷返回結(jié)果未定義布爾值字符串?dāng)?shù)值對(duì)象或者函數(shù)拓展堆棧兩種數(shù)據(jù)結(jié)構(gòu)堆隊(duì)列優(yōu)先,先進(jìn)先出由操作系統(tǒng)自動(dòng)分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。 一、數(shù)據(jù)類(lèi)型 基本類(lèi)型:`Null Boolean String Undefined Number(NB SUN)` 引用類(lèi)型:`Array Function Object` 類(lèi)型判斷:typeof 返回結(jié)果...
摘要:為此,本章將主要按照第版定義的介紹這門(mén)語(yǔ)言的基本概念,并就第版的變化給出說(shuō)明。在嚴(yán)格模式下,中的一些不確定的行為將得到處理,而且對(duì)某些不安全的操作也會(huì)招聘錯(cuò)誤。這是為不破壞語(yǔ)法而特意選定的語(yǔ)法。支持嚴(yán)格模式的瀏覽器包括和。 基本概念本章內(nèi)容語(yǔ)法、數(shù)據(jù) 類(lèi)型、流控制語(yǔ)句、函數(shù)符何語(yǔ)言的核心都盡然會(huì)描述這門(mén)語(yǔ)言最基本的工作原理。而捆 的內(nèi)容通常都要滬深股市這門(mén)語(yǔ)言的語(yǔ)法、操作符、數(shù)據(jù) 類(lèi)型...
摘要:操作符,會(huì)將數(shù)值改變正數(shù)變成負(fù)數(shù)負(fù)數(shù)變成正數(shù)。同時(shí),也說(shuō)明了,使用兩個(gè)邏輯非操作符和的操作結(jié)果相同。操作符得到的是余數(shù)。不相等操作符有兩種。 這篇筆記的內(nèi)容對(duì)應(yīng)的是《JavaScript高級(jí)程序設(shè)計(jì)(第三版)》中的第三章。 1.操作符 1-1 一元操作符 遞增和遞減操作符 遞增和遞減操作符有兩個(gè) ++ 和 --。一元操作符使用的時(shí)候,可以前置也可以后置。由于兩個(gè)操作方式類(lèi)似,先只說(shuō)明 ...
摘要:一寫(xiě)在前面最近重讀高級(jí)程序設(shè)計(jì),總結(jié)下來(lái),查漏補(bǔ)缺。但這種影響是單向的修改命名參數(shù)不會(huì)改變中對(duì)應(yīng)的值。這是因?yàn)閷?duì)象的長(zhǎng)度是由傳入的參數(shù)個(gè)數(shù)決定的,不是由定義函數(shù)時(shí)的命名參數(shù)的個(gè)數(shù)決定的。實(shí)際改變會(huì)同步,改變也會(huì)同步 一、寫(xiě)在前面 最近重讀《JavaScript高級(jí)程序設(shè)計(jì)》,總結(jié)下來(lái),查漏補(bǔ)缺。 二、JS簡(jiǎn)介 2.1 JS組成 ECMAscript:以ECMA-262為基礎(chǔ)的語(yǔ)言,由...
摘要:是文檔的一種表示結(jié)構(gòu)。這些任務(wù)大部分都是基于它。這個(gè)實(shí)踐的重點(diǎn)是把你在前端練級(jí)攻略第部分中學(xué)到的一些東西和結(jié)合起來(lái)。一旦你進(jìn)入框架部分,你將更好地理解并使用它們。到目前為止,你一直在使用進(jìn)行操作。它是在前端系統(tǒng)像今天這樣復(fù)雜之前編寫(xiě)的。 本文是 前端練級(jí)攻略 第二部分,第一部分請(qǐng)看下面: 前端練級(jí)攻略(第一部分) 在第二部分,我們將重點(diǎn)學(xué)習(xí) JavaScript 作為一種獨(dú)立的語(yǔ)言,如...
閱讀 2219·2019-08-30 15:53
閱讀 2444·2019-08-30 12:54
閱讀 1187·2019-08-29 16:09
閱讀 718·2019-08-29 12:14
閱讀 745·2019-08-26 10:33
閱讀 2461·2019-08-23 18:36
閱讀 2950·2019-08-23 18:30
閱讀 2111·2019-08-22 17:09