1.JS的数据类型
- 引用数据类型(对象类型):array,object,function,data,正则
- 基本类型(值类型):Number,string,null,undefind,Boolean
2.null与undefined的区别
- 1.null代表该变量有声明,但是未赋值,值为空;undefind代表该变量不纯在;
- 2.null转化为number,值为0;undiefind转化为number,值为NAN(not a number);
- 3.null通过typeof判断数据类型为object,undefind通过typeof判断的数据类型为undefined;
3.== 和 === 的区别
- 1.两个等号只判断值是否相同;
- 2.三个等号,不仅判断值是否相同,还要校验数据类型是否相同;
4.JS引入方式
- 1.外部引用方式:写在head标签内,通过路径引用
<script src='../../app.js'></script>
- 2.内部引用方式:在script标签内进行js书写
<script>
function(){
.....
}
</script>
<button onclick='alert("hello,js")'></button>
5.this对象的理解
this对象是基于其函数的执行环境绑定的,在全局环境中,this等于window;
- 有对象就指向调用对象
- 没调用对象就指向全局对象
- 通过 apply 或 call 或 bind 来改变 this 的所指。
6.对事件循环的理解?宏任务跟微任务
7.js闭包
- 闭包就是能够读取其他函数内部变量的函数。
- 闭包的优点就是可以实现数据共享,缺点就是滥用闭包会造成内存泄漏;
8.JS变量和函数声明的提升
- js的执行顺序是自上而下,如果提前调用了未声明的变量或者函数,浏览器会报错;但是通过var/function声明的变量跟函数会进行提升;
- var声明的变量,提前访问会打印出undefined;function声明的函数提前访问,可以访问到函数;
- 函数的提升优先级高于变量,但是值会被变量覆盖;
9.对作用域的理解
- 作用域指一个变量的作用的范围;
- 作用域分为全局作用域跟局部作用域,全局作用域里的变量可以在全局使用,局部作用域的变量具有局限性,但是对局部变量也是一种保护,避免了名字冲突跟变量污染;
10.原型和原型链
11.JS如何实现继承
1.原型链的继承,通过构造函数增加属性或者方法,由构造函数创造出的实例可以继承该属性或方法;
2.通过apply()或者call()将父对象的构造函数绑定在子对象上完成继承,其实也就是改变this指向;
3.es6的class方法也可以实现继承;
12.节流和防抖,如何实现?
- 首先需要了解为什么要进行防抖和节流?因为js引擎执行是单线程的,每次只能执行一个任务,执行多次同样的任务其实是一种性能消耗,某些场景下我们可以通过防抖跟节流去避免性能消耗;
- 防抖:避免用户在单位时间内多次点击,触发同一个事件;方法通过定时器去控制触发频率,首先我们要声明一个timer=null的变量,记作初始值;然后通过判断timer是否存在判断,是否需要进行防抖;如果timer存在,代表单位时间内的逻辑没有走完,本次逻辑需要忽略,进行防抖;如果timer不存在证明逻辑已经走完,不需要防抖;判断完timer后,就需要使用定时器去处理相关逻辑,处理完后需要将timer置空,完成循环;
- 节流:避免在监听情况下多次触发同一事件;应用场景:跟进页面滑动状态去处理一些问题;方法是监听滑动距离,在单位距离内处理逻辑,未满足条件,就忽略本次行为;首先要声明一个变量distance = 0;假定滑动距离超过500触发监听事件,那么接下来我们需要判断当前位置 减去 distance是否大于500,如果小于500,忽略本次操作。如果大于500继续往下进行,然后需要记录distance = 当前的滑动位置;在进行正常逻辑处理,完成循环;
13.深浅拷贝
14.js本地存储方式有哪些,区别与应用场景
- 类型:cookie,locaStorage,sessionStroage
- 区别:大小:cookie最小(4kb),locaStorage,sessionStroage(5M);
-
- 存储数据类型不同:cookie储存的是键值对;locaStorage,sessionStroage储存的是字符串;
-
- 生命周期不同:localStorage需要用户手动清理才会消失;sessionStrorage页面关闭就会消失;cookie在浏览器过期之前都存在,过期就会消失;
-
- 应用场景:需要标记用户行为,跟服务器进行交互的情况下,需要用cookie;不需要跟服务器通讯,长时间保留用户信息的场景用localStorage;一次性登录等敏感信息,使用sessionStorage;
15.JS的事件模型理解
- 一种是事件捕获,另一种是事件冒泡。
- 事件捕获:事件从上向下进行触发,事件首先从最外侧父元素开始触发,然后一直向里延伸,知道触发到最内层的元素。
- 事件冒泡:事件从下向上进行触发,事件首先会触发最底层的子节点,然后一直向上触发父元素事件。
16.typeof 与 instanceof 的区别
- typeof和instanceof的区别是:
- typeof的返回值是一个字符串,用来说明变量的数据类型;
- instanceof的返回值是布尔值,用于判断一个变量是否属于某个对象的实例。
17.对事件代理的理解
- 事件代理其实就是利用事件冒泡的原理,将子元素的绑定到父元素上;使用场景:我们需要对多个子元素进行事件管理,可以将事件委托给父元素进行统一管理;
18.重排与重绘
19.new操作符干了什么?
- 通过构造函数创建一个新的实例对象
obj
- 将对象与构建函数通过原型链连接起来
20.什么是Ajax,如何实现的?
- 1、创建 XMLHTTPRequest 对象,也就是创建一个异步调用对象
- 2、创建一个新的 HTTP 请求,并指定该 HTTP 请求的方法、URL 及验证信息
- 3、设置响应 HTTP 请求状态变化的函数
- 4、发送 HTTP 请求
- 5、获取异步调用返回的数据
- 6、使用 JavaScript 和 DOM 实现局部刷新
21.箭头函数与普通函数的区别
- 1、外形不同:箭头函数使用箭头定义,普通函数中没有。
- 2、箭头函数全都是匿名函数:普通函数可以有匿名函数,也可以有具名函数
- 3、箭头函数不能用于构造函数:普通函数可以用于构造函数,以此创建对象实例。
- 4、箭头函数中 this 的指向不同:在普通函数中,this 总是指向调用它的对象,如果用作构造函数,它指向创建的对象实例。
- 5、箭头函数不具有 prototype 原型对象
22.bind,call,apply的区别?
- 1.参数类型不同:apply第二个参数为数组;call,bind第二个参数为数列
- 2.返回值也不同:bind是返回绑定this之后的函数,apply、call 则是立即执行
- 3.apply,call的参数需要一次性传入,bind可以多次传入
23.js内存泄漏有哪几种情况,如何避免
- 什么是内存泄漏?就是不再需要的变量或者运行程序仍然在占用资源,影响性能;
- 情况:1.不必要的全局变量;2.使用完的定时器没有及时销毁;3.闭包
- 如何避免:一一对应处理
24.数组常用方法整理