Js中每一個值都屬於某一種數據類型, 根據最新的語言標准,一共有8種類型
-
Boolean
-
Null
-
Undefined
-
Number
-
BigInt
-
String
-
Symbol
-
Object
下面我來說一下新增的BigInt及Symbol
首先來看張圖
控制台敲出90099999999999992 == 90099999999999993 竟然等於true 90099999999999992 === 90099999999999993也等於true , 剛開始感覺刷新我的三觀
經過度娘調查才知道
此標准下,無法精確表示的非常大的整數將自動四舍五入。確切地說,JS 中的Number
類型只能安全地表示-9007199254740991 (-(2^53-1))
和9007199254740991(2^53-1)
之間的整數,任何超出此范圍的整數值都可能失去精度。
解決方法
JS 提供Number.MAX_SAFE_INTEGER
常量來表示 最大安全整數,Number.MIN_SAFE_INTEGER
常量表示最小安全整數:
或者就是使用新的數據類型BigInt 直接在數字后面加n即可
隱式類型轉換
因為隱式類型轉換可能丟失信息,所以不允許在bigint
和 Number
之間進行混合操作。當混合使用大整數和浮點數時,結果值可能無法由BigInt
或Number
精確表示。比如:
10 + 10n; // → TypeError 10n > 5; // → true
Math.max(2n, 4n, 6n); // → TypeError 10 + Number(10n); // → 20
下面是symbol
symbol是es6出的一種類型 本質上是一種唯一標識符,可用作對象的唯一屬性名,這樣其他人就不會改寫或覆蓋你設置的屬性值 如圖
再次聲明相同key的symbol是會報錯
Symbol 數據類型的另一特點是隱藏性,for···in,object.keys() 不能訪問
let id = Symbol("id");
let obj = {
[id]:'symbol'
};
for(let option in obj){
console.log(obj[option]); //空
}
但是也可以用Object.getOwnPropertySymbol 方法會返回一個數組,成員是當前對象的所有用作屬性名的 Symbol 值。
官方提供了全局注冊並登記的方法:Symbol.for() 通過Symbol.keyFor()取值