最近一直在反編譯一些有趣的微信小程序的源碼來學習。在看了那些比較難看的源碼中發現了不少我所不知道的js中的知識,so,此文章記錄一下。javascript
更多筆記html
目錄 |
---|
void |
位移運算符(<<,>>,>>>) |
目錄java
1. void 是什麼git
void 是 JavaScript 中很是重要的關鍵字,該操做符指定要計算一個表達式可是不返回值。github
是否還記得 javascript:void(0)
這個寫法:小程序
<a href="javascript:void(0);"></a>
複製代碼
其實我一直不知道前面的那個javascript:
是什麼意思,有知道的小夥伴歡迎在下方評論告訴我,謝謝。微信小程序
不過我本身認爲是執行一段js腳本,由於下面這段代碼是直接能夠彈出123123。瀏覽器
<script type="text/javascript"> function fn(){ alert(123123) } </script>
<body>
<a href="javascript:fn()">點我!</a>
</body>
複製代碼
因此這裏還有一個技巧就是,不須要監聽a標籤的onClick時間就能夠實現點擊執行js方法。微信
迴歸正題。經過下面的打印咱們知道,咱們證明了。void能夠將一個表達式變成不返回值,也就是undefind函數
2. 爲何不直接使用undefined
undefined在JavaScript中並不屬於保留字/關鍵字,所以在IE5.5~8中咱們能夠將其看成變量那樣對其賦值(IE9+及其餘現代瀏覽器中賦值給undefined將無效)
var undefinedBackup = undefined;
undefined = 1;
// 顯示"undefined"
console.log(typeof undefinedBackup);
// 在IE5.5~8中顯示"number",其餘瀏覽器中則顯示"undefined"
console.log(typeof undefined);
複製代碼
3. 獲得一個純正的undefined
除了 void 咱們還能夠經過如下形式來獲取純正的undefined
未賦值的變量
var myUndefined;
console.log(typeof myUndefined); // 顯示"undefined"
複製代碼
無返回值函數
var getUndefined = function(){};
var myUndefined = getUndefined();
複製代碼
未定義的屬性
var myUndefined1 = {}[''];
var myUndefined2 = [][0];
複製代碼
js中位移運算有3種:左移(<<)、無符號右移(>>>)、有符號右移(>>)
爲何沒有有符號左移運算符:由於,左移是在後面補0,因此不會產生符號問題。
0. 前景摘要
首先咱們得先說說二進制。
引言
bit(位):數據存儲的最小單元。在計算機二進制系統中,位,簡記爲b,也稱爲比特(bit),每一個二進制數字0或1就是一個位(bit),其中每 8bit = 1 byte(字節);
什麼是二進制
不是計算機相關專業的同窗可能對這塊不太熟悉,生活中咱們有不少進制,如時鐘60進制,咱們用10進制來計數,一天24小時24進制。二進制在計算機技術中普遍應用。二進制數用0和1兩個數字及其組合來表示任何數,二進制的進位規則是:「逢2進1」。數字1在不一樣的位上表明不一樣的值,按從右至左的次序,這個值以2倍遞增。
具體詳情請查閱二進制的資料,本文再也不敘述。
1. 左移運算(<<)
好比咱們要左移一個2。2在二進制中用 0010
表示,左移一位以後得 0100
表示 4(其實操做的是補碼)
2. 有符號右移(>>)
原理和左移相同。咱們主要看下面的無符號右移
3. 無符號右移(>>>)
咱們先看 -1 無符號右移 1 位
打印出了 2147483647
2147483647
是32位操做系統中最大的符號型整型常量
在計算機系統中,數值一概用補碼來表示,第一位爲符號位,因此-1 在計算器中表示的二進制是
原碼爲 1000 0001
反碼爲 11111 1110
(符號位不變,其餘值取反)
補碼爲 1111 1111
補碼全部的位置都向右移動變成這樣子:
前面空了一位補0 變成 0111 1111
符號位變成了 0 也就是正數,正數的源碼和補碼都相同,因此最終返回 1111 1111