二進(jìn)制和八進(jìn)制數(shù)值表示法
ES6提供了二進(jìn)制和八進(jìn)制數(shù)值的新寫法,分別前綴 0b(或0B)、 0o(或0O)然后跟上二進(jìn)制、八進(jìn)制值即可。
二進(jìn)制(Binary)表示法新寫法:前綴 0b 或 0B。
let binary = 0b010101; // 21
let binary2 = 0B010111; // 23
八進(jìn)制(Octal)表示法新寫法:前綴 0o 或 0O。
let octal = 0o123; // 83
let octal2 = 0O1234; // 668
從ES5開始,嚴(yán)格模式下,八進(jìn)制數(shù)值就不再允許用前綴0 表示,ES6則進(jìn)一步明確規(guī)定,八進(jìn)制數(shù)值用0o前綴 表示。
// 非嚴(yán)格模式
(function () {
console.log(0o01 === 001);
})();
// true
// 嚴(yán)格模式
(function () {
'use strict';
console.log(0o01 === 001); // Octal literals with prefix '0' are not allowed. Use '0o' prefix instead
})();
// Uncaught SyntaxError: Octal literals are not allowed in strict mode.
數(shù)值的驗(yàn)證、判斷、以及轉(zhuǎn)換
ES6不僅提供了很多新的數(shù)值處理方法,同時(shí)還將之前相對(duì)零散的全局處理方法都整理到了Number對(duì)象里面。
數(shù)值的驗(yàn)證:Number.isFinite()【用于檢查一個(gè)數(shù)值是否為有限的( finite),即不是 Infinity】,Number.isNaN()【用于檢查一個(gè)值是否為NaN】
數(shù)值的判斷:Number. isInteger()【用于判斷一個(gè)數(shù)值是否為整數(shù)】,Number.isSafeInteger()【用于判斷整數(shù)是否在安全整數(shù)范圍內(nèi)】
數(shù)值的轉(zhuǎn)換:Number.parseInt(),Number.parseFloat()
數(shù)值的驗(yàn)證:ES6在Number對(duì)象內(nèi),新提供了 Number.isFinite() 和 Number.isNaN() 兩個(gè)方法。
1、Number.isFinite():用于檢查一個(gè)數(shù)值是否為有限的(finite),即不是Infinity 。同時(shí)Number.isFinite() 沒有進(jìn)行隱式的 Number() 類型轉(zhuǎn)換,所有非數(shù)值都返回 false。所以Number.isFinite()還可以用來進(jìn)行數(shù)字驗(yàn)證,只要是數(shù)值,不論是整形還是浮點(diǎn)型都會(huì)返回 true,非數(shù)值則一律返回 false。
console.log(Number.isFinite('testDemo')); // false 字符串
console.log(Number.isFinite(1992)); // true 整形數(shù)值
console.log(Number.isFinite(0.5)); // true 浮點(diǎn)型
console.log(Number.isFinite(true)); // false 布爾值
console.log(Number.isFinite(null)); // false null
console.log(Number.isFinite(undefined)); // false undefined
console.log(Number.isFinite([1, 2, 3])); // false 數(shù)組
console.log(Number.isFinite({test: 'Demo'})); // false 對(duì)象
console.log(Number.isFinite(NaN)); // false NaN
console.log(Number.isFinite(Infinity)); // false Infinity
console.log(Number.isFinite(-Infinity)); // false -Infinity
2、Number.isNaN():用于檢查一個(gè)值是否為NaN。 若參數(shù)類型不是NaN, Number.isNaN() 則一律返回 false, 而且 Number.isNaN() 也沒有進(jìn)行隱式的 Number() 類型轉(zhuǎn)換。
console.log(Number.isNaN('testDemo')); // false
console.log(Number.isNaN('testDemo'/0)); // true
console.log(Number.isNaN('true'/'true')); // true
console.log(Number.isNaN(1992)); // false
console.log(Number.isNaN(1992/0)); // false
console.log(Number.isNaN(0.5)); // false
console.log(Number.isNaN(true)); // false
console.log(Number.isNaN(true/0)); // false
console.log(Number.isNaN(null)); // false
console.log(Number.isNaN(undefined)); // false
console.log(Number.isNaN([1, 2, 3])); // false
console.log(Number.isNaN({test: 'Demo'})); // false
console.log(Number.isNaN(NaN)); // true
console.log(Number.isNaN(1992/NaN)); // true
console.log(Number.isNaN(Infinity)); // false
console.log(Number.isNaN(-Infinity)); // false
數(shù)值的判斷:Number. isInteger()【用于判斷一個(gè)數(shù)值是否為整數(shù)】,Number.isSafeInteger()【用于判斷數(shù)值是否在安全范圍內(nèi)】
1、Number.isInteger() :用于判斷一個(gè)數(shù)值是否為整數(shù)。如果參數(shù)不是數(shù)值,Number.isInteger()則 返回false。
console.log(Number.isInteger(0)); // true
// JavaScript內(nèi)部,整數(shù)和浮點(diǎn)數(shù)采用同樣的儲(chǔ)存方法,因此 1 與 1.0 被視為相同的值
console.log(Number.isInteger(1)); // true
console.log(Number.isInteger(1.0)); // true
console.log(Number.isInteger(1.1)); // false
console.log(Number.isInteger(Math.PI)); // false
// NaN 和正負(fù) Infinity 都不是整數(shù)
console.log(Number.isInteger(NaN)); // false
console.log(Number.isInteger(Infinity)); // false
console.log(Number.isInteger(-Infinity)); // false
console.log(Number.isInteger("1992")); // false
console.log(Number.isInteger(true)); // false
console.log(Number.isInteger(false)); // false
console.log(Number.isInteger(null)); // false
console.log(Number.isInteger(undefined)); // false
console.log(Number.isInteger([1,2,3])); // false
console.log(Number.isInteger({test: 'Demo'})); // false
// 數(shù)值的精度超過53個(gè)二進(jìn)制位(1個(gè)隱藏位,52個(gè)有效位)時(shí),由于第54位及后面的位被丟棄,JS會(huì)產(chǎn)生誤判,此時(shí)就相當(dāng)于在判定1.000000000000000,所以會(huì)返回true。
console.log(Number.isInteger(1.0000000000000001)); // true
// 同理,當(dāng)一個(gè)數(shù)值的絕對(duì)值小于Number.MIN_VALUE(5E-324),即小于JavaScript能夠分辨的最小值,會(huì)被自動(dòng)轉(zhuǎn)為0,此時(shí)JS也會(huì)產(chǎn)生誤判。
console.log(Number.isInteger(5E-324)); // false 5E-324 還沒超出最小值范圍,所以isInteger()判定還是false。
console.log(Number.isInteger(5E-325)); // true 5E-325 由于值太小,超出JS能夠分辨的最小值范圍,所以被自動(dòng)轉(zhuǎn)為0,因此isInteger()判定為true。
總之,如果對(duì)數(shù)據(jù)的精度要求較高,在進(jìn)行數(shù)據(jù)是否為整數(shù)進(jìn)行判定時(shí),不建議使用Number.isInteger()方法。
2、Number.isSafeInteger() :用于判定整數(shù)是否在安全整數(shù)范圍內(nèi)。
數(shù)值的轉(zhuǎn)換:Number.parseInt(),Number.parseFloat()。ES6將之前的全局方法 parseInt() 和 parseFloat() 移植到了Number對(duì)象內(nèi),行為和之前的全局方法一樣。這樣將之前的全局方法逐步移植到各個(gè)模塊內(nèi),既減少了全局性方法數(shù)量,又使得方法逐步模塊化,聚合化。
1、Number.parseInt() :用于解析一個(gè)字符串,并返回一個(gè)整數(shù)。
2、Number.parseFloat() :用于解析一個(gè)字符串,并返回一個(gè)浮點(diǎn)數(shù)。
// 不指定轉(zhuǎn)換進(jìn)制時(shí),默認(rèn)為 10 進(jìn)制
// parseInt() 和 Number.parseInt()
// ES5寫法
parseInt('1992.102'); // 1992
parseInt(1992.102); // 1992
// ES6新寫法
Number.parseInt('1992.1020'); // 1992
Number.parseInt(1992.1020); // 1992
// 指定轉(zhuǎn)換進(jìn)制時(shí),第二個(gè)參數(shù)指定的基數(shù)(基數(shù)可以是10[默認(rèn)基數(shù),可以不寫], 2, 8或 16等進(jìn)制數(shù)),將字符串參數(shù)解析為有符號(hào)的整數(shù)。
Number.parseInt('0101',2); // 5
Number.parseInt('111',8); // 73
Number.parseInt('222',16); // 546
Number.parseInt('-333',10); // -333
// parseFloat() 和 Number.parseFloat()。兩方法都是先判定指定字符串或數(shù)字串中的首個(gè)字符是否是數(shù)字。是,則對(duì)該字符串進(jìn)行解析,直到數(shù)字的末端為止,然后以數(shù)字格式返回該數(shù)字。
// 注:字符串中只返回第一個(gè)數(shù)字、字符串開頭和結(jié)尾允許存在空格,但中間如出現(xiàn)空格,則空格后面的數(shù)字將不予識(shí)別。
// ES5寫法
parseFloat('1992.1020abc'); // 1992.102
parseFloat(1992.1020); // 1992.102
parseFloat(' 199 2.1020abc '); // 199
// ES6新寫法
Number.parseFloat('1992.1020abc'); // 1992.102
Number.parseFloat(1992.1020); // 1992.102
Number.parseFloat(' 1992.1 020abc '); // 1992.1
// 當(dāng)首個(gè)字符無法被解析成整數(shù)和浮點(diǎn)數(shù)時(shí)(若首個(gè)字符被解析為正負(fù)號(hào)時(shí),則判定第二個(gè)字符的解析結(jié)果),則都返回 NaN
Number.parseInt('abc'); // NaN
Number.parseFloat('abc'); // NaN
// Number.parseInt()與全局的 parseInt() 方法是同一個(gè)方法
Number.parseInt === parseInt; // true
// Number.parseFloat()與全局的 parseFloat() 方法也是同一個(gè)方法
Number.parseFloat === parseFloat; // true
最大/最小安全數(shù) 以及Number.isSafeInteger()
安全整數(shù)及安全整數(shù)范圍:安全整數(shù)是 JavaScript 中能夠精確表示的整數(shù),其范圍在 2 的 -53 次方到 2 的 53 次方之間(不包括兩個(gè)端點(diǎn),既(-Math.pow(2, 53),Math.pow(2, 53))),超過這個(gè)范圍(不論是整數(shù)還是小數(shù))JavaScript 都無法精確表示該數(shù)了。
安全數(shù)范圍:大小在 2 的 -53 次方到 2 的 53 次方之間(不包括兩個(gè)端點(diǎn),既(-Math.pow(2, 53),Math.pow(2, 53)))的數(shù)。
最大安全整數(shù):安全整數(shù)的上限,即 2 的 53 次方減 1 ?! ath.pow(2, 53)-1; // 9007199254740992-1
最小安全整數(shù):安全整數(shù)的下限,即 2 的 53 次方減 1 的負(fù)數(shù)?! ?(Math.pow(2, 53)-1); // -(9007199254740992-1)
常量:ES6 引入了 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 兩個(gè)常量,用來表示安全整數(shù)的上下限。以便于日常開發(fā)過程中 判定數(shù)值是否超出安全范圍。
Math.pow(2, 53); // 9007199254740992
Math.pow(2, 53)-1; // 9007199254740991
-(Math.pow(2, 53)-1); // -9007199254740991
Math.pow(2, 53) === Math.pow(2, 53) + 0.01; // true,超出 2 的 53 次方之后,JS就無法精確表示這個(gè)值了,哪怕多0.01都不行。
-Math.pow(2, 53) === (-Math.pow(2, 53))-0.01; // true
console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991
console.log(Number.MIN_SAFE_INTEGER); // -9007199254740991
console.log(Number.MAX_SAFE_INTEGER === Math.pow(2, 53) - 1); // true
console.log(Number.MIN_SAFE_INTEGER === -(Math.pow(2, 53) - 1)); // true
Number.isSafeInteger():用于判定整數(shù)是否在安全整數(shù)范圍內(nèi)。
// Number.isSafeInteger()用于判定整數(shù)是否在安全整數(shù)范圍內(nèi)
Number.isSafeInteger(Number.MAX_SAFE_INTEGER); // true
Number.isSafeInteger(Number.MAX_SAFE_INTEGER + 1); // false
Number.isSafeInteger(Number.MIN_SAFE_INTEGER); // true
Number.isSafeInteger(Number.MIN_SAFE_INTEGER - 1); // false
Number.isSafeInteger(1992); // true
|