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