目录
构造函数中实例对象的new通常会做哪些事情
- 创建一个空对象
- 将this指向这个空对象
- 利用this在对象内添加属性和方法并执行代码
- 自动return this创建好的对象
什么是原型对象和原型链
- 原型对象是通过构造函数创造出来的实例对象 都可以共享访问到原型对象的方法或者属性
- 原型链指的是实例对象通过 __proto__从下往上来一层一层寻找自己的链式关系,就是原型链 作用是可以查看实例对象有哪些属性和方法
实例对象属性的访问规则是什么
- 先在自己身上找,有就用自己的
- 如果没有则往上找原型对象的
函数中this的指向
- 默认绑定指向window(普通函数、定时器、延时器)
- 隐式绑定指向调用者(let obj = {fn:function(){console.log(this)}}(this指向obj)、事件处理函数)
- new绑定指向new的实例对象 (function Person() { console.log(this)} let p = new Person())(new指向p)
- 硬绑定:想让this指向谁,就指向谁
- call 调用函数并且改变this
- apply 调用函数并且改变this (数组形式 )
- bind:返回一个新函数,并且规定死了该新函数的this指向
什么叫递归函数
递归函数指的是一个函数自调用 并且函数内有结束该函数的条件,这样的函数叫做递归函数
什么叫闭包
闭包指的是内层函数内调用外层函数内的变量
如何释放闭包空间
将外层函数调用赋值为null即可
什么叫浅拷贝和深拷贝?区别是什么
- 浅拷贝指的是对象中对象A需要用到对象B的属性,那么可以将对象B的属性利用for in语句来进行遍历,将需要的属性赋值给对象A,这个过程叫做浅拷贝
- 深拷贝指的是对象中对象A需要用到对象B的属性和方法,那么可以利用递归函数封装函数并且自调用的特点,将对象B的属性利用for in语句来进行多次遍历,将需要的属性、方法赋值给对象A,这个过程叫做深拷贝
- 区别:
- 浅拷贝只可以拷贝简单数据类型(堆内存),对于复杂数据类型只拷贝内存中的堆内存,而栈内存不会拷贝
- 深拷贝不仅可以拷贝简单数据类型(堆内存),还可以拷贝复杂数据类型(栈内存)
var、let、const的区别
var没有块级作用域、存在声明提升、可以先使用再声明、可以重复声明、在全局作用域下声明会被挂载到window
let和const存在块级作用域、不存在声明提升,必须先声明,后使用,不允许重复声明
const只能声明常量,必须有初始值
var和let可以声明变量和常量
let比var的优点:
1、let 有块级作用域
2、let 不会挂载到window上
3、let 必须先声明,后使用
4、let 不允许重复声明
箭头函数中this的指向
箭头函数中没有自己的this,如果在箭头函数中访问this,它会一层一层的往上找离它最近的this指向
什么情况下用箭头函数
- 定时器、延时器
- 数组的新语法相关操作
箭头函数中可以用arguments吗
不能,在箭头函数中没有arguments,如果需要获取到箭头函数中的值,可以用rest语法,来让箭头函数中的实参以数组的形式展现出来,具体写法为(…rest)=>{}
箭头函数在哪些情况下可以简写
- 形参为1个时可以不用写包裹形参的小括号
- 如果函数内代码只有一句话时,大括号也可以省略
- 如果函数体省略时,会自动return返回值,所以return也不用写
数组去重的方法
const arr = [1,2,3,1,2,3,4,2,5,2,6,4] const set = new Set(arr) console.log([...set]) // [1,2,3,4,5,6] // 一行写出数组去重 console.log([...new Set(arr)]) // [1,2,3,4,5,6]
什么是js的垃圾回收机制
js的垃圾回收机制是浏览器的一种机制,简单来说就是js中的每个代码都会有一个生命周期,这个生命周期包括内存分配、内存使用内存回收三个阶段,在打开一个网页时,浏览器会预解析当前的js代码,如果解析到某行代码声明的变量、函数、对象等下边用不到这些声明的东西,那么它会自动的将这些东西进行回收,来减轻内存空间的容量同时防止内存泄漏,全局变量需要我们手动清除,清除的方法就是将它赋值为null