[TOC]
## 数据类型
[**基本类型有哪些?**]()
```
基本数据类型
Number 、String、Boolean、BigInt、Symbol、Undefined、Null
引用类型
Object(Function ,Array,Date,Math,)
```
* [ ] 判断类型的方法有哪些?之间的区别是什么?
~~~jsx
let bool = true;
let num = 1;
let str = 'abc';
let und= undefined;
let nul = null;
let big = BigInt(1)
let arr = [1,2,3,4];
let obj = {name:'xiaoming',age:22};
let fun = function(){console.log('hello')};
let s1 = Symbol();
~~~
1. typeof
可以判断基本类型(除Null),
~~~jsx
typeof num // 'number'
typeof str // 'string'
typeof bool // 'boolean'
typeof und// 'undefined'
typeof big // 'bigint'
typeof s1 // 'Symbol'
~~~
2. instanceof
可以判断引用类型
3. Object.prototype.toString.call()
## 数组
[**数组有哪些方法**]()
~~~jsx
pop/some/find/push/unshift/shift/
~~~
[**哪些方法可以改变原数组**]()
~~~jsx
1. pop // 从最后一项移除 并返回移除的项目
2. push // 从数组后面添加一项,返回新的数组长度
3. shift // 从数组的最前面删除一项,并返回该项
4. unshift // 从数组的最前面添加一项,并返回新的数组长度
5. reverse // 反转数组
6. sort // 对数组进行排序
7. splice //三个参数。第一个代表开始的下标,第二个代表 要删除的个数,第三个代表要替换的东西 返回被删除的数组
~~~
[**for in , forof 有什么区别**]()
* for in 遍历的数组的索引(即key 值)
for in会遍历数组的所有可枚举属性,包括原型。所以更适合遍历对象
* for of 遍历数组的元素值
for of 不会遍历枚举属性
[**forEach()、map()、reduce()、filter()的区别**]()
* 都不会改变原数组
* forEach 循环数组中每一个元素并采取操作,不返回新数组,不支持continue、break关键字,
* map 返回值是每一次执行的结果组成的新数组
* filter 过滤组成员 并返回新数组
* reduce 处理组成员 并返回一个值
[**数组去重有哪些方式**]()
* Array.from(New Set())
* 其他的可以利用数组的一些方法 和ES6的Map
[**数组和类数组的区别**]()
* 类数组 具有.length 属性 但是不具有数组的方法
* 类数不能使用数组的方法
[**类数组怎么转成数组**]()
~~~jsx
[].prototype.slice.call()
Array.from
~~~
## 闭包
[**什么是闭包?**]()
能调用另一个函数内的变量
[**闭包是如何产生的?**]()
外层函数调用后,外层函数的作用域对象无法释放
[**用闭包有优缺点**]()
* .优点
` 减少了全局变量可以在内存中一直维持一个变量`
* 缺点
`由于得不到释放,消耗内存
使用不当会造成内存溢出`
## THIS
[**创建对象的方式有哪些**]()
* new Object()
* Object.create()
* 字面量写法
[**new Object() 和Object.create()有什么区别**]()
[**简述一下什么是this**]()
this是个对象 在不同情况下this的指向不同
~~~jsx
1. 对象调用时this指向该对象
2. 直接调用的函数 this 指向window
3. 通过new 的方式 this 永远指向新创建的对象
~~~
[**call、apply、bind、有什么区别**]()
* 都可以改变this
* call/apply 都会立即执行 bind 返回改变this 后的函数
* call 第二个参数接受参数列表 apply 第二个参数接受一个数组
## 原型 原型链
[**什么是原型、原型链**]()
* 原型
1. 原型包括隐式原型(__prot0__) 和显示原型(prototype)
2. 所有的函数都有prototype(显示原型)属性,属性值是一个普通对象指向函数的原型对象
3. 引用类型都有一个__proto__(隐式原型)属性,指向构造函数的prototype
* 原型链 **原型链的链接是靠隐式原型链接的**
`当访问一个对象属性时,会先在对象本身查找,如果没有找到就会去对象的__proto__(隐式原型)查找,即构造函数的prototype ,如果还没有查找到,回去构造函数的prototype的__proto__查找。这样一层层向上查找的链式结构,叫做原型链`
[**继承
有哪些方法,他们直接的区别是什么**]()
## 深浅拷贝
[**什么是深浅拷贝**]()
* 浅拷贝 指向同一内存地址是共同使用一块内存
* 深拷贝 会新开辟一块内存空间 然后指向该内存空间
[**js中那些是深拷贝 那些是浅拷贝**]()
* 浅拷贝 ... assign
## 其他
[**JavaScript有哪些内置对象**]()
`Math Object Array Date RegExp JSON Promise parseInt等。。。`
[**JavaScript脚本延迟加载的方式有哪些?**]()
* 动态添加script 标签
* defer 属性
* async 属性
* setTimeoute
* 让js 最后加载
[**defer 和async 有什么区别和优缺点?**]()
* defer 脚本会被延迟到整个页面都解析完毕之后再执
* async 加载完脚本后立即执行
缺点是 不能控制加载的顺序
[**ajax、axios、fetch的区别?**]()
* Ajax
~~~jsx
1. 属 js 原生
2. 容易产生回调地狱
~~~
* Axios
~~~jsx
1. 解决回调地狱问题
2. 支持Promise技术
3. 有超时处理
4. 有拦截器,可以对请求和响应统一处理
5. 浏览器兼容性良好
~~~
* Fetch
~~~jsx
1. 属 js 原生
2. 基于 Promise 对象设计的,可以解决回调地狱问题
3. 默认不带cookie,使用时需要设置
4. 没有办法检测请求的 进度,无法取消或超时处理
~~~
[**什么是防抖、节流?**]()
1. 防抖
~~~jsx
1. 什么是防抖?
在事件被触发n秒后再执行回调函数,如果在这n秒内又被触发,则重新计时
2. 应用场景
输入框连续输入、resize、scroll事件
3. 原理
维护一个定时器,规定在delay时间后触发函数,但是在delay 时间内再次触发的话 会清空当前timer,然后重新计时
~~~
2. 节流
~~~jsx
1. 什么是节流?
单位时间内,只能有一次触发事件的回调函数能执行。单位事件内触发多次,只有一次生效
2. 应用场景
鼠标连续点击、
3. 原理
判断是否到达一定时间来触发函数,
~~~