总结JS数据类型需要注意的一些知识点,基础部分涵盖的并不全面。
数据类型的类别:
JS中的数据类型总的可以分为几下几类:Number(数值型)、Boolean(布尔型)、String(字符串型)、Undefined和Null,还有一种复杂数据类型Object。JS是一种弱类型的语言,但可以使用typeof操作符判断某个变量的数据类型,返回值可能有以下几种:
"string"字符串型
"boolean"布尔型
"undefined"未定义
“number”数值型
"function"函数类型
特别注意的是:
"object" 对象类型,另外如果变量值为null,typeof 操作符返回的也是object
关于null与undefined:
undefined值是派生自null值的,因此undefined==null总是返回true
【1】Boolean
Boolean类型只有2个值,true和false。虽然只有两个值,但是其他所有类型的数据均有与Boolean值相对应的值,可以调用Boolean()函数获取这个对应值,转换的规则为:
对于String类型,任何非空字符串都转换为true,否则转换为false
对于Object类型,任何非空对象都转换为true,null转换为false
对于Number类型,任何非0数值都被转换为true,0和NaN转换为false
undefined类型转换为false
这个规则对于流程控制语句自动执行布尔转换非常重要。
[2]Number类型
数值类型:
JS中不区分整形和浮点型,所有数字均用浮点数值表示,采用IEEE754标准定义的64位浮点格式表示数字。JS中定义了多种不同格式的数值字面量类型:
整形字面量:整数有多种不同的格式,包括十进制、八进制(以0开头,在严格模式下是无效的)、十六进制(以0x开头),进行最终计算时都会转成十进制进行计算。而由于JS中都是有符号数值,因此可以保存+0和-0,在JS中+0是等于-0的。
浮点型字面量:浮点数值即必须包含一个小数点,且小数点后面至少有一位数字。浮点数值在进行算数运算时精度远远不足整数,比如0.2+0.1的计算结果不等于0.3, 因此一般不要测试某个特定的浮点数。
JS虽然都是 采用64位浮点格式来表示数字,但是在 数组索引或者位运算时则是基于32位整形的。
数值范围:
JS 中数值的最大值 可以用Number.MAX_VALUE获得,一般情况下这个值为1.7976931348623157e308,最小值可以用Number.MIN_VALUE获得,一般这个值为5e320。如果计算得出了超出数值范围的值,那么这个值就会自动转为Infinity,并且这个值就不能参与下一次运算了。
可以用isFinite()函数判断一个数值是否在正常数值范围之内。
注:isFinite(Number.MAX_VALUE+1)仍为true,可参照:点击打开链接
NaN:
Not a number,用来表示一个本来要返回数值的操作符但未能返回数值的情况。NaN有两个重要的特性:
<1>NaN不和任何值相等,包括自身
<2>有关NaN的任何操作都返回NaN
isNaN()方法用来判断一个值能否转换为数值。这个函数也可以适用于Object类型,调用时会首先调用对象的valueOf方法,看返回的值可不可以抓换为数值;如果不可以则再调用toString方法,如果依然不能转换为数值,那么就返回true。
数值转换:
有3个函数可以用来将一个值转换为数值类型,Number()方法,parseInt()方法和parseFloat()方法,第一个方法可以用于任何类型,后两个则专门用于将字符串转换为数值,这些不同的函数有不同的转换规则,这里总结一下需要特别关注的一些规则:
Number()方法转换规则:
null->0
undefined->NaN
空字符串->0
包含无效字母的字符串->NaN
对象类型的转换过程类似isNaN()方法的调用过程
事实上,调用Number()方法的过程与new Number(argument)创建一个数值的效果是类似的。
Number()方法的规则较为负责且存在不合理的地方,因此处理整数的时候更常用的是parseInt()方法,这个方法更多的看字符串是否符合数字模式,它的转换规则总结为:
parseInt()方法转换规则:
<1>忽略前导空格,直到遇到第一个非空格字符。
<2>如果第一个非空格字符不是数字字符或者正负号,则返回NaN。如果是,则继续解析,直到遇到非数字字符
<3>如果第一个字符是数字符号,那么方法也能识别出不同的整数格式,比如以“0x”开头会识别为16进制,但对于8八进制不同浏览器在识别时会有不同的行为,因此为了消除这种问题,parseInt()方法还提供了第二个参数:即转换基数。
parseFloat()方法用来转换浮点数类型,转换规则为:
<1>从第一个非空格字符解析,如果第一个非空格字符为非浮点数值有效字符(数字或者点),那么返回NaN。
<2>继续解析,直接遇到非浮点字符(第一个点会被解析,但是之后的点都会被忽略)
<3>与parseInt()不同,parseFloat()会忽略前导的0,因此16进制格式的数值会被转换为NaN。
注:要充分了解JS中Number类型的表示方式,需要对IEEE754标准的64位浮点格式有清楚的了解和认识。
[3]Object类型
JS中的对象其实就一组数据和功能的集合,在JS中,Object类型是其他对象实例的基础,它具有的属性和方法其他对象实例也都具有,这些属性和方法包括:
<1>construtor属性:保存用于创建该对象的函数。
<2>hasOwnProperty(propertyName):用于检查给定的属性在当前对象中是否存在,属性名以字符串的形式指定。
<3>isPrototypeof(object):用于检查对象是否是传入的对象的原型。
<4>propertyIsEnumerable(propertyName):属性名是否能在for-in循环中枚举,属性名以字符串的形式指定。
<5>toLocalString()与toString()
<6>valueOf()返回对象的字符串、数值或者布尔值表示。