javascript數值型有幾種

2022-09-23 18:00:21

javascript數值型只有一種:浮點型別。JavaScript內部儲存數位都是按64位元浮點型別儲存的,所以在JavaScript中實際上是沒有整數型別的。按照JavaScript中的數位格式能夠表示的整數範圍為「[-2^53 ~ 2^53]」,包含邊界值;但需要注意的是,陣列索引、位元運算符等使用的是基於32位元的整數。

前端(vue)入門到精通課程:進入學習
API 檔案、設計、偵錯、自動化測試一體化共同作業工具:

本教學操作環境:windows7系統、javascript1.8.5版、Dell G3電腦。

在JavaScript中,數值型別只有一種,內部表示為64位元浮點數。所以在JavaScript中實際上是沒有整數型別的。

print(3/2); // 1.5

可見,數值都是按浮點數來處理的。

因為JavaScript內部儲存數位都是按64位元浮點型別儲存的,無論整數和小數。容易造成混淆的是,某些位運算必須要整數才可以執行,所以會自動將64位元浮點數轉化為32位元整數。再進行位運算。在JavaScript中,1和1.0是一樣的

1 == 1.0 true
0.1+0.2 == 0.3 false
0.3/0.1 = 2.99999999996
(0.3-0.2) === (0.2-0.1) false

總之,涉及小數的運算要小心

按照JavaScript中的數位格式(IEEE-754定義的64位元浮點格式),能夠表示的整數範圍為[-2^53 ~ 2^53],包含邊界值。然而需要注意的是,陣列索引、位元運算符等使用的是基於32位元的整數。

浮點數值的最高精度是17位小數,但在進行算術計算時其精確度遠遠不如整數。例如,0.1加0.2的結果不是0.3,而是0.30000000000000004。這個小小的舍入誤差會導致無法測試特定的浮點數值。

因為二進位制浮點數可以精確地表示1/2、1/8等,但不能精確地表示1/10、1/100等。所以像0.1這樣的簡單數位也不能精確表示。

由於浮點數有精度問題,可能會在比較時得到一此意想不到的結果:

print((0.1+0.2) == 0.3); // false
print(0.1+0.2);          // 0.30000000000000004
print(0.3);              // 0.3

print((10/3-3) == (1/3));// false
print(10/3-3);           // 0.3333333333333335
print(1/3);              // 0.3333333333333333

對於整數的情況,只要使用53位以內的整數,則不會出現精度問題,可以放心使用。

除了以十進位制表示外,整數還可以通過八進位制(以8為基數)或十六進位制(以16為基數)的字面值來表示。其中,八進位制字面值的第一位必須是零(0),然後是八進位制數位序列(0~7)。如果字面值中的數值超出了範圍,那麼前導零將被忽略,後面的數值將被當作十進位制數值解析。

八進位制字面量在嚴格模式下是無效的,會導致支援該模式的JavaScript引擎丟擲錯誤。

十六進位制字面值的前兩位必須是0x,後跟任何十六進位制數位(0~9及A~F)。其中,字母 A~F 可以大寫,也可以小寫。

由於儲存浮點數值需要的記憶體空間是儲存整數值的兩倍,因此ECMAScript會不失時機地將浮點數值轉換為整數值。顯然,如果小數點後面沒有跟任何數位,那麼這個數值就可以作為整數值來儲存。同樣地,如果浮點數值本身表示的就是一個整數(如1.0),那麼該值也會被轉換為整數。

數值物件

與字串值對應著一個字串物件一樣,數值也有對應的數值物件,即Number。

數值同樣可以直接呼叫數值對應的屬性:

print((6).toString()); // 6

注意,本例中,數值需要新增括號,否則句點會被認為是小數點。

Number的使用與String的使用類似,可以進行型別轉換、建立數值物件等。

在進行型別轉換時,如果轉換不成功,即Number返回NaN,使用數值物件時也是如此。

var a = Number('x');
print(typeof a, a);       // number NaN
var b = new Number('x'); 
print(typeof b, b);       // object [Number: NaN]

Number具有5個特殊屬性(唯讀),即:

  • MAX_VALUE :正數最大值,再大就會變成Infinity

  • MIN_VALUE :正數最小值,再小就會變成0

  • NaN :Not a Number

  • NEGATIVE_INFINITY :負無窮大,即-Infinity

  • POSITIVE_INFINITY :正無窮大,即Infinity

