您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“javascript數值型只有一種嗎”,內容詳細,步驟清晰,細節處理妥當,希望這篇“javascript數值型只有一種嗎”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
javascript數值型只有一種:浮點類型。JavaScript內部存儲數字都是按64位浮點類型存儲的,所以在JavaScript中實際上是沒有整數類型的。按照JavaScript中的數字格式能夠表示的整數范圍為“[-2^53 ~ 2^53]”,包含邊界值;但需要注意的是,數組索引、位操作符等使用的是基于32位的整數。
本教程操作環境: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數值型只有一種嗎”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。