# JavaScript知识点

# js数据类型
1. 原始数据类型：number、string、boolean、undefined、null、symbol、bigint 
2. 引用数据类型：object（包括Array，Function、Object类等） 
3. 区别：原始数据类型的存放在栈中，引用数据类型存放在堆中，它的地址在栈中，一般我们访问就是它的地址

# 闭包 
1. 概念：函数嵌套函数，内部函数能访问外部变量，这个变量称为自由变量 
2. 解决的问题：保存变量 
3. 带来的问题：会造成内存泄漏问题 
4. 闭包的应用：防抖节流

# promise 
1. 概念：异步编程的一种解决方案，解决了地狱回调的问题 
2. 使用方法：new Promise((resolve,reject) => { resolve（）; reject（）; })里面有多个resovle或者reject只执行第一个。如果第一个是resolve的话后面可以接.then查看成功消息。如果第一个是reject的话，.catch查看错误消息。 

# 跨域是指浏览器的同源策略是不允许执行其他网站上的脚本，只要协议，主机地址，端口其中之一不同就算跨域。跨域一般的解决方法时Jsonp，script标签不受同源策略影响；前台还可以设置代理proxy;后端也可以设置CROS,Access-Control-Allow-Origin；此外还有nginx的反向代理。

# call、apply和bind
相同点：都是函数方法，都能改变this指向
不同点：
call()与apply() 区别就是call()方法接受的是参数列表，而apply()方法接受的是一个参数数组。
call()与bind() 区别call()会立即调用新指向的函数，bind()不会立即调用会返回新指向的函数，需要手动调用
~~~
function fun(){}
let newThis = { name : "a"}
fun.call(newThis, "1", "2")
fun.apply(newThis,["1", "2"])
let newFun = fun.bind(newThis, "1", "2")
newFun()
~~~

# 在类中的函数叫方法，不在类中的函数叫函数。
# this在运行时确定，即指向函数调用对象，除非利用call、apply、bind等方法改变this指向。
1. 以函数的形式调用时，this永远都是window
2. 以方法的形式调用时，this就是调用方法的对象
3. 以构造函数的形式调用时，this就是新创建的对象
4. 使用call和apply调用时，this就是指定的那个对象
5. 在全局作用域中this代表window

# 箭头函数的this指向于函数作用域所在的对象
# 不可以当作构造函数
# 不可以使用arguments对象，该对象在函数体内不存在。

# Object.assign()是一种比较简单的深拷贝方法,但只会拷贝第一层

# offsetHeight = 内容高度 + padding + border
# clientheight = 内容高度 + padding
# scrollHeight = 内容实际尺寸 + padding

# childNodes属于NodeList集合，它会返回所有的子节点，包括文本、标签、注释等等。
# children数据HTMLCollection集合，它会返回所有HTML元素节点。
# childNodes包含children。

# Ajax 是一个技术统称，是一个概念模型，它囊括了很多技术，并不特指某一技术，它很重要的特性之一就是让页面实现局部刷新。
# Ajax 是一种思想，XMLHttpRequest 只是实现 Ajax 的一种方式
# Fetch 是一个 API，它是真实存在的，它是基于 promise 的。
# Axios 是一个基于 promise 封装的网络请求库，它是基于 XHR 进行二次封装。

# 多标签页通信
1.localStorage实现通信
2.使用websocket
3.SharedWorker
4.使用cookie + setInterval

# Array.from() 将类数组转为真正的数组

# String Number Boolean Null undefined symbol bigInt Object

# cookie 有存储大小限制，4KB 左右。
# 浏览器每次请求会携带 cookie 在请求头中。
# 字符编码为 Unicode，不支持直接存储中文。
# 数据可以被轻易查看。

~~~
// 创建 axios 请求实例
const userAxios = axios.create({
  baseURL: "", // 基础请求地址
  timeout: 10000, // 请求超时设置
  withCredentials: false, // 跨域请求是否需要携带 cookie
});
// 创建请求拦截
userAxios.interceptors.request.use((config)=>{},(err)=>{})
// 创建响应拦截
userAxios.interceptors.response.use((res)=>{},(err)=>{})
~~~

# dom 文档对象模型 浏览器加载html后会把html解析成dom
# bom 浏览器对象模型

# 判断数据类型
1.typeof只能判断基本类型 
2.intanceof 原生数据类型判断 
3。object.prototype.tostring.call() 返回值都是[Object xxx]格式 
4.arr.constrctor===Array

# bfc 
1. 定义：块级格式化上下文，独立的渲染区域，不会影响边界外的元素 
2. 形成的条件：a.浮动 b. 非静态定位，c. overflow:hidden d. display:table 
3. 解决的问题：a. 浮动元素重叠 b. 父元素高度塌陷 b. margin重叠

# !important > 内联样式（style） > ID选择器（id） > 类选择器(class) > 标签选择器 > 通配符

# js异步 所有异步任务都是在同步任务执行完成后，从任务队列中取出依次执行。settimeout 事件监听，回调函数，promise, generator, async/await

# 变量可以被手动赋值null，undefined是变量定了未赋值

# 原型对象
- prototype:显示原型对象
- __proto__：隐式原型对象
