你真的不知道的JavaScript

前言

最近一直在反編譯一些有趣的微信小程序的源碼來學習。在看了那些比較難看的源碼中發現了不少我所不知道的js中的知識,so,此文章記錄一下。javascript

更多筆記html


目錄

目錄
void
位移運算符(<<,>>,>>>)

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];
    複製代碼

參考文章:從void 0 === undefined提及


位移運算符

目錄

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

相關文章
相關標籤/搜索