4.数据类型与转换
数据类型分类
数据类型分为两大类:基本数据类型 & 引用数据类型(对象数据类型)
利用Object.prototype.toString判断数据类型
对象在创建之时,会用内部属性[[Class]]记录对象创建时的类型,而且这个内部属性无法被外部程序访问,这意味着它很安全,Object.prototype.toString就是利用这个内部属性来检测对象类型的。
console.log(Type(null)); //null
console.log(Type(undefined)); //undefined
console.log(Type("")); //string
console.log(Type(100)); //number
console.log(Type(true)); //boolean
console.log(Type([])); //array
console.log(Type({})); //object
console.log(Type(function () {})); //function
function Type(arr) {
return Object.prototype.toString.call(arr).slice(8,-1).toLowerCase();
}
数据类型判断
typeof可以当作操作符也可以当作函数
| 关键字 | 返回值类型 | 可以正确检测的类型 |
|---|---|---|
| typeof | string类型 | number;string;boolean;undefined;Symbol;Function |
| instanceof | Boolean | Function;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;
因为引用数据类型比较或运算时有原始值则用原始值参与比较,如果没有原始值会调用toString()方法将自身转成字符串,因此其在进行与非字符串非引用数据类型比较或运算时都是转换为NaN
| 都是显示原型上的方法 | 作用 |
|---|---|
| toString() | 数组转成以逗号分隔的字符串 函数把函数表达式原封不动的转成字符串 对象直接返回"[object Object]" 包装对象把原始值[[PrimitiveValue]]转成了字符串 |
| valueOf() | 对象在调用valueOf的时候,如果有原始值[[PrimitiveValue]],就返回原始值,如果没有,就返回对象本身(只有包装对象有原始值) |
数组转换注意:
[1,{}]转换为"1,[object Object]"
数据类型转换
手动转换(在字符串中提取数字)
parseInt(string, radix) 将小括号中的内容转换为整数
parseInt(string, radix) 将小括号中的内容转换为整数
- string,一个字符串,如果不是会转换为字符串,
按第二个参数指定的进制进行转换,再转换成十进制输出,
默认为十进制 - radix,(可选)是进制,radix为介于2-36之间的数,
如果为1或大于36的整数,或负数,则返回NaN
如果为0或小数,或字符串等任意有效数,则作为十进制处理 - 解析规则
从位置0处的字符开始解析,依次转换为数字,直到遇到转换为NaN时,停止解析,
如果遇到NaN前解析的字符串含有整数,返回这个整数,
如果没有遇到NaN,返回解析出来的数
否则返回NaN
parseInt(11,2) //3 (11按二进制转换为十进制转为3)
parseInt(10,alert) //10(按十进制转换)
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);

浙公网安备 33010602011771号