这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
本文主要介绍了 JavaScript 基本类型值 - Number 类型的相关知识,具有很好的参考价值,下面跟着小编一起来看下吧
大致介绍
在 JavaScript 的内部采用 IEEE754 格式来表示数字,所以不区分整数和浮点数,都是用 64 位浮点数的形式储存。就是说,在 JavaScript 内部,就根本没有小数。但是有些运算必须得需要整数完成,所以 JavaScript 有时会把 64 位的浮点数转换成 32 位的整数,再进行运算。
整数
JavaScript 对整数提供四种表示方法:
1、二进制:有前缀 0b 的数值,出现 0,1 以外的数字会报错
2、八进制:有前缀 0o 的数值,或者是以 0 后面再跟一个数字(0-7)。如果超出了前面所述的数值范围,则会忽略第一个数字 0,视为十进制数
注意:八进制字面量在严格模式下是无效的,会导致支持该模式的 JavaScript 引擎抛出错误
3、十六进制:有前缀 0x,后跟任何十六进制数字(0~9 及 A~F),字母大小写都可以,超出范围会报错
4、十进制
- var num2 = 0b11;
- console.log(num2); //3
- var num2 = 0b12;
- console.log(num2); //报错
- var num8 = 0o76;
- console.log(num8); //02
- var num8 = 0o78;
- console.log(num8); //报错
- var num16 = 0x2a;
- console.log(num16); //42
- var num16 = 0x2h;
- console.log(num16) //报错
浮点数
所谓浮点数,就是该数值中必须包含一个小数点,并且小数点后面必须至少有一位数字。与整数不同,浮点数只能用十进制来表示
浮点数的精度远远不如整数,所以设计浮点数的运算好比较要小心
例如:
- console.log(0.1 + 0.2 == 0.3); //false 0.30000000000000004
- console.log(0.6 / 0.2); //2.9999999999999996
科学计数法
对于那些极大极小的数值,可以用 e 表示法(即科学计数法)表示的浮点数值表示。用 e 表示法表示的数值等于 e 前面的数值乘以 10 的指数次幂
以下两种情况,JavaScript 会自动将数值转为科学计数法表示,其他情况都采用字面形式直接表示。
1、小数点前的数字多余 21 位
- console.log(1234567890123456789012); // 1.2345678901234568e+21
- console.log(123456789012365648787); //123456789012365660000
2、小数点后面的 0 多余 5 位
- console.log(0.0000006); //6e-7
- console.log(0.000006); //0.000006
数值范围
由于内存的限制,ECMAScript 并不能保存世界上所有的数值,所以就有了最大值和最小值
最小值保存在 Number.MIN_VALUE 中,这个值是 5e-324
最大值保存在 Number.MAX_VALUE,这个值是 1.7976931348623157e+308
- console.log(Number.MIN_VALUE) //5e-324
- console.log(Number.MAX_VALUE); //1.7976931348623157e+308
如果数字超过最大值,javascript 会返回 Infinity,这称为正向溢出 (overflow);如果等于或超过最小负值 - 1023(即非常接近 0),javascript 会直接把这个数转为 0,这称为负向溢出 (underflow)
如果要想确定一个数值是不是有穷的,可以使用 isFinite() 函数。这个函数在参数位于最小与最大数值之间时会返回 true
- var result = Number.MAX_VALUE + Number.MAX_VALUE;
- console.log(isFinite(result)); //false
特殊数值
1、+0 和 - 0
这两个 0 在大对数的情况下都是等价的
- - 0 === +0; //true
- 0 === -0; //true
- 0 === +0; //true
但是在作为分母的时候是不一样的
- 1/-0 == 1/+0; //false
2、infinity
Infinity 表示 "无穷",用来表示两种场景。一种是一个正的数值太大,或一个负的数值太小,无法表示;另一种是非 0 数值除以 0,得到 Infinity。
- Math.pow(2, Math.pow(2, 100)); //Infinity
- 1 / 0; //Infinity
Infinity 参与的运算结果只能是其本身、0 或 NaN
- * Infinity; //Infinity
- - Infinity; //-Infinity
- + Infinity; //Infinity
- / Infinity; //0
- Infinity / 2; //Infinity
- Infinity * Infinity; //Infinity
- Infinity - Infinity; //NaN
- Infinity + Infinity; //Infinity
- Infinity / Infinity; //NaN
3、NaN
这个数值表示一个本来要返回数值的操作数未返回数值的情况
NaN 与任何值不相等,包括它本身,并且涉及 NaN 的任何操作都会返回 NaN
- 5 - 'x'; //NaN
- Math.acos(2); //NaN
- 0 / 0; //NaN
- NaN == NaN; //false
- NaN == Infinity; //false
NaN 不是一种独立的数据类型,而是一种特殊数值,它的数据类型依然属于 Number
- typeof NaN; //number
isNaN 方法可以用来判断一个值是否为 NaN,但是,isNaN 只对数值有效,如果传入其他值,会被先转成数值。比如,传入字符串的时候,字符串会被先转成 NaN,所以最后返回 true,这一点要特别引起注意。也就是说,isNaN 为 true 的值,有可能不是 NaN,而是一个字符串。
- isNaN('Hello') // true
- // 相当于
- isNaN(Number('Hello')) // true
判断 NaN 更可靠的方法是,利用 NaN 是 javascript 之中唯一不等于自身的值这个特点,进行判断
- function isNaN(value){
- return value != value;
- }
数制转换
有 3 个函数可以把非数值转换成数值:Number()、parseInt() 和 parseFloat()。其中 Number() 可以将任意类型的值转化成数值,而 parseInt() 和 parseFloat() 只应用于字符串向数字的转换
Number()
转换规则:
1、如果是 Boolean 值,true 和 false 将分别转换为 1 和 0
2、如果是 null 值,返回 0
3、如果是 undefined,返回 NaN
4、如果是字符串,遵循以下规则:
(1)若字符串只包含十进制或十六进制数字,则转成十进制的数字
注意:Number() 不识别八进制数字的字符串,会按照十进制数字处理
字符串'1.2.'不会报错,但数字 1.2. 会报错
(2)若字符串为空字符串或空格字符串,则转成 0
(3)其他情况的字符串,则转成 NaN
- Number(true) //1
- Number(null) //0
- Number(undefined) //NaN
- Number("0123") //123
- Number("0x123") //291
- Number("0.2") //0.2
- Number("") //0
- Number("asd") //NaN
parseInt()
parseInt() 专门用于把字符串转换成整数。在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt() 就会返回 NaN。如果是,则继续解析,直到解析完成或者遇到非数字字符
- console.log(parseInt(' 123.8px')); //123
- console.log(parseInt(' 123.8 ')); //123
- console.log(parseInt(' -123.8px')); //-123
- console.log(parseInt('a123.8px')); //NaN
- console.log(parseInt('0 123.8px')); //0
注意:在 ECMAScript5 中,parseInt() 已经不具备解析八进制的能力。例如八进制"070",会忽略前面的"0",得到十进制的 70
为了消除在使用 parseInt() 函数时可能导致的上述困惑,可以为这个函数提供第二个参数:转换时使用的基数(多少进制)
- parseInt("070") //70
- parseInt("070", 8) //56
parseFloat()
parseFloat() 专门用于字符串转换浮点数。同样地,解析时会忽略字符串前面的空格,直到找到第一个非空格字符,然后一直解析到字符串末尾或一个无效的浮点数字字符为止
- console.log(parseFloat(' 0123.px')); //123
- console.log(parseFloat(' 123.px')); //123
- console.log(parseFloat(' 123.1px')); //123.1
- console.log(parseFloat(' 123.1.2px ')); //123.1
- console.log(parseFloat(' -123.0px')); //-123
- console.log(parseFloat('.123.1px')); //0.123
- console.log(parseFloat('0 123px')); //0
注意:parseFloat() 只解析十进制,所以十六进制的字符串始终会被转换成 0。因此也没有第二个参数用来指定基数
- parseFloat("0xA") //0
注意:Number('') 的结果是 0,parseInt('') 和 parseFloat('') 的结果是 NaN
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持 phperz!
来源: http://www.phperz.com/article/17/0523/327302.html