数据类型与转换
数据类型分类
数据类型分为两大类:基本数据类型 & 引用数据类型(对象数据类型)
数据类型判断
typeof可以当作操作符也可以当作函数
关键字 | 返回值类型 | 可以正确检测的类型 |
---|---|---|
typeof | string类型 | number;string;boolean;undefined;Symbol;Function |
instanceof | Boolean | Fuction;Array;Object; |
Array.isArray() | Boolean | Array |
null | Boolean | null |
typeof 123 // => 'number'
typeof "abc" // => 'string'
typeof true // => 'boolean'
typeof undefined // => 'undefined'
typeof null // => 'object'
// instanceof是判断左侧实例是不是在右侧构造函数所在原型链
//判断是不是数组
var arr = [3, 8, 2];
console.log(arr instanceof Array); //true
//判断是不是方法
function fn(){}
console.log(fn instanceof Function); //true
//判断是不是对象
var obj = {}
//先判断是不是数组
console.log(obj instanceof Array) //false
//再判断是不是方法
console.log(obj instanceof Function) //false
console.log(obj instanceof Object) //true
特殊情况
typeof null最终会判断为object(设计缺陷)
因为null只在对象初始化和删除用到所以类型归为object;
在 JS 的最初版本中,用的 32 位系统,为了性能考虑使用低位存储了变量的类型信息,000 开头代表是对象,然而 null 表示为全零,所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了,但是对于这个 Bug 却是一直流传下来。
基本数据类型
分类
类型 | 作用 |
---|---|
数值类型(Number和BIgInt) | 整数 小数 科学记数法 2进制(0b) 8进制(0o) 16进制(0x) |
字符串 | 单引号或者双引号包裹 空字符串 和 空白字符串 引号嵌套 |
布尔 | true或者false |
undefined | 定义的变量没有赋值 |
null | 定义的变量赋值为null(一般是对对象进行初始化使用或准备让对象被垃圾回收机制回收时使用) |
Symbol |
引用数据类型
类型 | |
---|---|
Array | |
Object | |
Function |
数据类型转换
手动转换(在字符串中提取数字)
parseInt() 将小括号中的内容转换为整数
parseFloat() 将小括号中的内容转换为小数
口诀:
对非string类型使用parseInt或parseFloat,他会先将数据转换为string类型在转换为Number
转String类型时,数字字符必须在字符串的前面(前面可以有空白字符);否则就是NaN
console.log( parseInt("abc") ); // -> NaN
console.log( parseInt("123abc") ); // -> 123
console.log( parseInt("abc123") ); // -> NaN
console.log( parseFloat("abc") ); // -> NaN
// parseFloat转string时,转数字字符串转到第一个非数字字符或者第二个小数点停止
console.log( parseFloat("123.45.36abc") ); // -> 123.45
console.log( parseFloat("abc123.45.36") ); // -> NaN
// 转Boolean
// 转布尔值时,都是NaN
console.log( parseInt(true) ); // NaN
console.log( parseInt(false) ); // NaN
console.log( parseFloat(false) ); // NaN
console.log( parseFloat(false) ); // NaN
console.log( parseInt(undefined) ); // NaN
console.log( parseInt(null) ); // -> NaN
强制(显式)转换
1.其它类型值转数字 - Number()
Number() 强制将一个其它类型数据转化为数字类型,转不了就是NaN(not a number)
-
转化字符串
? 字符串全由数字组成则转换为数字,否则转换为NaN
? 如果是一个特殊的空字符串或者空白字符串,则转化为0
-
转化boolean true为1 false为0
-
转化undefined 转化为NaN
-
转化null null 转化为0
2.其它类型值转字符串 - String()
String() 强制将一个其它类型数据转化为字符串类型
按原样变为字符串输出;
3.其它类型值转布尔值 - Boolean()
Boolean() 强制将一个其它类型数据转化为boolean类型
- 转化数字的时候,除了0和NaN是false,其余都是true
- 化字符串的时候,除了空字符串是false,其余都是true
- 转化undefined和null都是false
隐式转换
各种类型在适当的场合会发生隐式转换(隐式转换的规则和强制转换一样,只是自己没写出来)
主要是运算、条件、判断过程中
null判等的特殊情况
// null和undefined相等
// null和0不相等
// null和""不相等
// null和false不相等;
console.log(null == 0);
console.log(null == '');
console.log(null == false);
console.log(null == undefined);