JavaScript权威指南(第6版) --- 自学笔记(4)--- JS类型,值,变量、数字

JS类型,值,变量
js原始类型包括:数字,字符串和布尔值;同时,js定义了2个特殊的原始值:null(空)和undefined(未定义),分别代表了各自特殊类型的唯一成员。

数字:
js不区分整数值和浮点数值,js中所有数值均用浮点数值表示。
js采用IEEE 754标准定义的64位浮点格式来表示数字,最大值为 ±1.7976931348623157 * 10^{308},最小值 ±5 * 10^{-324}
js整数范围的精度是:-9007199254740992(-2^{53}) ~ 9007199254740992(2^{53}),包含边界值。

console.log("js浮点数最大精度:" + Number.MAX_VALUE); // js浮点数最大精度:1.7976931348623157e+308
console.log("js浮点数最小精度:" + Number.MIN_VALUE); // js浮点数最小精度:5e-324
console.log("js整数最大精度:" + Number.MAX_SAFE_INTEGER); // js整数最大安全数字:9007199254740991
console.log("js整数最小精度:" + Number.MIN_SAFE_INTEGER); // js整数最小安全数字:-9007199254740991

这里我们讲一下整数精度,浮点数精度请百度查找【IEEE 754标准定义】
js采用IEEE 754标准,使用64个二进制位来存储浮点数
第1位表示符号位,占1位
第2到12位表示指数部分,占11位,
第13位到64位表示有效数字部分,占52位。
但是IEEE 754标准中规定有效数字第一位默认总为1,并且不保存在64位中,所以有效数字位数实际是 1 + 52 = 53位
pow(2, 53) = 9007199254740992(±)

为什么 Number.MAX_SAFE_INTEGER 是 9007199254740991,而不是 9007199254740992?
可以看下面测试:
console.log(Math.pow(2, 53)); // 9007199254740992
console.log(Math.pow(2, 53) + 1); // 9007199254740992
所以不能确定9007199254740992是如何计算出来的,不是安全数字。

注意:js整数实际操作(比如数组索引,位操作)则是基于32位整数。

整形直接量
当一个数字直接出现在js程序中,称为数字直接量。js支持多种格式的数字直接量。

// 十进制数字直接量
0;
3;
10000000;

// 十六进制直接量:由0~9之间的数字和a~f(大小写均可)之间的字母组成。其中a~f表示数组10~15
0xff; // 相当于 十进制的 15*16 + 15 = 255; 可用 parseInt(0xff, 16); 转十进制
0XCA1; // 相当于 十进制的 12*16*16 + 10*16 + 1 = 3233

// 八进制直接量:由数字0开头,其后根数0~7之间的数组组成
031; // 相当于 十进制的 3*8 + 1 = 25

// 八进制和十进制互相转换
console.log(parseInt(25).toString(8));
console.log(parseInt(031, 10));

// 十六进制和十进制互相转换
console.log(parseInt(25).toString(16));
console.log(parseInt(0x19, 10));

注意:
不是全部的js实现都支持八进制直接量,所以最好不要使用八进制直接量,在ECMAScript 6的严格模式下,八进制直接量是明令禁止的。

