一、基本数据类型
1. Number 数字类型
- 包括整数和浮点数
- 特殊值NaN:即Not a Number , 不是一个数字。在类型转换失败时,通常会得到一个NaN,NaN与任何值都不相等,包括NaN本身
Number("aaa") // NaN NaN != NaN
- 数值类型转换
- Number() 将非数值转换为数值类型
- parseInt() 将数字取整
- parseFloat() 转换为浮点数
- toFixed() 方法可把 Number 四舍五入为指定小数位数的数字
var num = 4.12345; console.log(num.toFixed()) // 4
- isNaN 判断是否是数字类型,如果 num 是一个空串或是一个空格,isNaN 是作为数字0处理的
- ES 6 增加了以下两个 Number 对象的方法:
- Number.isInteger(): 用来判断给定的参数是否为整数,整数返回true
- Number.isSafeInteger(): 判断传入的参数值是否是一个"安全整数"。
安全整数范围为 -(253 - 1)到 253 - 1 之间的整数,包含 -(253 - 1)和 253 - 1
2. String 字符串类型
- 字符串必须包含在单引号或双引号中
- 字符串必须在一行内表示,换行表示是不允许的,会报错
- 如果要换行显示字符串,可以在字符串中添加换行符\n
3. Boolean 布尔类型
- 布尔值只有两个值:true 或 false
- 使用 Boolean() 函数可以强制转换值为布尔值。
- undefined、null、""、0、NaN 和 false 这 6 个转换为布尔值时为 false,其他任何类型的数据转换为布尔值时都是 true。
console.log(Boolean(0)); //false
console.log(Boolean(NaN)); //false
console.log(Boolean(null)); //false
console.log(Boolean("")); //false
console.log(Boolean(undefined)); //false
console.log(Boolean(1)); //true
4. Undefined
- 当声明变量未赋值时,或者定义属性未设置值时,默认值都为 undefined
5. Null 空对象
- Null 类型只有一个值,即 null,它表示空值,定义一个空对象指针
- 使用 typeof 运算符检测 null 值,返回 Object
6. Symbol类型:es6新增
- 通过Symbol函数生成,表示独一无二的值
- 用于设置对象的属性名,可以避免与其他的属性名冲突
let s = Symbol();
typeof s
// "symbol"
二、引用数据类型:Object
1. Object 对象
2. Array 数组
3. Function 函数
三、基本数据类型与引用数据类型的区别
1. javascript的变量的存储方式:栈(stack)和堆(heap)
- 栈:自动分配内存空间,系统自动释放,里面存放的是基本类型的值和引用类型的地址
- 堆:动态分配的内存,大小不定,也不会自动释放,里面存放引用类型的值。
2.基本数据类型,复制变量,栈内存会新开辟一个内存
3.引用数据类型,复制变量,指向同一个堆内存,引用地址相同
四、深拷贝与浅拷贝
1. 递归复制对象属性
function deepClone(obj){
let objClone = Array.isArray(obj) ? [] : {};
if(obj && typeof obj === "object"){
for(let key in obj) {
//判断obj[key]是否为对象,若为对象,递归复制属性,若否,直接复制属性
if(obj.hasOwnProperty(key)) {
if(obj[key] && typeof obj[key] === "object") {
objClone[key] = deepClone(obj[key]);
} else {
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
2. 通过JSON的方式进行拷贝
let newObj = JSON.parse(JSON.stringify(obj))
注意:用法简单,然而使用这种方法会有一些隐藏的坑:因为在序列化JavaScript对象时,所有函数和原型成员会被有意忽略。
具体隐藏的坑参考:
- 如果json里面有时间对象,则序列化结果:时间对象=>字符串的形式;
- 如果json里有RegExp、Error对象,则序列化的结果将只得到空对象 RegExp、Error => {};
- 如果json里有 function,undefined,则序列化的结果会把 function,undefined 丢失;
- 如果json里有NaN、Infinity和-Infinity,则序列化的结果会变成null;
- 如果json里有对象是由构造函数生成的,则序列化的结果会丢弃对象的 constructor;
- 如果对象中存在循环引用的情况也无法实现深拷贝;
3. Object.assign()拷贝
当对象中只有一级属性,没有二级属性的时候,此方法为深拷贝,但是对象中有对象的时候,此方法,在二级属性以后就是浅拷贝。