1. 面向对象与面向过程编程
- 它们不是针对某一门编程语言,而是两种解决问题的编程思想
- 面向过程强调的解决问题的步骤,在意的严谨性
- 面向对象强调的以功能划分问题,扩展性比较强
2. this的指向问题
- 写在普通函数调用里,调用时指向window
- 实例化构造函数类时,指向实例
- 谁调用函数,函数里的this就指向谁
- call()方法改变this的指向,并执行函数
let 新函数 = 函数.bind(对象) // 新函数的this永久指向对象 不执行函数
3. 箭头函数与普通函数
- 箭头函数不能new, 即不能构造类,里面this指向window
4. eval函数
- 很强大的一个函数,可以执行字符串代码
- 在任何情况下我们都应该避免使用 eval 函数。99.9% 使用 eval 的场景都有不使用 eval 的解决方案, 不安全,非常耗性能(2次,一次解析成js语句,一次执行)。
- 但是在严格模式下,又新增了eval作用域。
5. 函数节流和防抖
1.短时间内触发次数很多的事件或函数,需要防抖
防抖示例,在时间间隔内,只有最后一次触发有效
function debounce(callback, delay = 300) {
var timer = null
return function() {
clearTimeout(timer)
timer = setTimeout(callback, delay)
}
}
window.onscroll = debounce(function() { //使用
console.log('调用了1次')
}, 500)
2.也可以用节流来解决
只有大于上一次触发在规定时间间隔才能触发
function throttle(callback, delay) {
var lastTime = new Date().getTime()
return function() {
var now = new Date().getTime()
if (now - lastTime > delay) {
callback()
lastTime = now
}
}
}
window.onscroll = throttle(function() { //使用
console.log('调用了1次')
}, 500)
6. 作用域链与闭包
- 闭包是指有权访问其他函数所定义的变量的函数
- 由于内部函数对外部函数变量还存在着应用,所以在外部函数执行完毕后不会主动将该内存销毁。
- 闭包最重要的用途是实现对象的私有数据。 对象的内部数据无法被轻易的修改,保证了程序的安全性。
- 大量的使用闭包会导致内存泄漏。
7. prototype与_proto_
function Func() {}
var func = new Func()
console.log(Func.prototype === func.__proto__) // true
console.log(Func.prototype.__proto__ === Object.prototype) // true
-
Javascript中所有的对象都是Object的实例,并继承Object.prototype的属性和方法
-
凡是对象都会有一个属性那就是__proto__,这个__proto__指向的就是他的构造函数的prototype
-
那么什么是原型链呢?接着上面的讲,我们都知道对象都有一个toString方法。上述的实例化对象b也可以toString,而实例化对象b本身并没有toString的方法,那他就会沿着它的__proto__向他的构造函数B的prototype对象去找,而这里也没有,那他就会 继续沿着B.prototype.__proto__向上找。而B.prototype.__proto__指向的就是Object.prototype
8. promise
9. 深浅拷贝
- 基本类型:从一个变量向另外一个新变量复制基本类型的值,会创建这个值的一个副本,并将该副本复制给新变量,所以基本类型进行复制是不会对另外一个变量有影响的
- 引用类型:从一个变量向另一个新变量复制引用类型的值,其实复制的是指针,最终两个变量最终都指向同一个对象
- 浅拷贝:仅仅是复制了引用,彼此之间的操作会互相影响
- 深拷贝:在堆中重新分配内存,不同的地址,相同的值,互不影响
10. 8种数据结构
11. 垃圾回收机制与内存泄漏
- 执行环境负责管理代码执行过程中使用的内存。垃圾收集器会定期(周期性)找出那些不在继续使用的变量,然后释放其内存。但是这个过程不是实时的,因为其开销比较大,所以垃圾回收器会按照固定的时间间隔周期性的执行,通常采用标记清除算法
- 标记清除算法由两个阶段组成:
· 第一阶段,标记所有的可访问对象.第一阶段叫做标记阶段.
· 第二阶段,垃圾收集算法扫描堆并回收所有的未标记对象.第二阶段叫做收集阶段
12. js数据类型分析
- 基本类型:undefined,null,Boolean,String,Number,Symbol
基本类型值在内存中占据固定大小,保存在栈内存中 - 引用类型:Object,Array,Date,Function,RegExp等
引用类型的值是对象,保存在堆内存中,而栈内存存储的是对象的变量标识符以及对象在堆内存中的存储地址
13. js异步编程
- 因为js是单线程的,等到浏览器执行完当前代码后会看异步队列里面有没有任务 再去执行
- 常用的有setTimeout setIntervel ajax Promise asyc/await
- 先执行微任务 再执行宏任务 宏任务有 定时器 ajax