《JavaScript高级程序设计》读书笔记(三)基本概念第二小节 Number类型

内容
---语法 上一小节
---数据类型 本小节 number类型
---流程控制语句
---理解函数

number类型
--使用IEEE754格式来表示整数和浮点数值(双精度数值)
--规定了数值字面量格式,支持各种数值类型

55 //整数
070 //八进制56
079 //无效八进制,解析为79
08 //无效,解析为8

--八进制第一位必须是零(0),如果字面值超出范围,前导忽略作为十进制
--严格模式下,八进制无效,会抛出错误

--十六进制以 0x 开头,超出格式报错
--在算术计算时,统一用十进制数值
--+0和-0,支持保存,但是值认为相等

浮点数值
--数值中必须包含小数点,并且小数点之后必须有一位数字
--小数点之前可以没有数字,但是不推荐

var a = 1.1;
var b = 0.2;
var c = .3; //有效,不推荐

--浮点数值存储空间是整数值的两倍,因此ECMAScript会不失时机地将浮点数值转化为整数值
--小数点后没有任何数字,本身就是整数的浮点数(1.0)都会被转化成整数值

科学记数法
--e表示法,前面是一个数值,中间是一个e/E,后面是10的幂中的指数

var floatNum = 3.125e7; //31250000

--表示极小数时,ECMAScript默认会对小数点后带有6个零以上的浮点数值转化为e表示法

--浮点数值最高精度是17位小数,但是在进行算术计算时精度远远不如整数
--0.1+0.2 = 0.30000000000004
--所以不要测试某个特定的浮点数值,用于判断
--这是IEEE754数值的通病

数值范围
--最小数值保存在Number.MIN_VALUE中,在大多数浏览器下是5e-324
--最大数值保存在Number.MAX_VALUE中,在大多数浏览器下是1.7976931348623157e+308
--计算的数值超出数值范围,这个数值将被保存为特殊值 Infinity
--正数 Infinity, 负数 -Infinity
--访问Number.NEGATIVE_IFINNTY和Number.POSITIVE_IFINNTY可以得到负和正Infinity的值

NAN
--非数值(Not a Number)是一个特殊数值
--用于表示本来要返回数值的操作数未返回数值的情况(不会抛出错误)
--例如 a/0 返回NaN不会影响其他代码的执行
--涉及NaN的操作返回都是NaN
--NaN与任何值都不相等,包括自身 NaN==NaN//false
--isNaN()函数,用于判断是否 不是数值

isNaN(NaN); //true
isNaN(10); //false
isNaN("10"); //false
isNaN("blue");//true
isNaN(true); //false

--true->1,false->0,

--isNaN()也适用于对象,
--对象调用,会首先对用对象的valueOf()方法,判断返回值,如果不能
--则基于这个返回值再调用toString()方法,再检测返回值

数值转换
--Number(),parseInt(), parseFloat()
--Number()用于任何数据类型,后两个专门用于字符串

Number()下
--true->1,false->0
--数值,简单传入和返回
--null->0
--undefined->NaN
--字符串
----只包含数值(包括+,-)转化为十进制数(前导零会被忽略,所以没有八进制)
----有效浮点数(前导零会被忽略,所以没有八进制)
----有效十六进制,会转化为相同大小十进制
----空串-> 0
----还包含其他字符,则转化为NaN
----如果是对象,则先调用valueOf(),转化如果为NaN,再调用toString()
--对字符串转换比较复杂,不合理一般用parseInt,parseFloat代替

Number()等同于一元+操作符

Number("11"); //11
+("11"); //11
-("11"); //-11
+"11"; //11
-"11"; //-11

parseInt(string, radix)方法
--返回十进制数值
--忽略空格
--第一个不是负号或者数字字符 返回NaN
--直到解析完后续字符或者遇到了非数字字符
--小数点无效
--radix,可选(es5支持的参数)。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
--(es5)八进制无效,(es3支持八进制)
--如果省略该参数或其值为 0,则数字将以 10 为基础来解析。
--如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
--如果基数为16,则能识别 0x开头的 和不以0x开头的两种
--如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。

parseInt(" 1.1asd"); //1
parseInt("010"); //10
parseInt("010",6); //6
parseInt("0xa"); //10
parseInt("0xa",16); //10
parseInt("a",16); //10
parseInt("0xa",17); //0 x无法识别

请始终保持基数radix参数的书写,防止出错

拓展

["1", "2", "3"].map(parseInt)输出什么?

["1", "2", "3"].map(parseInt)等同于
["1","2","3"].map(function(ele,index){
  return parseInt(ele,index)
})

等于调用了三次parseInt方法:
第一次 parseInt("1",0) //基数为0时,按照上边陈述即为10进制,返回 1
第一次 parseInt("2",1)//基数为1,不在2-36范围内,默认输出NaN
第一次 parseInt("3",2)//基数为2,因为字符串3大于基数不合法,解析为NaN
答案也就是:[1, NaN, NaN]

parseFloat(string)方法
--与parseInt相同,从第一位置解析之末尾
--或者遇到第一个无效浮点数字符
--第一个小数点有效,之后的无效
--只识别十进制

parseFloat(" 0.1.1asd"); //0.1
parseFloat("0.1e2.3"); //10 e后面为整数 第二个点无效

上一篇:Javascript高级程序设计读书笔记(第三章)


下一篇:JSON.stringify实例应用—将对象转换成JSON类型进行AJAX异步传值