浮点型直接量
可采用传统的实数写法,由整数部分,小数点和小数部分组成。
也可使用指数计数法,即在实数后面跟字母e或者E,后面再跟正负号,再加一个整型的指数,它表示由前面的数乘以10的指数次幂。
[digits][.digits][(E|e)[+|-]digits

// 浮点型直接量
3.14;
2345.789;
.3333333333333;
6.02e23; // 6.02 * 10^{23}
1.2323322E-23; // 1.2323322 * 10^{-23}

JS中的算术运算
js使用语言本身提供的算术运算符来进行数字运算。包括:加法(+)、减法(-)、乘法(*)、除法(/)、求余(%)。
js还提供了很多复杂的算术运算符,通过Math对象的属性定义的函数和变量实现。

// Math定义的一些变量和方法
console.log(Math.pow(2, 3)); // 23次方的,结果:8
console.log(Math.round(0.4)); // 四舍五入
console.log(Math.round(0.5)); // 四舍五入
console.log(Math.round(0.6)); // 四舍五入
console.log(Math.ceil(0.6)); // 向上求整
console.log(Math.floor(0.6)); // 向下求整
console.log(Math.abs(-5)); // 绝对值
console.log(Math.max(-5, 0, 0.1)); // 最大值
console.log(Math.min(-5.1, 0, -6.2)); // 最小值
console.log(Math.random()); // [0, 1)
console.log(Math.PI); // 圆周率
console.log(Math.E); // 自然对数的底数

具体全部的函数和变量,可以查看 
http://www.w3school.com.cn/jsref/jsref_obj_math.asp

js运算在溢出,下溢,或者除以0时,不会报错。

console.log(10/0); // 结果是:Infinity

Infinity:无穷。
当运算结果超过了js所能表示的数字上限(溢出)时,结果为:Infinity(无穷大)。
同样,当负数值超过了js所能表示的负数范围,结果为:-Infinity(负无穷大)。
基于无穷大值得加,减,乘,除结果还是无穷大或者负无穷大。

console.log(Infinity + Infinity); // 结果是:Infinity
console.log(Infinity - Infinity); // 结果是:NaN
console.log(Infinity * Infinity); // 结果是:Infinity
console.log(Infinity / Infinity); // 结果是:NaN
console.log(Infinity % Infinity); // 结果是:NaN
console.log("-------------------------------------");
console.log(-Infinity + Infinity); // 结果是:NaN
console.log(-Infinity - Infinity); // 结果是:-Infinity
console.log(-Infinity * Infinity); // 结果是:-Infinity
console.log(-Infinity / Infinity); // 结果是:NaN
console.log(-Infinity % Infinity); // 结果是:NaN
console.log("除0的问题:-------------------------------------");
console.log(10 / 0); // 结果是:Infinity
console.log(0 / 0); // 结果是:NaN (注意:0/0没有意义)
console.log(-10 / 0); // 结果是:-Infinity

注意:NaN(非数字值)比较特殊,它与任何值都不相等,包括自身。
isNaN(参数);  如果参数是NaN或者非数字值时,返回true。

// isNaN:如果参数是NaN或者非数字值时,返回true。
var x = NaN;
console.log(isNaN(x)); // true
x = "a";
console.log(isNaN(x)); // true
x = 5;
console.log(isNaN(x)); // false

还有一个类似函数,isFinite(参数);  如果参数不是NaN,Infinity,-Infinity的时候返回true。

var x = NaN;
console.log(isFinite(x)); // true
x = Infinity;
console.log(isFinite(x)); // true
x = -Infinity;
console.log(isFinite(x)); // true
x = "a";
console.log(isFinite(x)); // true
x = 5;
console.log(isFinite(x)); // false

有趣的事情:

var x = .3 - .2;
var y = .2 - .1;
console.log(x == y); // false

var x = 0.3 - 0.2;
var y = 0.2 - 0.1;
console.log(x == y); // false

var x = 3 - 2;
var y = 2 - 1;
console.log(x == y); // true

console.log(0.1 == 0.1); // true
console.log(1 == 1); // true

上面现象什么原因呢?
js采用IEEE-754浮点数表示法, 这是一种二进制表示法,几乎所有的现代编程语言都采用。
这种二进制浮点数表示法并不能精确到表示类似0.1这样简单的数字,js中的数字具有足够的精度,并可能极其近似于0.1,但事实上,数字不能精确表述也带来了一些问题。
由于舍入误差,0.3和0.2之间的近似差值实际上并不等于0.2和0.1之间的近似差值。

console.log("0.3 - 0.2 = " + (0.3 - 0.2)); // 0.3 - 0.2 = 0.09999999999999998
console.log("0.2 - 0.1 = " + (0.2 - 0.1)); // 0.2 - 0.1 = 0.1

你可能感兴趣的:(---,自学笔记)