JavaScript只有一種數(shù)字類型,沒(méi)有整數(shù)和浮點(diǎn)數(shù)的單獨(dú)指定。
因此,數(shù)字可以用JavaScript編寫(xiě),帶或不帶小數(shù)。
var a = 25; // 無(wú)小數(shù)點(diǎn) var b = 80.05; // 有小數(shù)點(diǎn)測(cè)試看看?/?
在以上兩種情況下,數(shù)據(jù)類型都是一個(gè)數(shù)字,并且無(wú)論該數(shù)字是否帶有小數(shù)點(diǎn)都相同。
可以在JavaScript中使用科學(xué)的指數(shù)表示法來(lái)縮寫(xiě)非常大或很小的數(shù)字,如以下示例所示:
let num1 = 957e8; // 95700000000 let num2 = 957e-8;// 0.00000957測(cè)試看看?/?
JavaScript中的數(shù)字被認(rèn)為是準(zhǔn)確的,最多15位數(shù)字。這意味著數(shù)字將在到達(dá)第16位后四舍五入:
let num1 = 999999999999999; // 值保持不變 999999999999999 let num2 = 9999999999999999;// 向上舍入到 10000000000000000測(cè)試看看?/?
與其他語(yǔ)言不同,JavaScript不會(huì)定義不同類型的數(shù)字,例如整數(shù),短整數(shù),長(zhǎng)整數(shù),浮點(diǎn)數(shù)等。
JavaScript數(shù)字具有64位精度,這也稱為雙精度。
內(nèi)部表示基于IEEE 754標(biāo)準(zhǔn)。
64位在數(shù)字的符號(hào),指數(shù)和小數(shù)之間分配,如下所示:
標(biāo)識(shí) | 指數(shù) | 分?jǐn)?shù) |
---|---|---|
1 bit | 11 bit | 52 bit |
Bit 63 | Bits 62–52 | Bits 51–0 |
從前面的章節(jié)中可以知道,+運(yùn)算符用于數(shù)字相加和字符串拼接。
如果為數(shù)字則數(shù)字相加。為字符串則將字符串串聯(lián)起來(lái)。
如果將兩個(gè)數(shù)字相加,則結(jié)果將是一個(gè)數(shù)字:
let x = 50; let y = 10; let z = x + y; // z = 60 (a number)測(cè)試看看?/?
如果是兩個(gè)字符串,結(jié)果將是字符串串聯(lián):
let x = "50"; let y = "10"; let z = x + y; // z = 5010 (a string)測(cè)試看看?/?
如果數(shù)字和字符串,結(jié)果將是字符串串聯(lián):
let x = 50; let y = "10"; let z = x + y; // z = 5010 (a string)測(cè)試看看?/?
如果字符串和數(shù)字,結(jié)果將是字符串串聯(lián):
let x = "50"; let y = 10; let z = x + y; // z = 5010 (a string)測(cè)試看看?/?
JavaScript從左到右計(jì)算表達(dá)式。不同的序列可以產(chǎn)生不同的結(jié)果。
在下面的示例中,首先將50 + 10相加,因?yàn)閤和y都是數(shù)字,然后將60 +“30”連接起來(lái),因?yàn)閦是字符串:
let x = 50; let y = 10; let z = "30"; let sum = x + y + z; // sum = 6030 (a string)測(cè)試看看?/?
一個(gè)常見(jiàn)的錯(cuò)誤,預(yù)期此結(jié)果為60:
let x = 50; let y = 10; let z = "The sum is: " + x + y;測(cè)試看看?/?
您可以使用括號(hào)解決以上問(wèn)題:
let x = 50; let y = 10; let z = "The sum is: " + (x + y);測(cè)試看看?/?
JavaScript字符串可以包含數(shù)字值。
let x = 50; // x 是一個(gè)數(shù)字 let y = "50"; // y 是一個(gè)字符串
如果字符串包含數(shù)字值,則可以在JavaScript中執(zhí)行數(shù)學(xué)表達(dá)式。
可以執(zhí)行除法:
let x = "50" / "10"; // x = 5測(cè)試看看?/?
可以執(zhí)行乘法:
let x = "50" * "10"; // x = 500測(cè)試看看?/?
可以執(zhí)行冪運(yùn)算:
let x = "5" ** "3"; // x = 125測(cè)試看看?/?
可以執(zhí)行增量:
let x = "50"; x++; // x = 51測(cè)試看看?/?
可以執(zhí)行減法:
let x = "50" - "10"; // x = 40測(cè)試看看?/?
無(wú)法執(zhí)行加法:
let x = "50" + "10"; // x = 5010測(cè)試看看?/?
注意:如果添加兩個(gè)字符串,結(jié)果將是字符串串聯(lián)。
在JavaScript NaN中,保留字表示數(shù)字不是合法數(shù)字。
如果您嘗試對(duì)數(shù)字和非數(shù)字值執(zhí)行數(shù)學(xué)運(yùn)算,NaN將返回。
var x = 50 / "(cainiaoplus.com)"; // x = NaN (Not a Number)測(cè)試看看?/?
但是,如果字符串包含數(shù)字值,則可以使用JavaScript執(zhí)行數(shù)學(xué)表達(dá)式:
var x = 50 / "10"; // x = 5測(cè)試看看?/?
您可以使用全局JavaScript isNaN()函數(shù)來(lái)確定值是否為數(shù)字:
var x = 50 / "(cainiaoplus.com)"; isNaN(x);// 返回true,因?yàn)閤不是一個(gè)數(shù)字測(cè)試看看?/?
將值分配給NaN操作中使用的變量NaN時(shí),即使另一個(gè)操作數(shù)是合法數(shù)字,也將導(dǎo)致的值:
var x = NaN; var y = 27; var z = x + y; // z = NaN測(cè)試看看?/?
NaN是一個(gè)數(shù)字;typeof NaN返回number:
typeof NaN; // will return "number"測(cè)試看看?/?
Infinity(正無(wú)窮)或-Infinity(負(fù)無(wú)窮)如果您計(jì)算的數(shù)字超出JavaScript中可用的最大數(shù)字,則將返回。
對(duì)于未定義的值,也將發(fā)生這些情況,例如除以零時(shí):
var x = 5 / 0; // 將返回?zé)o窮 var y = -5 / 0; // 將返回負(fù)無(wú)窮測(cè)試看看?/?
用技術(shù)術(shù)語(yǔ)來(lái)說(shuō),Infinity(正無(wú)窮)當(dāng)數(shù)字超過(guò)number時(shí)將顯示1.797693134862315E+308,它表示JavaScript中的上限。
同樣,-Infinity(負(fù)無(wú)窮)當(dāng)數(shù)字超出的下限時(shí)將顯示-1.797693134862316E+308。
Infinity是一個(gè)數(shù)字:typeof Infinity返回number:
typeof Infinity; // will return "number"測(cè)試看看?/?
該數(shù)字Infinity也可以在循環(huán)中使用:
var num = 5; while (num != Infinity) { // 這里的代碼將執(zhí)行到num = ∞ }測(cè)試看看?/?
默認(rèn)情況下,JavaScript將數(shù)字顯示為以10為基數(shù)的小數(shù)。
數(shù)字也可以用十六進(jìn)制(基數(shù)16),二進(jìn)制(基數(shù)2)和八進(jìn)制(基數(shù)8)表示。
十六進(jìn)制數(shù)字的前綴為0x:
var x = 0xFF; // x = 255測(cè)試看看?/?
二進(jìn)制數(shù)字的前綴為0b:
var x = 0b1111;// x = 15測(cè)試看看?/?
切勿寫(xiě)一個(gè)以零開(kāi)頭的數(shù)字(例如0121)。如果將數(shù)字寫(xiě)成前導(dǎo)零,則JavaScript會(huì)將數(shù)字解釋為八進(jìn)制:
var x = 016;測(cè)試看看?/?
您可以使用該toString()方法從2到36的數(shù)字返回?cái)?shù)字。
十六進(jìn)制為基數(shù)16,十進(jìn)制為基數(shù)10,八進(jìn)制為基數(shù)8,二進(jìn)制為基數(shù)2。
var num = 255; num.toString(10); // returns 255 num.toString(16); // returns ff num.toString(8); // returns 377 num.toString(2); // returns 11111111測(cè)試看看?/?
通常,JavaScript數(shù)字是從文字創(chuàng)建的原始值:
var num = 50;
但是,也可以使用 new關(guān)鍵字將數(shù)字定義為對(duì)象:
var num = new Number(50);
為了測(cè)試兩者之間的差異,我們將初始化一個(gè)數(shù)字基元和一個(gè)數(shù)字對(duì)象。
var num1 = 50; var num2 = new Number(50); typeof num1// returns number typeof num2// returns object測(cè)試看看?/?
注意:請(qǐng)勿將數(shù)字創(chuàng)建為對(duì)象。這會(huì)降低執(zhí)行速度,并會(huì)產(chǎn)生一些意外的結(jié)果。
使用==運(yùn)算符時(shí),數(shù)字等于:
var num1 = 50; var num2 = new Number(50); document.write(num1 == num2); // 返回true,因?yàn)閚um1和num2具有相等的值測(cè)試看看?/?
使用===運(yùn)算符時(shí),相等的數(shù)字不相等,因?yàn)?==運(yùn)算符期望值和類型都相等:
var num1 = 50; var num2 = new Number(50); document.write(num1 === num2); // 返回false,因?yàn)閚um1和num2具有不同的類型測(cè)試看看?/?
對(duì)象無(wú)法比較:
var num1 = new Number(50); var num2 = new Number(50); document.write(num1 == num2); // 返回false,因?yàn)閚um1和num2是不同的對(duì)象 document.write(num1 === num2); // 返回false,因?yàn)閚um1和num2是不同的對(duì)象測(cè)試看看?/?
注意(==)和(===)之間的區(qū)別。比較兩個(gè)JavaScript對(duì)象將始終返回false。