国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS按位非運算符(~)及雙非(~~)的使用

yagami / 1235人閱讀

摘要:最近看源碼,發現有用到了位運算符,以前也見過類似的用法,所以研究了下為什么這樣用。按位非運算符先看看的定義位運算由否定號表示,它是中為數不多的與二進制算術有關的運算符之一。

最近看zepto源碼,發現有用到了位運算符-not (~),以前也見過類似“~~value”的用法,所以研究了下為什么這樣用。

按位非運算符“~”

先看看w3c的定義:

位運算 NOT 由否定號(~)表示,它是 ECMAScript 中為數不多的與二進制算術有關的運算符之一。

位運算 NOT 是三步的處理過程:

把運算數轉換成 32 位數字

把二進制數轉換成它的二進制反碼(0->1, 1->0)

把二進制數轉換成浮點數

簡單的理解,對任一數值 x 進行按位非操作的結果為 -(x + 1)

console.log("~null: ", ~null);       // => -1
console.log("~undefined: ", ~undefined);  // => -1
console.log("~0: ", ~0);          // => -1
console.log("~{}: ", ~{});         // => -1
console.log("~[]: ", ~[]);         // => -1
console.log("~(1/0): ", ~(1/0));      // => -1
console.log("~false: ", ~false);      // => -1
console.log("~true: ", ~true);       // => -2
console.log("~1.2543: ", ~1.2543);     // => -2
console.log("~4.9: ", ~4.9);       // => -5
console.log("~(-2.999): ", ~(-2.999));   // => 1

那么, ~~x就為 -(-(x+1) + 1)

console.log("~~null: ", ~~null);       // => 0
console.log("~~undefined: ", ~~undefined);  // => 0
console.log("~~0: ", ~~0);          // => 0
console.log("~~{}: ", ~~{});         // => 0
console.log("~~[]: ", ~~[]);         // => 0
console.log("~~(1/0): ", ~~(1/0));      // => 0
console.log("~~false: ", ~~false);      // => 0
console.log("~~true: ", ~~true);       // => 1
console.log("~~1.2543: ", ~~1.2543);     // => 1
console.log("~~4.9: ", ~~4.9);       // => 4
console.log("~~(-2.999): ", ~~(-2.999));   // => -2
~value的使用

判斷數值中是否有某元素時,以前這樣判斷:

if(arr.indexOf(ele) > -1){...} //易讀

現在可以這樣判斷,兩者效率:

if(~arr.indexOf(ele)){...} //簡潔
~~value的使用

對于浮點數,~~value可以代替parseInt(value),而且前者效率更高些

parseInt(-2.99) //-2
~~(-2.99) //-2
測試
var time1 = +new Date();
var count = 5000000;
var ele = 1;
var arr = [1,2,4,5,2];
var h = 1.01;

console.time("parseInt");
for (var i = count; i > 0; i--) {
    parseInt(h);
}
console.timeEnd("parseInt"); //84.385ms

console.time("~~");
for (var i = count; i>0; i--) {
    ~~h;
}
console.timeEnd("~~"); //13.386ms


console.time("arr.indexOf(ele) > -1");
for (var j = count; j>0; j--) {
    arr.indexOf(ele) > -1;
}
console.timeEnd("arr.indexOf(ele) > -1"); //16.263ms

console.time("~arr.indexOf(ele)");
for (var i = count; i>0; i--) {
    ~arr.indexOf(ele);
}

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/85958.html

相關文章

  • 深入研究js運算及用法

    摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...

    zhoutao 評論0 收藏0
  • 深入研究js運算及用法

    摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...

    hlcfan 評論0 收藏0
  • 深入講解js運算及實際用法

    摘要:雖然在內部,數值都是以位浮點數的形式儲存,但是做位運算的時候,是以位帶符號的整數進行運算的,并且返回值也是一個位帶符號的整數。如下表應用場景取整對于一般的整數,返回值不會有任何變化。例如,結果為負數存儲采用的形式是二進制補碼。 什么是位運算? 位運算是在數字底層(即表示數字的 32 個數位)進行運算的。由于位運算是低級的運算操作,所以速度往往也是最快的(相對其它運算如加減乘除來說),并...

    jifei 評論0 收藏0
  • 按位操作符

    摘要:將任一數值與執行按位與操作,其結果都為。中應用判斷奇偶性偶數奇數按位異或規則每一位都不同,結果才為將任一數值與進行異或操作,其結果為。 位運算在算法中很有用,速度可以比四則運算快很多。 To2orTo10 JS中十進制轉二進制: (val).toString(2)JS中二進制轉十進制: parseInt(val, 2) JS中規定安全整數的范圍是-2^53~2^53,所以大于90071...

    caiyongji 評論0 收藏0
  • websocket 二進制數據傳輸基礎準備工作

    摘要:例如,十進制數,用二進制表示則為。按位操作符操作數字的二進制形式,但是返回值依然是標準的數值。不同為真相同為假二進制按位異或運算從左到右按位非為真,為假對每一項進行非操作,遇真則假,遇假則真。 二進制與十六進制 二進制用 0 1 表示 2= 10十六進制 前綴0x 用0123456789ABCDEF表示 2= 0x2二進制與十六進制的轉換十六進制的每位 等于二進制的四位 十六進制 0x...

    LeviDing 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<