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 對象無法進行比較。