一、数据类型
1. 简单数据类型
number、string、boolean、null、undefined、symbol、bigInt
2. 复杂数据类型
object
3. 简单数据类型和复杂数据类型的区别
- 存储机制不同
- 简单数据类型存储在栈中;
- 复杂数据类型存储在堆中,栈中存储的时引用地址,指向堆。
- 访问机制不同
- 简单数据类型按值访问;
- 复杂数据类型按引用访问,根据栈中的引用地址找堆中存储的值。
- 变量复制不同
- 简单数据类型复制的是原变量的一个副本,两个不会相互影响;
- 复杂数据类型复制的是引用地址,指向堆中同一个对象,一个变化另一个也会变化。
4. 简单数据类型转换
- 任意类型→Boolean
- Boolean(变量)
- '0'→true
- Boolean(变量)为false的值:
false,0和NaN,'', null,undefined
- 任意类型→Number
-
Number(变量)
- 如果是Boolean,true→1;false→0;
- 如果是number,返回的也是这个number;
- 如果是null,返回0;null→0
- 如果是undefined,返回NaN;undefined→NaN
- 如果是字符串,从不是空格且不是0的一位开始解析
- 全是数字就返回这个数字;
- 带浮点的就返回这个浮点数;
- 空字符串返回0;
- 含进制前缀的返回这个进制的值;
- 有字母或其他非数字字符就返回NaN。
- 如果是对象,先valueof(),再toString()。
-
parseInt(变量, [进制])
- 从不是空格且不是0的一位开始解析
- 第一个字符不是数字或负号,就会返回NaN;
- 前面部分是数字,就会返回数字的部分;
- 含有小数点的会忽略小数点后面的部分。
- 空字符串会返回NaN。
-
parseFloat(变量, [进制])
- 同parseInt,返回的结果为浮点数
-
- 任意类型→String
- string类型特点:不可变→字符串一旦创建,值就不能再改变,要改变某个变量储存的字符串,就需要销毁原来的,然后重新申请变量保存。
- 变量.toString([进制])
- null和undefined没有toString方法
- String(变量)
- 使用场景:需要转换,但不知道变量是否为null或undefined的情况
- 规则:如果有toString()方法,就调用toString方法;如果是null或undefined,就返回null或undefined。
5. 复杂数据类型转换
- 原始类型转对象
- 通过new String()、new Number() 或者new Boolean() 等构造函数,转换为它们各自的包装对象。
- 对象转字符串或数字
- ToPrimitive(input[, PreferredType])
- ToPrimitive(input[, PreferredType])
二、数据类型判断(主要为不同的Object类型的判断)
1. 基本数据类型
typeof操作符除null之外其余基本数据类型都可以正确返回,null返回object
2. 复杂数据类型
-
instanceof操作符- 单一的全局环境下可以正确检测,如果存在两个版本以上的Array构造函数,则无法正确检测
- 单一的全局环境下可以正确检测,如果存在两个版本以上的Array构造函数,则无法正确检测
-
Object.prototype.toString.call(检测对象) == '[Object Array]'- 调用toString方法时,会执行以下步骤:
- (1) 如果 this 值是 undefined,就返回 [object Undefined]
- (2) 如果 this 的值是 null,就返回 [object Null]
- (3) 让 Object 成为 ToObject(this) 的结果
- (4) 让 class 成为 Object 的内部属性 [[Class]] 的值
- (5) 最后返回由 "[object " 和 class 和 "]" 三个部分组成的字符串
- 调用toString方法时,会执行以下步骤:
-
constructor -
Array.isArray(检测对象)