JavaScript只有一种数字类型,没有整数和浮点数的单独指定。
因此,数字可以用JavaScript编写,带或不带小数。
var a = 25; // 无小数点 var b = 80.05; // 有小数点测试看看‹/›
在以上两种情况下,数据类型都是一个数字,并且无论该数字是否带有小数点都相同。
可以在JavaScript中使用科学的指数表示法来缩写非常大或很小的数字,如以下示例所示:
let num1 = 957e8; // 95700000000 let num2 = 957e-8;// 0.00000957测试看看‹/›
JavaScript中的数字被认为是准确的,最多15位数字。这意味着数字将在到达第16位后四舍五入:
let num1 = 999999999999999; // 值保持不变 999999999999999 let num2 = 9999999999999999;// 向上舍入到 10000000000000000测试看看‹/›
与其他语言不同,JavaScript不会定义不同类型的数字,例如整数,短整数,长整数,浮点数等。
JavaScript数字具有64位精度,这也称为双精度。
内部表示基于IEEE 754标准。
64位在数字的符号,指数和小数之间分配,如下所示:
标识 | 指数 | 分数 |
---|---|---|
1 bit | 11 bit | 52 bit |
Bit 63 | Bits 62–52 | Bits 51–0 |
从前面的章节中可以知道,+运算符用于数字相加和字符串拼接。
如果为数字则数字相加。为字符串则将字符串串联起来。
如果将两个数字相加,则结果将是一个数字:
let x = 50; let y = 10; let z = x + y; // z = 60 (a number)测试看看‹/›
如果是两个字符串,结果将是字符串串联:
let x = "50"; let y = "10"; let z = x + y; // z = 5010 (a string)测试看看‹/›
如果数字和字符串,结果将是字符串串联:
let x = 50; let y = "10"; let z = x + y; // z = 5010 (a string)测试看看‹/›
如果字符串和数字,结果将是字符串串联:
let x = "50"; let y = 10; let z = x + y; // z = 5010 (a string)测试看看‹/›
JavaScript从左到右计算表达式。不同的序列可以产生不同的结果。
在下面的示例中,首先将50 + 10相加,因为x和y都是数字,然后将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字符串可以包含数字值。
let x = 50; // x 是一个数字 let y = "50"; // y 是一个字符串
如果字符串包含数字值,则可以在JavaScript中执行数学表达式。
可以执行除法:
let x = "50" / "10"; // x = 5测试看看‹/›
可以执行乘法:
let x = "50" * "10"; // x = 500测试看看‹/›
可以执行幂运算:
let x = "5" ** "3"; // x = 125测试看看‹/›
可以执行增量:
let x = "50"; x++; // x = 51测试看看‹/›
可以执行减法:
let x = "50" - "10"; // x = 40测试看看‹/›
无法执行加法:
let x = "50" + "10"; // x = 5010测试看看‹/›
注意:如果添加两个字符串,结果将是字符串串联。
在JavaScript NaN中,保留字表示数字不是合法数字。
如果您尝试对数字和非数字值执行数学运算,NaN将返回。
var x = 50 / "nhooo.com"; // x = NaN (Not a Number)测试看看‹/›
但是,如果字符串包含数字值,则可以使用JavaScript执行数学表达式:
var x = 50 / "10"; // x = 5测试看看‹/›
您可以使用全局JavaScript isNaN()函数来确定值是否为数字:
var x = 50 / "nhooo.com"; isNaN(x);// 返回true,因为x不是一个数字测试看看‹/›
将值分配给NaN操作中使用的变量NaN时,即使另一个操作数是合法数字,也将导致的值:
var x = NaN; var y = 27; var z = x + y; // z = NaN测试看看‹/›
NaN是一个数字;typeof NaN返回number:
typeof NaN; // will return "number"测试看看‹/›
Infinity(正无穷)或-Infinity(负无穷)如果您计算的数字超出JavaScript中可用的最大数字,则将返回。
对于未定义的值,也将发生这些情况,例如除以零时:
var x = 5 / 0; // 将返回无穷 var y = -5 / 0; // 将返回负无穷测试看看‹/›
用技术术语来说,Infinity(正无穷)当数字超过number时将显示1.797693134862315E+308,它表示JavaScript中的上限。
同样,-Infinity(负无穷)当数字超出的下限时将显示-1.797693134862316E+308。
Infinity是一个数字:typeof Infinity返回number:
typeof Infinity; // will return "number"测试看看‹/›
该数字Infinity也可以在循环中使用:
var num = 5; while (num != Infinity) { // 这里的代码将执行到num = ∞ }测试看看‹/›
默认情况下,JavaScript将数字显示为以10为基数的小数。
数字也可以用十六进制(基数16),二进制(基数2)和八进制(基数8)表示。
十六进制数字的前缀为0x:
var x = 0xFF; // x = 255测试看看‹/›
二进制数字的前缀为0b:
var x = 0b1111;// x = 15测试看看‹/›
切勿写一个以零开头的数字(例如0121)。如果将数字写成前导零,则JavaScript会将数字解释为八进制:
var x = 016;测试看看‹/›
您可以使用该toString()方法从2到36的数字返回数字。
十六进制为基数16,十进制为基数10,八进制为基数8,二进制为基数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数字是从文字创建的原始值:
var num = 50;
但是,也可以使用 new关键字将数字定义为对象:
var num = new Number(50);
为了测试两者之间的差异,我们将初始化一个数字基元和一个数字对象。
var num1 = 50; var num2 = new Number(50); typeof num1// returns number typeof num2// returns object测试看看‹/›
注意:请勿将数字创建为对象。这会降低执行速度,并会产生一些意外的结果。
使用==运算符时,数字等于:
var num1 = 50; var num2 = new Number(50); document.write(num1 == num2); // 返回true,因为num1和num2具有相等的值测试看看‹/›
使用===运算符时,相等的数字不相等,因为===运算符期望值和类型都相等:
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是不同的对象测试看看‹/›
注意(==)和(===)之间的区别。比较两个JavaScript对象将始终返回false。