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