print(Number.MAX_VALUE);         // 1.7976931348623157e+308
print(Number.MIN_VALUE);         // 5e-324
print(Number.NaN);               // NaN
print(Number.NEGATIVE_INFINITY); // -Infinity
print(Number.POSITIVE_INFINITY); // Infinity

Infinity

當數位運算結果超過了JavaScript所能表示數位上限時,結果為一個特殊的無窮大值(Infinity),如果是負數的值超過了JavaScript所能表示的負數範圍,則結果為-Infinity。

當運算結果無限接近於零並比JavaScript能表示的最小值還小的時候(下溢),結果為0,當負數發生下溢時,結果為-0,正數發生下溢,則結果為+0。

JavaScript預定義了全域性變數Infinity和NaN,它們都是唯讀變數。

由於記憶體的限制,ECMAScript並不能儲存世界上所有的數值。ECMAScript能夠表示的最小數值儲存在Number.MIN_VALUE中——在大多數瀏覽器中,這個值是5e-324;能夠表示的最大數值儲存在Number.MAX_VALUE中——在大多數瀏覽器中,這個值是1.7976931348623157e+308。如果某次計算的結果得到了一個超出JavaScript數值範圍的值,那麼這個數值將被自動轉換成特殊的Infinity值。具體來說,如果這個數值是負數,則會被轉換成-Infinity(負無窮),如果這個數值是正數,則會被轉換成Infinity(正無窮)。

如果某次計算返回了正或負的Infinity值,那麼該值將無法繼續參與下一次的計算,因為Infinity不是能夠參與計算的數值。要想確定一個數值是不是有窮的(換句話說,是不是位於最小和最大的數值之間),可以使用isFinite()函數。

NaN

NaN是一個特殊的數值,這個數值用於表示一個本來要返回數值的運算元未返回數值的情況(這樣就不會丟擲錯誤了)。

對於NaN,要記住的一點是,只要運算中出現NaN,結果就一定是NaN,就算是"NaN*0"這樣的運算,也一樣是NaN。只要對NaN執行比較執行,結果就一定是false,就算"NaN==NaN"/"NaN!=NaN"等,都是false。

要判斷一個值是否為NaN,可以使用isNaN()函數:

print(isNaN(NaN));  // true
print(isNaN(0/0));  // true

在基於物件呼叫isNaN()函數時,會首先呼叫物件的valueOf()方法,然後確定該方法返回的值是否可以轉換為數值。如果不能,則基於這個返回值再呼叫toString()方法,再測試返回值。

也可以使用x!==x來判斷x是否為NaN,只有在x為NaN的時候,這個表示式的值才為true。

inFinite()

isFinite函數用於判斷一個數是否為「正常」的數值:

print(isFinite(Number.NaN));               // false
print(isFinite(Number.NEGATIVE_INFINITY)); // false
print(isFinite(Number.POSITIVE_INFINITY)); // false

除了以上3個特殊值外,其他值的結果都為true

假如x是一個普通數值,則有:

x/0 = Infinity
x%0 = NaN
x/Infinity = 0
x%Infinity = x
0/0 = NaN
0%0 = NaN
Infinity/x = Infinity
Infinity%x = NaN
Infinity/Infinity = NaN
Infinity%Infinity = NaN

完整輸出如下:

print(0 / 0);           // NaN
print(3 / 0);           // Infinity
print(Infinity / 0);    // Infinity
print(0 % 0);           // NaN
print(3 % 0);           // NaN
print(Infinity % 0);    // NaN
----------
print(0 / 4);           // 0
print(3 / 4);           // 0.75
print(Infinity / 4);    // Infinity
print(0 % 4);           // 0
print(3 % 4);           // 3
print(Infinity % 4);    // NaN
----------
print(0 / Infinity);           // 0
print(3 / Infinity);           // 0
print(Infinity / Infinity);    // NaN
print(0 % Infinity);           // 0
print(3 % Infinity);           // 3
print(Infinity % Infinity);    // NaN

負零與正零

負零與正零的值相等,不過畢竟帶有符號,在一些運算中會有符號方面的差別,比如:

var zero = 0; 
var negz = -0;

此時,zero 等於 negz , 但1/zero 卻不等於 1/negz。

【相關推薦:、】

以上就是javascript數值型有幾種的詳細內容,更多請關注TW511.COM其它相關文章!