typeof操作符
用于检测给定变量的数据类型,有7种返回结果:
- “undefined”值未定义
- “boolean” 布尔值
- “string” 字符串
- “number”数值或NaN
- “object”对象或null
- “function”函数
- “symbol”ES6新增,独一无二
一. Undefined类型
只有一个值,即undefined,使用var声明变量但未初始化时。
注意:判断一个变量的值是否为undefined
if(a == "undefined") ×
if(typeof a == "undefined") √
if(!a) √
二. Null类型
只有一个值,即null,表示一个空对象指针。所以使用typeof检测时会返回”object”。如果定义的变量准备用于保存对象,最好初始化为null而不是其他值。
实际上,undefined值是派生自null值的
alert(null == undefined) //返回true
三. Boolean类型
该类型只有两个值:true和false,和数字值0、1不是一回事,且区分大小写。调用转型函数Boolean()可将一个值转换为其对应的Boolean值。
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空串) |
Number | 任何非0数值 | 0和NaN |
Object | 任何非空对象 | null |
Undefined | × | undefined |
四. Number类型
- 十进制
- 八进制:第一位必须是0 (0-7)
- 十六进制:前两位必须是0x (0-9 A-F)
- 浮点数
浮点数值的最高精度是17位小数,但在进行算术计算时其精度远不如整数,如0.1+0.2结果不是0.3,而是0.30000000000000004。不只js,其实像java等语言也是这样。
if(a + b == 0.3) //×,不要做这样的测试
数值范围
最小数值:Number.MIN_VALUE (5e-324)
最大数值:Number.MAX_VALUE (1.797693…..7e+308)
isFinite()函数判断是否位于最小和最大数值之间;
若某次计算结果超出数值范围,则该数值会被自动转换成特殊的Infinity(正无穷,正数除以0)、-Infinity(负无穷,负数除以0)NaN非数值
- 0/0会返回NaN,任何涉及NaN的操作都会返回NaN;
- NaN与任何值都不相等,包括NaN本身;
- isNaN()函数:尝试将值转换为数值,不能转换则返回true;
alert(NaN == NaN);//返回false
- 数值转换
三种方法:
- 转型函数Number(),用于任何数据类型
- parseInt() 专门用于字符串(常用)
如果第一个字符是数字,则继续解析,直到遇到了一个非数字字符或解析完所有后续字符
- 转型函数Number(),用于任何数据类型
parseInt(""); //空串返回NaN
parseInt("1234blue"); //1234
parseInt("22.5"); //22
parseInt("0xf"); //15
也可为parseInt()方法传入第二个参数,指定基数(多少进制)
parseInt("AF",16); //175
parseInt("AF"); //NaN
- parseFloat()
只解析十进制数,所以没有第二个参数
五. String类型
把一个值转换成String类型,有如下三种办法
- toString()
数值、布尔值、对象和字符串值都有toString()方法,但null和unedfined值没有
var num = 10;
num.toString(); //"10"
//正常用法,不必传参数,但调用数值的toString()方法时可以传参,指明进制
num.toString(2); //"1010"
num.toString(8); //"12"
- String()转型函数
- 如果值有toString()方法,则调用该方法返回相应结果
- 如果值是null,则返回”null”
- 如果值是undefined,则返回”undefined”
- 使用加号操作符+
六. Object类型
var o = new Object(); //Object是所有对象的基础
七. Symbol类型
var s1 = Symbol('foo'); //通过Symbol函数生成
var s2 = Symbol();
var s3 = Symbol();
s2 === s3 //false
s1.toString();//可转化为字符串
//不能与其他类型的值进行计算
八. 基本数据类型和引用数据类型的区别
- 基本类型值:由于占据空间小,大小固定,所以存储在栈内存中,按值访问,它们的值直接存储在变量访问的位置,从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本。
- 引用类型值:占据空间大,大小不固定,所以存储在堆内存中,按引用访问,存储在变量处的值是一个指针,指向存储对象的内存地址;从一个变量向另一个变量复制引用类型值时,复制的其实是指针,因此两个变量最终都指向同一个对象。