ECMAScript中有5中简单数据类型(也称为基本数据类型):Undefined,Null,Number,Boolean,String。还有一种复杂数据类型:Object。ECMAScript不支持任何创建自定义类型的机制(ES6开始支持类),下面我们详细探讨一下这几种数据类型。
在此之前呢,我们先了解一下 typeof 操作符,ECMAScript是松散类型的,借助typeof我们可以检测给定变量的数据类型。typeof的返回情况如下:
- “undefined”——这个值没有定义
- “boolean”——布尔值
- “string”——字符串
- “number”——数值
- “object”——这个值是对象或者null
- “function”——函数
注意:
Safari5及以前版本,Chrome7及之前版本,正则表达式typeof会返回function,而其他浏览器则会返回Object。
下面我们进入正题,来仔细探讨JS中的几种类型:
Undefined
该类型只有一个值,就是undefined,当一个变量声明但并未被初始化的时候,就是undefined。
注意这里是声明未初始化,被声明是前提条件。连声明都没有过的变量只能执行一项操作,就是使用typeof检测其数据类型,也会返回undefined(调用delete在费严格模式下不会报错,但没啥意义)。Null
null也是只有一个值的数据类型。null表示一个空对象指针,所以typeof检测null值时会返回object。注意: console.log(undefined == null) //true
Boolean
两个值,true和false,区分大小写,True和False不是bool值,只是标识符。
所有类型的值都有和这两个bool值等价的值:数据类型 转换为true的值 转换为false的值 Boolean true false String 任何非空字符串 空字符串”“ Number 非0数字值(包括无穷大) 0和NaN Object 任何对象 null Undefined 无 undefined Number
除了10进制表示外,整数还可以通过8进制或16进制的字面值来表示。
8进制第一位必须为0,然后是八进制数字序列(0~7),如果字面值中的数值超出了范围,前导0将被忽略,后面的数值将被当做十进制数值来解析。
var a = 070; //8进制56 var b = 079; //无效的8进制 79 var a = 08; //无效的8进制 8
8进制在严格模式下是无效的,会导致该模式下的javascript引擎抛出错误。
16进制的前两位必须是0x,后跟任何16进制数字(0~9及A~F)
在进行算数计算时,所有8进制和16进制表示的数值最终都被转换成十进制数值。
- 浮点数值
- 保存浮点数值需要的空间是保存整数数值的两倍,因此ECMAScript会在合适的情况下将浮点数值转换为整数值。小数点后没有任何数字的就可以作为整数值来保存,1.0,.0等类似这样的也会保存为整数。
- 默认情况下,会将小数点后面带有6个0以上的浮点数值转换为以e表示法表示的数值(0.0000003=3e-7)
- 浮点数值最高精度是17位小数,但在进行算是计算时其精确度远远不如整数。
if(a+b == 0.3){
alert(0.3);
}
如果a和b分别为0.05和0.25没有问题,但是如果是0.1和0.2就没办法通过验证,所以永远不要测试某个特定的浮点数的值。
数值范围
- ECMAScript能表示的最小数值保存在Number.MIN_VALUE中,值为5e-324,最大值则保存在Number.MAX_VALUE中,值为1.79769313486231573+308。
- 超出这个范围则被转换为-Infinity(负无穷)或+Infinity(正无穷),该值不能参与计算。isFinite()可用来检测数值是否在最大最小值之间,在则返回true。
NaN
- 本该返回数值却不是数值的情况,任何数除以0都是NaN。
- NaN与任何值都不相等包括NaN自身,任何涉及NAN的操作都会返回NaN。
- isNaN(),检测传入的参数是否为数值,任何不能被转换为数值的参数,该方法都会返回true。
数值转换
Number(),可传入任何数据类型,ParseInt()与ParseFloat()只接受字符串参数。Number()举例:
true(1),false(0),null(0),undefined(NaN),
“123“(123),“011”(11),“1.1“(1.1),”“(0),十六进制(十进制)…其余七荤八素的格式如:“Hello“(NaN)ParseInt()
会忽略前面的空格,找到第一个非空格,如果这个字符不是数字或者正负号,就会返回NaN,如果第一个字符符合规则,就会继续向后检测,知道解析完或者遇到非数字字符(小数点也不算有效数字字符)。举例:“1234okok”(1234),”“(NaN),0xA(十六进制——10),0xf(十六进制——15),22.5(22),070(八进制——56),70(十进制——70)
需要注意的是ECMA3和ECMA5对以0开头的字符串解析不太一样,ECMA3当做是8进制,而ECMA5会忽略前导0当做十进制,所以使用parseInt方法时最好将进制作为第二个参数传入方法,保证得到正确结果。这点也是ESLint的规范之一。
ParseFloat()
同样从第一个字符开始解析知道解析完成或者遇见一个无效的浮点数字字符为止。字符串的第一个小数点是有效的,第二个就无效了,无效字符后面的字符串被忽略。始终忽略前导0,只能解析十进制,十六进制的始终解析为0。
举例:“1234okok”(1234),”“(NaN),0xA(0),0xf(十六进制——15),22.5(22.5),0908.5(908.5),3.125e7(31250000)
- 浮点数值
String类型
- 任何字符串的长度都可以通过该字符串的length属性拿到,但如果包含双字节字符,length可能不会精确的返回。
- String包含一些特殊的字符字面量,也叫转义序列,表示非打印字符,如下:
- 拼接字符串的时候,其实内部实现并不是看着那个简单。js内部机制不允许更改字符串变量,当出现拼接类似操作的时候,js内部其实是先创建一个新的字符串的,然后销毁原来的字符串,再将变量指向新创建的字符串。
数值,布尔值,对象和字符串值都有一个toString()方法,null和undefined没有这个方法。只有数值调用toString()的时候可以传一个参数,表示要转成的进制,默认是十进制,例:
let num = 10; console.log(num.toString()); // “10“ console.log(num.toString(2)); // “1010” console.log(num.toString(8)); // “12” console.log(num.toString(10)); // “10” console.log(num.toString(16)); // “a”
- 另外一个转换字符串的方法就是String(),在变量有可能是null或者undefined的时候,调用String()要比toString()更稳妥。
Object类型
- Object类型所具有的任何属性和方法在其实例化出来的对象中都被继承:
- Constructor:构造函数
- hasOwnProperty(propertyName):用于检查给定的属性是否在当前对象实例中寸在,参数为字符串形式。
- isPrototypeOf(object):检查传入对象是否是调用方法对象的原型。
- toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString():返回对象的字符串表示。
- valueOf():返回对象的字符串,数值或者布尔值表示。
- Object类型所具有的任何属性和方法在其实例化出来的对象中都被继承: