1.var、let、const的区别
标题 变量提升 范围 赋值 let 无 块作用域 const 无 必须初始化,不能再次赋值 var 有 函数作用域
2.深拷贝、浅拷贝、赋值
深拷贝和浅拷贝是对于引用数据类型(又称复杂数据类型)而言的
深拷贝:将原对象从内存中完整拷贝出一份,在堆内存中开辟一个新的区域存放新对象
浅拷贝:创建一个新的对象,该新对象有原始对象属性值的精确拷贝;新对象只是原对象的一个引用,不是赋值对象本身,新旧对象共享同一块内存;若原始对象的属性是基本类型,则拷贝的是基本类型的值,若属性是引用类型,拷贝的则是内存地址;
赋值:把某对象赋值给一个新变量时,赋的是该对象在栈中的内存地址,而非堆中的数据 两者区别: ||属性为基本类型 | 属性为引用类型 | | --- | ----------- | --------------------- | | 浅拷贝 | 互不影响 | 两对象其中一个改变内存地址则会影响另一个 | | 深拷贝 | 互不影响 | 互不影响
浅拷贝实现方式: ①object.assign()②...扩展运算符③Array.prototype.concat④Array.prototype.slice 深拷贝的实现方式: ①JSON.parse(JSON.stringify()) ②递归操作 ③cloneDeep
function deepClone(o) { let obj = {} for (var i in o) { if (typeof o[i] === 'object') {//复杂类型 obj[i] = deepClone(o[i]) } else {//简单类型 obj[i] = o[i] } } return obj }④Jquery.extend
3.基本数据类型与引用数据类型
基本类型:Number、String、Boolean、Null、Undefined、Symbol(es6引入) 引用类型:Object(在js中除了基本数据类型外都是对象) 两者区别:①引用类型是放在堆内存中的对象,引用类型数据在栈内存中保存的实际上是对对象在堆内存中的引用地址,通过引用地址可快速查到保存在堆内存中的对象
var obj1 = new Object(); var obj2 = obj1; obj2.name = "基本数据类型"; console.log(obj1.name); // 基本数据类型以上代码块中obj1与obj2均为引用数据类型,obj1赋值给obj2,即obj1将栈内存中的引用地址复制了一份给obj2,两给实际上是共同指向了同一个堆内存对象,所以修改obj2即修改堆内存中的对象,所以obj1同样可以访问到