-
js数据类型分
基本数据类型
和引用数据类型
- 基本数据类型
number
,string
,boolean
,undefined
,symbol
- 引用数据类型
object
([] {} null)
- 基本数据类型
-
基本数据类型特点:
- 值是不可变得
- 存放在栈区(占据空间小、大小固定,属于被频繁使用数据)
-
检验数据类型
- typeof: 检测全部基本数据类型(number,string,boolean,undefined,symbol),识别函数(function),判断是否是引用类型(不可细分null,[],{} => object)
- instanceof 用来判断A是否是B的实例,返回一个
布尔值
- Object.prototype.toString.call()
首先获取Object原型上的toString方法,让toString方法执行中的this指向第一个参数
Object上的toString它的作用是返回当前方法执行的主体(方法中的this)
所属类的详细信息即"[object Object]",其中第一个object代表当前实例是对象数据类型的(这个是固定死的),第二个Object代表的是this所属的类是Object
。
引申
-
== 和 ===
== :会进行数据类型的转化
=== : 值和数据类型都会进行比较 -
null 和undefined的区别
undefinde: 声明一个变量,但是没有赋值,未定义
null: 原型链的最顶端 ,没有,就是空对象
-
深拷贝和浅拷贝
深拷贝: 会开辟一块新的内存空间,A和B不会
相互影响
浅拷贝: A和B共用一块内存空间,会
相互影响
手写深拷贝
/**
* 深拷贝
*/
const obj1 = {
age: 20,
name: 'xxx',
address: {
city: 'beijing'
},
arr: ['a', 'b', 'c']
}
let obj2 = deepClone(obj1)
obj2.address.city = '123'
console.log(obj1.address.city);
function deepClone(obj = {}) {
// obj是null,或者不是数组,对象,直接返回空对象
if (typeof obj !== 'object' || obj == null) {
return obj
}
// 初始化返回结果
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for (let key in obj) {
// 保证key不是原型上的属性
if (obj.hasOwnProperty[key]) {
// 递归调用
result[key] = deepClone(obj[key])
}
}
return result
}