JavaScript 數字
JavaScript 只有一種數值類型。
書寫數值時帶不帶小數點均可。
JavaScript 數值
書寫 JavaScript 數值既可以帶小數點,也可以不帶:
實例
var x = 3.14; // 帶小數點的數值 var y = 3; // 不帶小數點的數值
超大或超小的數可通過科學計數法來寫:
實例
var x = 123e5; // 12300000 var y = 123e-5; // 0.00123
JavaScript 數值始終是 64 位的浮點數
與許多其他編程語言不同,JavaScript 不會定義不同類型的數,比如整數、短的、長的、浮點的等等。
JavaScript 數值始終以雙精度浮點數來存儲,根據國際 IEEE 754 標準。
此格式用 64 位存儲數值,其中 0 到 51 存儲數字(片段),52 到 62 存儲指數,63 位存儲符號:
值(aka Fraction/Mantissa) | 指數 | 符號 |
---|---|---|
52 bits(0 - 51) | 11 bits (52 - 62) | 1 bit (63) |
精度
整數(不使用指數或科學計數法)會被精確到 15 位。
實例
var x = 999999999999999; // x 將是 999999999999999 var y = 9999999999999999; // y 將是 10000000000000000
小數的最大數是 17 位,但是浮點的算數并不總是 100% 精準:
實例
var x = 0.2 + 0.1; // x 將是 0.30000000000000004
使用乘除法有助于解決上面的問題:
實例
var x = (0.2 * 10 + 0.1 * 10) / 10; // x 將是 0.3
數字和字符串相加
警告!!
JavaScript 的加法和級聯(concatenation)都使用 + 運算符。
數字用加法。字符串用級聯。
如果您對兩個數相加,結果將是一個數:
實例
var x = 10; var y = 20; var z = x + y; // z 將是 30(一個數)
如果對兩個字符串相加,結果將是一個字符串的級聯:
實例
var x = "10"; var y = "20"; var z = x + y; // z 將是 1020(字符串)
如果您對一個數和一個字符串相加,結果也是字符串級聯:
實例
var x = 10; var y = "20"; var z = x + y; // z 將是 1020(一個字符串)
如果您對一個字符串和一個數字相加,結果也是字符串級聯:
實例
var x = "10"; var y = 20; var z = x + y; // z 將是 1020(字符串)
常見的錯誤是認為結果應該是 30:
實例
var x = 10; var y = 20; var z = "The result is: " + x + y;
常見的錯誤是認為結果應該是 102030:
實例
var x = 10; var y = 20; var z = "30"; var result = x + y + z;
JavaScript 從左向右進行編譯。
因為 x 和 y 都是數,10 + 20 將被相加。
因為 z 是字符串,30 + "30" 被級聯。
數字字符串
JavaScript 字符串可以擁有數字內容:
var x = 100; // x 是數字 var y = "100"; // y 是字符串
在所有數字運算中,JavaScript 會嘗試將字符串轉換為數字:
該例如此運行:
var x = "100"; var y = "10"; var z = x / y; // z 將是 10
該例也將如此運行:
var x = "100"; var y = "10"; var z = x * y; // z 將是 1000
該例如此運行:
var x = "100"; var y = "10"; var z = x - y; // z 將是 90
但是該例不會如上例般運行:
var x = "100"; var y = "10"; var z = x + y; // z 不會是 110(而是 10010)
在最后一個例子中,JavaScript 用 + 運算符對字符串進行了級聯。
NaN - 非數值
NaN
屬于 JavaScript 保留詞,指示某個數不是合法數。
嘗試用一個非數字字符串進行除法會得到 NaN(Not a Number):
實例
var x = 100 / "Apple"; // x 將是 NaN(Not a Number)
不過,假如字符串包含數值,則結果將是數:
實例
var x = 100 / "10"; // x 將是 10
您可使用全局 JavaScript 函數 isNaN()
來確定某個值是否是數:
實例
var x = 100 / "Apple"; isNaN(x); // 返回 true,因為 x 不是數
要小心 NaN
。假如您在數學運算中使用了 NaN
,則結果也將是 NaN
:
實例
var x = NaN; var y = 5; var z = x + y; // z 將是 NaN
結果也許是串連接:
實例
var x = NaN; var y = "5"; var z = x + y; // z 將是 NaN5
NaN
是數,typeof NaN
返回 number
:
實例
typeof NaN; // 返回 "number"
Infinity
Infinity
(或 -Infinity
)是 JavaScript 在計算數時超出最大可能數范圍時返回的值。
實例
var myNumber = 2; while (myNumber != Infinity) { // 執行直到 Infinity myNumber = myNumber * myNumber; }
除以 0(零)也會生成 Infinity
:
實例
var x = 2 / 0; // x 將是 Infinity var y = -2 / 0; // y 將是 -Infinity
Infinity
是數:typeOf Infinity
返回 number
。
實例
typeof Infinity; // 返回 "number"
十六進制
JavaScript 會把前綴為 0x
的數值常量解釋為十六進制。
實例
var x = 0xFF; // x 將是 255。
絕不要用前導零寫數字(比如 07)。
一些 JavaScript 版本會把帶有前導零的數解釋為八進制。
默認地,Javascript 把數顯示為十進制小數。
但是您能夠使用 toString()
方法把數輸出為十六進制、八進制或二進制。
實例
var myNumber = 128; myNumber.toString(16); // 返回 80 myNumber.toString(8); // 返回 200 myNumber.toString(2); // 返回 10000000
數值可以是對象
通常 JavaScript 數值是通過字面量創建的原始值:var x = 123
但是也可以通過關鍵詞 new
定義為對象:var y = new Number(123)
實例
var x = 123; var y = new Number(123); // typeof x 返回 number // typeof y 返回 object
請不要創建數值對象。這樣會拖慢執行速度。
new
關鍵詞使代碼復雜化,并產生某些無法預料的結果:
當使用 ==
相等運算符時,相等的數看上去相等:
實例
var x = 500; var y = new Number(500); // (x == y) 為 true,因為 x 和 y 有相等的值
當使用 ===
相等運算符后,相等的數變為不相等,因為 ===
運算符需要類型和值同時相等。
實例
var x = 500; var y = new Number(500); // (x === y) 為 false,因為 x 和 y 的類型不同
甚至更糟。對象無法進行對比:
實例
var x = new Number(500); var y = new Number(500); // (x == y) 為 false,因為對象無法比較
JavaScript 對象無法進行比較。