<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          JavaScript中奇特的~運算符

          時間:?2018-01-03閱讀:?906標簽:?js知識

          ~的規則是什么

          看下規范里面的定義的~:

          產生式 UnaryExpression : ~ UnaryExpression 按照下面的過程執行:

          1. 令 expr 為解釋執行 UnaryExpression 的結果。

          2. 令 oldValue 為 ToInt32(GetValue(expr))。

          3. 返回 oldValue 按位取反的結果。結果為 32位 有符號整數。


          總結一下即將數字進行抽象Toint32操作,再進行按位取反。那么再來看下關于Toint32:


          數字進行Toint32操作會轉化成32位有符號數,第一位為符號位,后面31位為表示整數數值。最后對數字進行按位取反即可得到~轉換后的結果。


          舉個例子

          //以18為例子,進行Toint32抽象操作
          //將18表示為二進制形式
               0    000 0000 0000 0000 0000 0000 0001 0010
          //|符號位||              數值部分                |  
          
          //按位取反
              1     111 1111 1111 1111 1111 1111 1110 1101
          //|符號位||              數值部分                |  
          

          可以發現現在將18進行了按位非操作之后這個數變成了一個負數,同時我們可以看到這么多個1。。感覺這個負數很大啊?所以~18會是一個很大的負數么?我們打印看下:


          好像和預料中的有些出入?


          負數是如何存成二進制的?

          我們可以直接打印看下:


          然而這并不是我們想要的,會有這個結果是因為ECMAScript采用了這樣簡單的方式來避免開發者接觸一些底層的操作,真實的存儲二進制負數的方式應該是采用補碼的形式。而也正是由于補碼的操作我們才能解釋為什么~18 === -19


          補碼

          生成補碼的三個步驟:

          確定該數字的非負版本的二進制表示(例如,要計算 -18的二進制補碼,首先要確定 18 的二進制表示)

          求得二進制反碼,即要把 0 替換為 1,把 1 替換為 0

          在二進制反碼上加 1

          我們先不管為什么負數要用補碼來存儲,先來看下~18 === -19是如何而來的。
          根據上述計算-19的補碼步驟:

          //將19表示為二進制形式
               0    000 0000 0000 0000 0000 0000 0001 0011
          //|符號位||              數值部分                |  
          
          //按位取反
              1     111 1111 1111 1111 1111 1111 1110 1100
          //|符號位||              數值部分                |  
          
          //反碼加一
              1     111 1111 1111 1111 1111 1111 1110 1100
                                                         1
              --------------------------------------------
              1     111 1111 1111 1111 1111 1111 1110 1101
          //同時 18的按位取反表示為:
              1     111 1111 1111 1111 1111 1111 1110 1101
          

          所以我們可以看到,由于補碼為按位取反并+1,~ 為按位取反,那么也就可以說明為什么~18 === -19 同時我們也可以得出結論即:

          ~x === -(x+1)


          那么為什么負數存儲為補碼?

          因為計算機在做二進制運算的時候,不希望考慮運算數的符號,全部希望執行加法操作來得出正確結果,由此引入了補碼的概念。比如我們試圖用4-2的結果與4+2的補碼結果比對來進行說明:

          4 - 2 =>
          0100 - 0010 = 0010
          4 + (-2) =>
          0010 + 1110 = 0010(相加超過位數,溢出自動丟失)
          


          ~的應用

          對哨位值進行~操作

          哨位值一般可以表示失敗的意思。例如js中的哨位值如-1,當你執行indexOf操作時,如果找不到目標則返回-1,同時~-1 = 0,由此我們可以將代碼轉變為:

          if(str.indexOf('js') != -1) => if(~indexOf('js'))
          

          那么為什么不使用>=0或者!= -1這種操作呢,在《你不知道的JavaScript》一書中,將之成為“抽象滲漏”,意思是在代碼中暴露了底層實現細節,我們可以選擇屏蔽掉細節。故 ~ 可以和indexOf進行配合判斷真假值,核心思路就是運用了~x === -(x+1)

          浮點數取整

          我們現在知道~ 會進行按位取反的過程中會進行Toint32抽象操作,在這個過程中會將浮點數去掉,只對前面32位整數進行處理。故我們可以使用~進行以下操作:

          ~~3.12 = 3
          

          同時需要注意由于~的特性,小數點后面的部分是直接被干掉的,而不是會進行Math.floor之類的四舍五入操作。


          參考資料

          慣例po作者的博客,不定時更新中——

          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/310

          javascript中什么是句柄?

          一個句柄是指使用的一個唯一的整數值,即一個4字節(64位程序中為8字節)長的數值,來標識應用程序中的不同對象和同類中的不同的實例。

          javascript不可變性是什么?

          不可變性即某個變量在進行了某個操作之后,其本身沒有發生變化,比如對于字符串而言,對字符串的任何操作都會改變字符串本身的值,而是在字符串的基礎上復制出來一個然后再改變,這樣我們就說是不可變的

          為什么javascript不起作用?

          JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。

          javascript怎么判斷按鈕被點擊?

          JavaScript可以通過Event對象的target事件或srcElement(IE瀏覽器支持)來判斷按鈕是否被點擊。Event對象代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。

          javascript由幾部分組成?

          JavaScript有三部分組成。分別為核心(ECMAScript) 、文檔對象模型(DOM)、瀏覽器對象模型(BOM)。這三部分分別描述了該語言的語法和基本對象、處理網頁內容的方法和接口、與瀏覽器進行交互的方法和接口。

          Js輸出方式有哪些?

          在編寫JavaScript代碼的時候, 一定要記住每一句代碼后面都需要添加一個分號, 并且這個分號必須是英文的分號,我們會發現有時候不寫分號程序也能夠運行, 這里并不是因為不需要分號, 而是瀏覽器自動幫助我們添加了分號

          7個常見的 JavaScript 測驗及解答

          我相信學習新事物并評估我們所知的東西對自己的進步非常有用,可以避免了我們覺得自己的知識過時的情況。在本文中,我將介紹一些常見的 JavaScript 知識。請享用!

          Js中constructor指向問題

          首先用一個例子指出來constructor存在形式。由上面的代碼我們總結出結論1:上面的代碼在控制臺可以看出constructor是指向構造器Fruit的引用。這個地方就有點奇怪了。這個constructor到底指向的是那個實例的構造器?

          javascript難點是什么?

          javascript難點是什么?下面本篇文章就來給大家介紹一下10個JavaScript難點,感興趣的小伙伴們可以參考一下,希望對大家有所幫助。立即執行函數,即Immediately Invoked Function Expression (IIFE),正如它的名字

          Js如何獲取ul中li的個數?

          javascript如何獲取ul中li的個數?下面本篇文章就來給大家介紹一下使用javascript獲取ul中li個數的方法,希望對大家有所幫助。

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网