JavaScript Data Types--number、string
- 1. Number
- 1.1 字面格式
- 1.2 数值范围
- 1.3 浮点数
- 1.4 NaN
- 1.5数值转换
- 1.5.1 Number
- 1.5.2 parseInt
- 1.5.3 ParseFloat
- 2. String
- 2.1 字符字面量
- 2.2 字符串的特点
- 2.3 转化为字符串
- 2.3.1 toString(),但是null和undefined没有这个方法。
- 2.3.2 String(),能将任何类型的值转化成字符串
1. Number
1.1 字面格式
- 八进制(以8为基数, 0~7),第一位必须是0, eg: var a = 070;//56
- 十六进制(以16为基数, 0~9以及a~f),前两位必须是0x eg: var b = 0xa;//10
- 十进制 ps:在平常的开发中,尽量多使用十进制,少使用十六进制,不使用八进制。 在现在的js中,严格模式下八进制是无效的,js引擎会抛出错误。 少用十六进制,开头是0x,不能保证每次写对。
1.2 数值范围
- 在js中,数值的范围是2(-53)次方——2(53)次方 ps:在现实世界中,数值是没有范围的,计算机中数值的存储是基于一定的存储空间的 ps:开放中,很少会使用这么大的数值 ps:在开发中正尝试用,尽量不要超过16位,超过了16位,就要是用科学计数法 如果数值超出了js的范围,那么数值会自动转化为Infinity。如果这个值时整数就是Infinity,负数就是-Infinity
1.3 浮点数
- .3 小数点前面可以不带0,js解释器会给你自动补上0,但是不推荐这么写
- 后面可以不带数字,js解释器会给你作为整数来保存
- 对于较大的数可以用科学计数法来表示。 3.125e7//31250000
浮点数的最高精度是17位小数,但是在进行算术计算时其精确度远远不如整数。
例如 0.1+0.2!=0.3,而是0.30000000000000004。
专门有一个这个网站https://0.30000000000000004.com/ 关于浮点数值计算会产生舍入误差的问题,有一点需要明确:这是使用基于IEEE754数值的浮点计算的通病,ECMAScript并非独此一家;使用其他相同格式的语言也存在这个问题。
Number类型应该是ECMAScript中最令人关注的数据类型了,这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被称为双精度数值)。 js中双精度采用64位存储,最高表示到52位。
这里是涉及到一些历史!
IEEE(Institute of Electrical and Electronics Engineers, 电气和电子工程师协会)
这个协会指定了一些标准,比方说802(局域网),802.11(wifi)
在计算机中,所有的数字都是二进制,没办法准确表示0.1和0.2,是一个无限循环的数字。
从十进制转化到二进制,再从转化到十进制的过程中,出现了一些误差。
那么如何避免这个问题呢?
- 在比较两个数值的时候,不要去拿两个小数比较。如果一定要比较,把要比较的数转化成整数,比较完了,在转化成小数;或者将小数保留几位小数
如果在计算过程中涉及到小数的乘法,加法,减法,一定要保证书写顺序,前后一致。比方说,在平常的购物过程中,有一个下单页面和一个结账页面,如果顺序不一致,中间有一个四舍五入的过程,那么在两个页面中,金额会有误差 下单页面17.4530.9, 结账页面0.917.453
所以前后书写顺序要保持一致
1.4 NaN
1
NaN是一个数字,但不等于任何数字,包括它自身。 * 0/0 = NaN * 正数/0 = Infinity * 负数/0 = -Infinity isNaN可以判断一个值是否时数值,但是它最大的用途是判断值是否可以转化为数值
1.5数值转换
js中有3个函数可以把非数值转化为数值,Number(),ParseInt(),ParseFloat()
1.5.1 Number
Number转换规则如下
- 如果是boolean类型的值,true和false分别转换为0和1
- 如果是数字类型,则简单的传入和返回
- 如果是null,返回0
- 如果undefined,返回NaN
- 如果是字符串,遵循下列规则: a. 如果字符串只包含数字(包括前面带正好或者负号的情况),则将其转化为十进制数值,即‘1’-》1,‘123’-〉123, ‘011’-》11(前面的0被忽略了) b. 如果字符串中包含有效的十六进制格式,例如‘0xf’,则将其转换为相同大小的十进制整数 c. 如果字符串是空的(不包含任何字符),则返回0 d. 如果字符串中包含除以上格式的字符,则返回NaN
- 如果是独享
1.5.2 parseInt
Number类型的数值转化比较复杂,一般使用ParseInt来使用,它可以有两个参数,第一个是要解析的值,第二个指定基数,也就是是要解析的值是什么进制的。基数会影响到转换的结果。
1
var num = parseInt('10', 8);// 8按照八进制解析
不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,建议无论在什么情况下都指定基数。
1.5.3 ParseFloat
ParseFloat只解析十进制的数。十六进制的字符串会转化为0 值得注意的是,如果传入的字符串是一个可解析为整数的数(没有小数点或者小数点后为0),ParseFloat会返回整数.
2. String
2.1 字符字面量
string数据类型包含一些特殊的字符字面量,也叫转义序列,用于表示非打印字符或者具有其他用途的字符。
2.2 字符串的特点
ECMAScript中的字符串是不可改变,也就是说,字符串一旦创建,它们的值就不能改变。
2.3 转化为字符串
2.3.1 toString(),但是null和undefined没有这个方法。
这个方法有一个参数,代表输出值的基数。
2.3.2 String(),能将任何类型的值转化成字符串
其他类型同上,我们看下null和undefeated
为什么string方法能转化null和undefined,可以看下它的转化过程,就会一目了然
- 如果值有toString()方法,则调用该方法(没有参数)并返回结果
- 如果值是null, 返回null
- 如果值是undefined,返回undefined
如果不确定要转换的值是不是null或者undefined,可以使用String()方法