大家好,我是蓝胖子的小叮当,今天分享的是JavaScript的第三章数据类型,大家在阅读期间有任何的意见或建议都可以留言给我哈!
3.1详解
- Undefined:标识变量未定义的值,通常情况下当一个变量被声明但没有被赋予任何值时,它的默认值就是Undefined;
- Null:表示空值或空对象引用;
- Boolean:表示逻辑上的真(true)或假(false);
- Number:表示数值,可以是整数也可以是浮点数,包括NaN(Not a Number);
- String:表示文本数据;
- Symbol:表示独一无二的标识符,主要用于对象属性的唯一标识或解决可能出现的全局变量冲突问题;
- BigInt:表示大整数,可以安全的存储和操作超出number类型范围的大整数;
- Object:用于存储多个值,包括数组、函数等。
3.2分类
数据分为两种类型:基本数据类型和引用数据类型
两种类型的区别在于存储位置的不同:
- 基本数据类型直接存储在栈中的简单数据段,占据空间小、大小固定、属于被频繁使用的数据,所以放入栈汇中存储。
- 引用数据类型存储在栈、堆中的对象,占据中间大、大小不固定,如果存储在栈中会影响程序运行的性能;引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
分类:
- 基本数据类型:Undefined、Null、Boolean、Number、String、Symbol、BigInt
- 引用数据类型:Object(包括Array、function、Date等)
3.3延伸1.深浅拷贝
根据上述对于数据类型的解释我们可以引出平常开发中经常遇到的问题:深浅拷贝
- 浅拷贝:复制栈中的地址指针操作,拷贝得到的对象会受到原对象的影响。(注:由此可知浅拷贝只存在于引用数据类型,基本数据类型不存在浅拷贝,基本数据类型的每次拷贝都是深拷贝)
- 深拷贝:创建一个新的对象来承接原对象的原始值,拷贝得到的对象不会受到原对象的影响。
深拷贝方式:
//方式1:
let arr=[{n:'old'},1,true,null,undefined]
let newArr=JSON.parse(JSON.stringify(arr))
arr[0].n='new'
console.log(newArr);//[ { n: 'old' }, 1, true, null, null ]
//方式2:
function deepCopy(obj){
if (typeof obj !== 'object' || obj === null) return //obj类型不为对象或为空
let newObj = obj instanceof Array ? [] : {} //obj类型为数组还是对象
for(let key in obj){ //遍历对象的所有键名
if(typeof obj[key]==='object'&&obj[key]!==null){ //obj[key]是对象且不为空
//创建一个新的对象
newObj[key]=deepCopy(obj[key]) //递归 创建的新对象赋给newObj[key]
}
else{
newObj[key]=obj[key]//将键值赋给newObj
}
}
return newObj
}
let newObj = deepCopy(obj)
3.4延伸2.类型检测
- typeOf:数组、对象、null都会被判定为object
- instanceof:可以正确判断对象的类型,而不能判断基本数据类型
- constructor:可以正确判断类型,但更改原型后不可靠
- Object.prototype.toString.call():可以正确判断类型,因为Array,function作为Object的实例,都重写了toString方法,所以需要用call来调用
使用:
let obj={a:1}
typeof(obj) //object
obj instanceof Object //true
obj.constructor //Object
Object.prototype.toString.call(obj).slice(8,-1) //Object
好啦,关于数据类型的知识点就总结到这里,如果有什么疑问、意见或建议,都可畅所欲言,谢谢大家,我也将持续更新。