这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战
JavaScript
1、JavaScript常用的数据类型有哪些
- 基本数据类型(5个)
- Number
- String
- Boolean
- Null
- undefined
- symbol(ES6中新增)
- 引用数据类型
- Object
- 两者之间的区别:在内存中的存储方式不同
1.1 类型检测方式有哪些?(总结四种)
- typeof(最常用)
- 使用
typeof 'abc'- 返回字符串类型的数据名称,例:String、Number...
- null -> object(不准确)
- instanceof(用到的比较少)
- 主要用于复杂数据类型中检测。
- 任意复杂类型都是object的子类型,因此检测“数组类型”的时候,返回的是object(不准确)
- constructor(构造器属性)
- 原型继承可能会被覆盖(不准确)
- Object.prototype.toString.call()(常使用)
- 返回:[object XXX]
- 检测“数组类型”的时候,并不会返回object Array,原因:数组“重写”了toString方法 -> 就近查找机制,没有再去原型链上找
对象的属性在使用时会沿着原型链向上查找,遵循就近原则,最终使用的功能是最近找到的
2.原始类型和对象类型有哪些区别?
-
存放方式不同
- 可存储的数据个数不同。
- 存储单个值
- 存储一组有关联的数据
- 在内存中的存储方式不同
- 原始值在内存单元中存储的是具体值,存储在栈中
- 对象在内存单元中存储的是具体值的地址,存储在堆中
- 可存储的数据个数不同。
-
操作时的结果不同
- 类型检测有区别
- 赋值操作的结果不同
- 赋值:对变量的内存单元进行操作
- 函数参数不同
- 复制值
- 引用地址
2.2
- 所有的字符串方法必须基于返回值操作
- 数组方法,大多数不需要基于返回值操作
3.如何拷贝对象?
- 拷贝:顾名思义就是复制
- **成功拷贝之后,两个文件是互不相关的,独立的两个文件。**修改一个文件中数据,另一个不会改变。
- 对象分为:1.单纯存数据的对象,数据中没有方法(function)。2.工具对象
- 数组如何拷贝?
- 浅拷贝:只拷贝当前对象自身的属性(一层),对属性的属性无法实现完全拷贝。
- 遍历 或者 内置方法 或 扩展运算符
- 深拷贝:完全拷贝
- 浅拷贝:只拷贝当前对象自身的属性(一层),对属性的属性无法实现完全拷贝。
- 对象如何拷贝?
- 深拷贝
- 方式1:利用JSON对象
// 深拷贝 JSON.parse(JSON.stringify(obj)) - 方式2:递归
// 深拷贝:递归实现 const obj = { name: '美美', age: 18, friend: { gender: '女' } } const obj2 = {}; // 深拷贝函数deepClone(source,targe); function deepClone(source,target){ for(let i in source){ // 检测数据类型,对象类型则需要内部遍历 if(typeof source[i] === 'object' && source[i] !== null){ target[i] = source[i] instanceof Array ? [] : {}; deepClone(source[i],target[i]); }else{ // 遍历赋值 target[i] = source[i]; } } } deepClone(obj,obj2); // 修改原对象 obj.name = '梅子'; obj.friend.gender = '男'; console.log(obj,obj2);
- 方式1:利用JSON对象
- 深拷贝