目录
1. JS的数据类型(常问)
分类:
基本数据类型有:number、string、boolean、null、undefined。
引用数据类型有:array、function等(除了基本数据类型都是引用数据类型)
赋值方式:
基本数据类型 赋值方式是传值,值存储在栈中。
引用数据类型 赋值方式是传址,值存储在堆中。
判断数据类型的方法:
typeof() 判断基本数据类型 (string ,number,boolean,)
instanceof() 判断引用数据类型 (arry, function)
constructor 基本数据类型和引用数据类型,声明构造函数并指向array
object.prototype.tostring.call() 支持所有类型
2. 双等和三等的区别
‘== ’是值的比较, ‘=== ’是值和类型 的比较
== 仅对比值是否相等,值相等即可,无需比较类型。
===先对比数据的类型,再对比值是否相等。
3. let、 const、 var 区别
var: 存在变量提升,可以先去声明再去使用;一个变量可重复声明,后面的声明会覆盖前面的声明。
const: const声明一个只读的变量,声明后,值就不能改变。
let: 不存在变量提升,let 变量未声明前,该变量不能使用,否则报错。
4. 闭包 (常问)
概念:函数内部嵌套一个函数就是闭包,内部函数可访问外部函数的 变量。
特点:
函数套函数
内部函数可以引用 外层函数的 参数和变量
参数和变量不会被垃圾回收机制回收
用处 :
使用闭包,是为了设计私有变量和方法
读取函数内部变量,让变量始终保持在内存中
能实现封装 和 缓存
优点:可以避免全局变量的污染
缺点:是常驻内存,增大内存占用,使用不当会造成内存溢出
*使用闭包注意事项:
使用闭包,使函数的变量被保存在内存中,内存消耗大,乱用会影响网页性能,ie 中会导致内存泄漏。
解决方案: 在函数退出之前将不使用的局部变量全部清除(清除方法:将变量设置为null)
5. 作用域 和作用域链 (常问)
作用域:当前的执行上下文,值和表达式在其中“可见”或可被访问。作用域最大的用处就是隔离变量,不同作用域下的同名变量不会有冲突。
作用域链:当访问变量时,自己的作用域中没有,一层一层向上寻找,直到找到全局作用域还是没找到,就宣布放弃,这种一层一层的关系,就是作用域链。
作用域包括:
全局作用域 :全局的变量 ,任何地方都可以被访问
函数作用域:函数内部可以访问
块级作用域: 可通过 let 和 const 声明, 所声明的变量在指定块的作用域下可以访问, 块外无法访问。
延伸:
6.什么是模块化
模块化 是将复杂的系统划分成独立功能的方法,模块可以组合、分解、更换 (也可以说 一个js文件中可以引入另外一个js文件的数据)
模块化好处:提高了代码的 复用性、可维护性、可按需加载
模块化规范:???
7. js 继承 原型 原型链 (常问)
继承 : 父类拥有的属性 方法,子类也都有,子类通过 super传入参数调用父类构造函数 。
原型:每个对象都有一个属性_proto_,这个属性就是原型;
原型链: 当我们访问一个对象的成员(属性或者方法)时,
会先在自身上找 ,
如果自身上没有,就去它的原型(_proto_)上去找,
如果原型也没有,就会访问原型(_proto_)的原型(prototype),直到原型链的终点 null。
注意⚠️:如果还没有,此时属性就会获取 undefined,方法就会报错 xxx is not a function。一般原型链主要是用来实现面向对象继承的。
关系 : 类Student的 实例对象student 的原型_proto_ 和类Student的原型prototype是一样的
Student.prototype(显式原型) === student._proto_(隐式原型) 返回true
8.事件代理
概念 :是js 中常用的一种事件绑定技巧,就是把自身需要的事件 绑定到它的父元素,让父元素负责事件监听。