基础知识
变量声明
- var 声明变量,变量提升,可以重复声明,不使用var声明变量,默认为全局变量
- let 声明变量,块级作用域,不可以重复声明,不使用let声明变量,默认为全局变量
- const 声明常量,块级作用域,不可以重复声明,不使用const声明变量,默认为全局变量
- let 和 const 声明的变量,在声明之前使用,会报错,var 声明的变量,在声明之前使用,会输出undefined
数据类型
- 基本数据类型:number、string、boolean、undefined、null、symbol、bigint
- 引用数据类型:object、array、function
类型转换
- 转换为字符串:toString()、String()、+、模板字符串
- 转换为数字:parseInt()、parseFloat()、Number()、一元运算符+、一元运算符-
- 转换为布尔值:Boolean()、!!、条件判断
类型判断
- typeof:可以判断基本数据类型,不能判断引用数据类型,不能判断null,返回object
- instanceof:可以判断引用数据类型,不能判断基本数据类型,不能判断null,返回boolean
- constructor:可以判断基本数据类型,不能判断引用数据类型,不能判断null,返回boolean
- Object.prototype.toString.call():可以判断基本数据类型,不能判断引用数据类型,不能判断null,返回"[object Type]"
- null 和 undefined 的区别:null 表示一个空对象,undefined 表示一个未定义的值
- typeof null 的结果为什么是"object":这是一个历史遗留问题,因为在 JavaScript 的最初版本中,所有的对象都是通过指针来引用的,而 null 表示一个空指针,所以 typeof null 的结果是"object"
闭包
- 闭包是指有权访问另一个函数作用域中的变量的函数
- 闭包的作用:可以访问函数外部的变量,可以保存函数外部的变量,可以避免全局变量的污染
- 闭包的缺点:可能会导致内存泄漏,因为闭包会一直保存函数外部的变量,直到闭包被销毁
- 闭包的例子:函数作为参数传递,函数作为返回值
原型链
- 原型链是指对象的原型指向另一个对象的原型,直到指向null为止
- 原型链的作用:可以继承另一个对象的方法和属性
- 原型链的例子:每个对象都有一个原型对象,原型对象也有自己的原型对象,直到指向null为止
继承
- 继承是指一个对象继承另一个对象的方法和属性
- 继承的方式:原型链继承、构造函数继承、组合继承、寄生继承、寄生组合继承、类继承
- 继承的缺点:原型链继承会导致原型对象的属性被所有实例共享,构造函数继承会导致实例无法继承原型对象的属性,组合继承会导致每次实例化都会调用两次父类构造函数,寄生继承会导致无法正确继承父类原型链上的属性和方法,寄生组合继承会导致每次实例化都会调用两次父类构造函数,类继承会导致无法正确继承父类原型链上的属性和方法
事件循环
- 事件循环是指浏览器或Node.js在执行代码时,会先将同步代码执行完毕,然后再执行异步代码
- 事件循环的步骤:同步代码执行完毕,执行微任务队列中的任务,执行宏任务队列中的任务,执行微任务队列中的任务,执行宏任务队列中的任务,直到任务队列清空
- 事件循环的例子:setTimeout、Promise、async/await
- 事件循环的缺点:可能会导致性能问题,因为异步代码的执行顺序是不确定的,可能会导致内存泄漏,因为异步代码可能会导致内存泄漏
内存泄漏
- 内存泄漏是指程序在申请内存后,无法释放已申请的内存,导致内存占用不断增加,最终导致程序崩溃
- 内存泄漏的例子:闭包、全局变量、定时器、事件监听器
- 内存泄漏的解决方法:及时释放内存、避免闭包、避免全局变量、避免定时器、避免事件监听器
垃圾回收
- 垃圾回收是指程序在运行过程中,会自动释放不再使用的内存,以避免内存泄漏
- 垃圾回收的算法:标记-清除算法、引用计数算法
- 垃圾回收的缺点:可能会导致性能问题,因为垃圾回收需要占用CPU资源,可能会导致内存泄漏,因为垃圾回收无法释放闭包中的内存
Promise
- Promise 是一种异步编程的解决方案,它表示一个异步操作的最终完成(或失败),及其结果值
操作符
- 箭头函数:箭头函数是ES6中新增的一种函数表达式,它的语法更加简洁,并且没有自己的this、arguments、super或new.target
- 按位操作符:按位操作符是对数字的二进制位进行操作的,包括按位与、按位或、按位异或、按位非、左移、右移、无符号右移
- 逻辑操作符:逻辑操作符是对布尔值进行操作的,包括逻辑与、逻辑或、逻辑非
- 赋值操作符:赋值操作符是对变量进行赋值的,包括赋值、加赋值、减赋值、乘赋值、除赋值、取模赋值、左移赋值、右移赋值、无符号右移赋值、按位与赋值、按位或赋值、按位异或赋值
- 比较操作符:比较操作符是对两个值进行比较的,包括等于、不等于、全等于、不等于、大于、小于、大于等于、小于等于
- 条件操作符:条件操作符是对三个值进行比较的,包括条件运算符、三元运算符
- 逗号操作符:逗号操作符是对多个值进行操作的,包括逗号运算符、逗号分隔符
- instanceof操作符:instanceof操作符是用来判断一个对象是否是某个构造函数的实例的,返回boolean值
- typeof操作符:typeof操作符是用来判断一个值的类型的,返回string值
- delete操作符:delete操作符是用来删除一个对象的属性或数组的元素的,返回boolean值
- void操作符:void操作符是用来执行一个表达式,但不返回任何值的,返回undefined
- in操作符:in操作符是用来判断一个属性是否在一个对象中的,返回boolean值
- new操作符:new操作符是用来创建一个对象的,返回一个新对象
- this操作符:this操作符是用来指向当前对象的,返回一个对象
- super操作符:super操作符是用来指向当前对象的原型的,返回一个对象
- yield操作符:yield操作符是用来暂停函数的执行的,返回一个Generator对象
- yield操作符:yield操作符是用来暂停函数的执行的,返回一个Generator对象
- ...操作符:...操作符是用来展开一个数组或对象的,返回一个数组或对象
- =>操作符:=>操作符是用来定义箭头函数的,返回一个函数
- ?操作符:?操作符是用来定义条件运算符的,返回一个值
- :操作符::操作符是用来定义三元运算符的,返回一个值
- =操作符:=操作符是用来赋值的,返回一个值
- +=操作符:+=操作符是用来加赋值的,返回一个值
- -=操作符:-=操作符是用来减赋值的,返回一个值
- =操作符:=操作符是用来乘赋值的,返回一个值
- /=操作符:/=操作符是用来除赋值的,返回一个值
- %=操作符:%=操作符是用来取模赋值的,返回一个值
- <<=操作符:<<=操作符是用来左移赋值的,返回一个值
=操作符:>>=操作符是用来右移赋值的,返回一个值
=操作符:>>>=操作符是用来无符号右移赋值的,返回一个值
- &=操作符:&=操作符是用来按位与赋值的,返回一个值
- |=操作符:|=操作符是用来按位或赋值的,返回一个值
- ^=操作符:^=操作符是用来按位异或赋值的,返回一个值
- ==操作符:==操作符是用来判断两个值是否相等的,返回boolean值
- ===操作符:===操作符是用来判断两个值是否全等的,返回boolean值
- !=操作符:!=操作符是用来判断两个值是否不相等的,返回boolean值
- !==操作符:!==操作符是用来判断两个值是否不全等的,返回boolean值
操作符:>操作符是用来判断一个值是否大于另一个值的,返回boolean值
- <操作符:<操作符是用来判断一个值是否小于另一个值的,返回boolean值
=操作符:>=操作符是用来判断一个值是否大于等于另一个值的,返回boolean值
- <=操作符:<=操作符是用来判断一个值是否小于等于另一个值的,返回boolean值
- &&操作符:&&操作符是用来判断两个值是否都为真的,返回boolean值
- ||操作符:||操作符是用来判断两个值是否至少有一个为真的,返回boolean值
- !操作符:!操作符是用来判断一个值是否为假的,返回boolean值
- +操作符:+操作符是用来加两个值的,返回一个值
- -操作符:-操作符是用来减两个值的,返回一个值
- *操作符:*操作符是用来乘两个值的,返回一个值
- /操作符:/操作符是用来除两个值的,返回一个值
- %操作符:%操作符是用来取模两个值的,返回一个值
- <<操作符:<<操作符是用来左移一个值的,返回一个值
操作符:>>操作符是用来右移一个值的,返回一个值
操作符:>>>操作符是用来无符号右移一个值的,返回一个值
- &操作符:&操作符是用来按位与两个值的,返回一个值
- |操作符:|操作符是用来按位或两个值的,返回一个值