1. 程式人生 > >Javascript 提案 BigInt 的一些坑

Javascript 提案 BigInt 的一些坑

1. 定義形式

BigInt 使用數字字面量加 n 表示支援二進位制、八進位制、十六進位制形式。

對於八進位制,只支援新寫法 0o064n,不支援舊的寫法 0640

  1. 普通寫法:

  1. 1n

  1. 十六進位制:

  1. 0x6n

  2. 0X6n

  1. 八進位制:

  1. 0o6n

  2. 0O6n

  3. 06n// ❌SyntaxError

  1. 二進位制:

  1. 0b10n

  2. 0B10n

  1. BigInt 不支援科學計數法形式:

  1. 1e25n// ❌ SyntaxError

2. 轉換為字串

當作為 key 時,所有值都會被轉換為字串,而 BigInt 轉字串時是沒有後綴 n 的。

  1. String(12n)==="12"

因此:

  1. let obj ={};

  2. obj[32n]=1;

  3. obj[32]===1;

陣列同理, array[5n] 等同於 array

[5] 等同於 array["5"]

:這並不意味著 array[xxxn]array[xxx] 是一樣的。因為 BigInt 可以超越 Number 的安全表示邊界。

  1. let obj ={};

  2. obj[9007199254740993n]="foo";

  3. obj[9007199254740993n]==="foo";// ✅

  4. obj["9007199254740993"]==="foo";// ✅

  5. obj[9007199254740993]==="foo";// ❌

我們可以通過如下程式碼查一下原因:

  1. let obj ={};

  2. obj[9007199254740993n]="foo";

  3. obj[9007199254740993]="bar";

  4. Object

    .keys(obj);

  5. // ["9007199254740993", "9007199254740992"]

因為 String(9007199254740993)==="9007199254740992"

3. 零值處理

因為 BigInt 表示的是整數,所以只存在一個 0(無正零和負零之分)。

  1. Object.is(-0,0)===false

  2. Object.is(-0n,0n)===true

注意BigInt 中沒有 +0n,具體原因見上。

4. 等值判斷

BigInt 同值判定規則:

  1. 陣列:

  1. [0].includes(0n)===false

  2. [0n].includes(0n)===true

  3. [0n].includes(+0)===false

  4. [0n].includes

    (-0)===false

  1. Set

  1. newSet([0]).has(0)===true

  2. newSet([0n]).has(0)===false

  3. newSet([0n]).has(0n)===true

  4. newSet([0]).has(0n)===false

  1. Map

  1. newMap([[0n,42]]).has(0n)===true

  2. newMap([[0n,42]]).has(0)===false

  3. newMap([[0,42]]).has(0)===true

  4. newMap([[0,42]]).has(0n)===false

由於 00n 不相等,所以在集合中,兩者可以共存:

  1. let s =newSet([0,0n]);

  2. s.size ===2;

  3. let m =newMap([[0,42],[0n,24]]);

  4. m.size ===2;

5. 與 Number 比較

BigIntNubmer 的不同。

BigInt 只有函式,沒有構造器,因此不能使用 new 來建立 BigInt 的例項。

  1. newNumber(0);// ✅

  2. newBigInt(0);// ❌

