Javascript 提案 BigInt 的一些坑
1. 定義形式
BigInt
使用數字字面量加 n
表示支援二進位制、八進位制、十六進位制形式。
對於八進位制,只支援新寫法 0o064n
,不支援舊的寫法 0640
。
普通寫法:
1n
十六進位制:
0x6n
0X6n
八進位制:
0o6n
0O6n
06n// ❌SyntaxError
二進位制:
0b10n
0B10n
BigInt
不支援科學計數法形式:
1e25n// ❌ SyntaxError
2. 轉換為字串
當作為 key 時,所有值都會被轉換為字串,而 BigInt
轉字串時是沒有後綴 n
的。
String(12n)==="12"
因此:
let obj ={};
obj[32n]=1;
obj[32]===1;
陣列同理, array[5n]
等同於 array
等同於 array["5"]
。
注:這並不意味著 array[xxxn]
和 array[xxx]
是一樣的。因為 BigInt
可以超越 Number
的安全表示邊界。
let obj ={};
obj[9007199254740993n]="foo";
obj[9007199254740993n]==="foo";// ✅
obj["9007199254740993"]==="foo";// ✅
obj[9007199254740993]==="foo";// ❌
我們可以通過如下程式碼查一下原因:
let obj ={};
obj[9007199254740993n]="foo";
obj[9007199254740993]="bar";
Object
// ["9007199254740993", "9007199254740992"]
因為 String(9007199254740993)==="9007199254740992"
。
3. 零值處理
因為 BigInt
表示的是整數,所以只存在一個 0
(無正零和負零之分)。
Object.is(-0,0)===false
Object.is(-0n,0n)===true
注意: BigInt
中沒有 +0n
,具體原因見上。
4. 等值判斷
BigInt
同值判定規則:
陣列:
[0].includes(0n)===false
[0n].includes(0n)===true
[0n].includes(+0)===false
[0n].includes
Set
:
newSet([0]).has(0)===true
newSet([0n]).has(0)===false
newSet([0n]).has(0n)===true
newSet([0]).has(0n)===false
Map
:
newMap([[0n,42]]).has(0n)===true
newMap([[0n,42]]).has(0)===false
newMap([[0,42]]).has(0)===true
newMap([[0,42]]).has(0n)===false
由於 0
和 0n
不相等,所以在集合中,兩者可以共存:
let s =newSet([0,0n]);
s.size ===2;
let m =newMap([[0,42],[0n,24]]);
m.size ===2;
5. 與 Number 比較
BigInt
和 Nubmer
的不同。
BigInt
只有函式,沒有構造器,因此不能使用 new
來建立 BigInt
的例項。
newNumber(0);// ✅
newBigInt(0);// ❌
對某些特殊值的處理不同:
當沒有引數時,
Number
返回0
,BigInt
丟擲TypeError
Number()// 0
BigInt()// ❌ TypeError
當非數字時,
Number
返回NaN
,BigInt
丟擲TypeError
或SyntaxError
Number(undefined)// NaN
BigInt(undefined)// ❌ TypeError
Number(null)// 0
BigInt(null)// ❌ TypeError
Number({})// NaN
BigInt({})// ❌ SyntaxError
Number("foo")// NaN
BigInt("foo")// ❌ SyntaxError
兩者對於
-0
(負零)的處理也不同
Number(-0)===-0
相關推薦
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