JS深入知识点
一些重要知识点
1.深浅拷贝
浅拷贝:重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响。
深拷贝:从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象互不影响。
浅拷贝 与 赋值区别
赋值都会相互影响 浅拷贝只对引用类型相互影响基本数据类型不会影响
当我们把一个对象赋值给一个新的变量时,赋的其实是该对象的在栈中的地址,而不是堆中的数据。
也就是两个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容,因此,两个对象是联动的。
1 | //浅拷贝的实现方式 |
1 | //手撕深拷贝&&深度比较 |
2.预编译
预编译 作用域的创建阶段
js的变量对象 函数代码执行前期AO对象(作用域) 供JS引擎自己去访问 在全局代码执行的前期会创建GO对象
作用域链:AO与GO的集合
步骤:
1 创建AO对象
2 找形参和变量的声明(作为AO对象的属性名,值是undefined)
3 实参和形参相统一
4 找函数声明 重名则会覆盖变量的声明
1 | function fn(a, c) { |
3.箭头函数中的this指向
1 | //箭头函数中的this是在定义函数的时侯绑定,而不是在执行函数的时候绑定 |
4.this指向
1 | //this既不指向函数本身也不指向函数的词法作用域。this实际上是在函数被调用时发生的绑定,他指向什么完全取决于函数在哪里被调用 四种规则优先级:new绑定(绑定到新创建的对象)>显示绑定>隐式绑定(上下文对象隐式丢失(默认绑定))>默认绑定(如果实在严格模式下(并不是调用位置而是函数体是否处于严格模式),就绑定到undefined,否则绑定到全局对象) |
5.闭包
1 | //闭包的更多作用 1.封装变量 2.延续局部变量的寿命 |