對某些特殊值的處理不同:

  1. 當沒有引數時, Number 返回 0, BigInt 丟擲 TypeError

  1. Number()// 0

  2. BigInt()// ❌ TypeError

  1. 當非數字時, Number 返回 NaN, BigInt 丟擲 TypeError 或 SyntaxError

  1. Number(undefined)// NaN

  2. BigInt(undefined)// ❌ TypeError

  3. Number(null)// 0

  4. BigInt(null)// ❌ TypeError

  5. Number({})// NaN

  6. BigInt({})// ❌ SyntaxError

  7. Number("foo")// NaN

  8. BigInt("foo")// ❌ SyntaxError

  1. 兩者對於 -0(負零)的處理也不同

  1. Number(-0)===-0

  2. 相關推薦

    JavaScript中this的一些

    opener PE 說明 立即執行 記得 noop cti 變化 也有 我們經常在回調函數裏面會遇到一些坑: var obj = { name: ‘qiutc‘, foo: function() { console.log(this); }, foo

    javascript陣列遍歷for in的一些

    js中陣列遍歷的時候,常見的的是for迴圈,簡單易懂 for (var index = 0; index < myArray.length; index++) { console.log(myArray[index]); } 但這樣寫比較麻煩

    javaScript一些

    <script> $(function(){ //上下文問題 $('.item_delete').click(function(){ var url = $(this).at

    隨筆:弱型別語言javascript中的一些

    測試1: (未宣告變數自動提升為全域性變數) test1(); function test1() { function setName() { name = '張三'; // 此處沒有var宣告,提升至全域性 } setName();

    JavaScript深拷貝的一些

    前言之前去一家公司面試的時候,面試官問了我一個問題,說:"如何才能深拷貝一個物件"。當時我心裡有些竊喜,這麼簡單的問題還用想嗎?於是脫口而出:"平時常用的有兩種辦法,第一種用JSON.parse(JSON.stringify(obj)),第二種可以使用for...in加遞迴完

    boost的named_mutex的一些

    time 發現 clu 登陸 last brush 方案 spa roc 最近遇到一個問題,程序在a用戶下運行後,然後註銷windows,登陸b用戶,發現程序奔潰,抓了下堆棧,發現了boost的named_mutex一些細節,記錄下 #include <boost

    javascript this的一些誤解

    java 太拘泥於“this”的字面意思就會產生一些誤解。有兩種常見的對於this 的解釋,但是它們都是錯誤的。介紹之前先解釋下什麽是動態作用域簡要地分析一下動態作用域,重申它與詞法作用域的區別。但實際上動態作用域是JavaScript 另一個重要機制this 的表親。詞法作用域是一套關

    hibernate5的一些

    title filter 復制 項目 解決方法 ssi 出錯 conn org SessionFactory創建的修改   如果你是剛剛從hibernate4升級到hibernate5,這時候你的項目肯定就要出錯了,什麽錯呢?   org.hibernate.Mapping

    Docker - 記錄在window 上的一些

    一個 ima 默認 windows doc 技術 con terminal nbsp 前言 由於領導要在超極本上面演示一些東西,所以決定在window平臺上面使用docker,於是乎,便有了下面的一些故事。。。 CPU / Memery 的總體設置 眾所周知,在

    Spring context:property-placeholder 一些

    div ont spring 原因 log 解決 prop 解決辦法 col 今天在配置多配置文件的時候偶然發現如果我使用 1 <context:property-placeholder location="classpath:filePath.properties

    同時集成百度地圖、定位以及導航遇到的一些

    so文件 成了 自己 sel ear 模擬 images 謝謝 function 項目用到的地圖功能有點多,同時集成了地圖、定位以及導航這幾個功能。 每個單獨使用,都很順利,但合在一起用會有問題。 我每次集成百度地圖,都會在http://lbsyun.baidu.com/s

    蘋果手機 微信開發下jquery 的一些

    mage 時間格式 image 標簽 out point put pointer ava 最近做維系項目中遇到了一些jquery的坑: function GetRTime(){ var EndTime= new Date(‘<?php echo

    vue的一些(第二天)

    作用 小童 過濾 文本 click rip col 官方 小數點 首先啊感謝一位小童鞋的指出其實我寫的這些內容算不上坑,只是平時使用的時候的一點小問題,不過只是個名字啦!再次致謝 1:兩個簡寫的命令 v-bind:class可以簡寫為 :class v-on:click可

    cat集成項目所遇到的一些

    esp abs 不能 factory container dap 報錯 eem lan 第一個問題:(jar包依賴沖突) 啟動報錯,直接貼log zhengxin-third-shanghai-cis [2017-08-21 14:17:49] 56231 WARN [m

    關於微信公眾號開發的一些

    response com type 簽名 scope 百度分享 授權 微信公眾號 href 一.微信分享是不允許開發者在頁面調用,只能通過上方菜單點擊才可以實現分享 解決方法:1.彈出遮蓋層提示用戶點擊上方按鈕      2.百度分享js可以調用許多分享接口 二.微信

    美團在Redis上踩過的一些-3.redis內存占用飆升(轉載)

    car shu idl 運維人員 監控 images 我想 依然 服務器 一、現象: redis-cluster某個分片內存飆升,明顯比其他分片高很多,而且持續增長。並且主從的內存使用量並不一致。 二、分析可能原因: 1. redis-clus

    Mybatis框架--基礎使用的一些

    settings () ash string mysql select tty tin {0} 1 mybatis的底層實現   使用dom4j將配置文件讀取出來,使用動態代理動態創建代理對象,中間的調用方法和過程是使用java的反射機制 2 數據庫字段和屬性名不一致的問

    一些

    flex 主動 () ash 空隙 serve set ray 加載速度 兩者順序不能反過來,某些系統會有不可預料的錯亂   display: -webkit-flex; display: flex; 背景,background-size 必須單獨拆出來,理由同上

    vagrant mac的一些

    isa 狀態 同步 config led DDU status get ant 環境介紹:centtos6.5 vagrant:2.0.1VirtualBox:5.1.30 1、添加box之後,設置了共享的目錄之後,vagrant up 會出現以下的問題 Vagrant w