常规
常规
基本数据类型
number 数字类型
string 字符串类型
boolean 布尔值类型 步林
object 对象类型
undefined 为定义类型
null 空值类型
symbol 唯一类型(符号) 升波
BigInt 数字类型 比紧特
基本类型:String、Number、Boolean、Symbol、Undefined、Null
引用类型:Object
基本函数
- 截断:slice(),开始位置的索引(从0开始)
- 删除:splice()(丝不来丝)
- 转数组:split() 丝不来特
- 转字符串:join(),toString()
- JSON.stringify(obj) (丝准的怀) 转json字符串
- JSON.parse(_obj) (破儿丝) 转json对象
this指向的含义
- 在全局函数中,this等于window,
- 在函数被作为某个对象调用时,this等于那个对象
不过,匿名函数具有全局性,因此this对象同常指向window
JS变量提升
在函数作用域或者全局作用域中,通过var声明的变量,无论在哪里声明,都会被当做成在当前作用域或顶部声明,这就是函数提升
localStorage、sessionStorage与cookie区别
localStorage
localStorage的生命周期是永久性的。假若使用localStorage存储数据,即使关闭浏览器,也不会让数据消失,除非主动的去删除数据
sessionStorage
sessionStorage 的生命周期是在浏览器关闭前。也就是说,在整个浏览器未关闭前,其数据一直都是存在的
cookie
- 大小只有4kb
- 跨域不能共享
- 不安全,容易被劫持
- 只存在请求头中
闭包
定义:内部函数的作用域链依然保持着对父函数活动对象的引用,就是闭包
闭包有两个作用:
- 第一个就是可以读取自身函数外部的变量(沿着作用域链寻找)
- 第二个就是让这些外部变量始终保存在内存中
var test = function(){
var lives = 50
return function(){
lives -= 1
}
}()
// 调用
test();
什么是闭包?
- 函数内嵌套函数
- 子函数引用了父函数的相关变量
闭包是指有权访问另一个函数作用域中变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,创建的函数可以访问到当前函数的局部变量。
闭包优点:
- 创建全局私有变量,避免变量全局污染
- 可以实现封装、缓存等 闭包缺点:
- 创建的变量不能被回收,容易消耗内存,使用不当会导致内存溢出 解决: 在不需要使用的时候把变量设为null 使用场景:
- 常用来封装组件和插件,比如:表单操作和倒计时功能等等
闭包一定会造成内存泄漏吗?
闭包并不一定会造成内存泄漏,如果在使用闭包后变量没有及时销毁,可能会造成内存泄漏的风险。只要合理的使用闭包,就不会造成内存泄漏。
var、let和const的区别
- var可以重复声明,全局调用,没有块级作用域
- let不能重复声明,有块级作用域,变量可以修改
- const 不能重复声明,有块级作用域,常量不可以修改
暂时性死区: 在使用let、const命令声明变量之前,该变量都是不可用的。这在语法上,称为暂时性死区。使用var声明的变量不存在暂时性死区
解释null和undefined
JavaScript 中有两种底层类型:null 和 undefined。它们代表了不同的含义:
- 尚未初始化:undefined;
- 空值:null。
for in和for of的区别
- for…of 遍历获取的是对象的键值,for…in 获取的是对象的键名;
- for… in 会遍历对象的整个原型链,性能非常差不推荐使用
forEach和map方法有什么区别
两个方法都是用来遍历循环数组,区别如下:
- forEach()对数据的操作会改变原数组,该方法没有返回值;
- map()方法不会改变原数组的值,返回一个新数组,新数组中的值为原数组调用函数处理之后的值;
轮询
定义:就是每隔一个固定的时间就向后端发起一个异步请求。 常用到的方式:setTimeout和setInterval,clearTimeout (克尼尔特闷欧特),clearInterval (克里尔因特儿佛)
setInterval方式:
优点:就是写法简单; 缺点:就是无限的循环,不太好把控。
总的来说轮询会比较浪费网络资源,而且不管请求有没有响应,都会接着发下一次请求,影响性能。
长轮询
定义:就是下一次请求的发出的前提条件就是前一次请求响应成功。 通常采用promise语法来写
定时器
一次性定时器
setTimeout(callback, delay, rest) (色特特闷欧特) self.time = setTimeout(() => {
}, 1000);
取消定时器 clearTimeout (克尼尔特闷欧特)
clearTimeout(self.time)
定时加载定时器
setInterval(callback, delay, rest) (色特因特儿佛) self.time = setInterval(() => {
}, 1000);
取消定时器 clearInterval (克里尔因特儿佛)
clearInterval(self.time)
事件委托
什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这个事件。 也就是:利用冒泡的原理,把事件加到父级上,触发执行效果。
好处:
- 1、提高性能
- 2、新添加的原生还会有之前的事件
常见状态码含义
- 1××开头 - 信息性状态码,表示HTTP请求已被接收,需要进一步处理
- 2××开头 - 成功状态码,表示请求已成功处理完成。
- 3××开头 - 重定向状态码,表示请求需要进一步的操作以完成。
- 4××开头 - 客户端错误状态码,表示请求包含错误或无法完成。
- 5××开头 - 服务器错误状态码,表示服务器无法完成有效的请求。
HTTP请求(报文)都有什么组成?
HTTP请求报文主要由三个部分组成:请求行、请求头和请求体。具体如下:
- 请求行:包含请求方法、URI(请求的资源路径)和HTTP协议版本。例如:GET /index.html HTTP/1.1。
- 请求头(Header): 包含请求的元信息,如Host、User-Agent、Accept等。
- 请求体(Body) : 存放请求参数。
注意:并不是所有的HTTP请求都必须带有请求体,像GET请求通常不需要发送请求体
TCP和UDP协议
- UDP:在传送数据前不需要先建立连接,远地的主机在收到UDP报文后也不需要给出任何确认。
- TCP: 提供面向连接的服务。在传送数据之前必须先建立连接,数据传送结束后要释放连接。
说明==
和===
之间的区别?
==
仅检查值相等,而===
是一个更严格的等式判定,如果两个变量的值或类型不同,则返回false。
什么是全局变量?这些变量如何声明,使用全局变量有哪些问题?
全局变量是整个代码长度可用的变量,也就是说这些变量没有任何作用域。var关键字用于声明局部变量或对象。如果省略var关键字,则声明一个全局变量。
解构赋值
- 1、左右两边结构必须一样
- 2、右边必须是个东西
- 3、声明和赋值不能分开(必须在一句话里完成) 案例二
let {a, c, d}={a: 12, C: 5,d: 6};
console.1og(a, b, c);
为什么0.1+0.2 ! == 0.3,如何让其相等
因为浮点数运算的精度问题。在计算机运行过程中,需要将数据转化成二进制,然后再进行计算。 因为浮点数自身小数位数的限制而截断的二进制在转化为十进制,就变成0.30000000000000004,所以在计算时会产生误差
解决方案
- 将其先转换成整数,再相加之后转回小数。具体做法为先乘10相加后除以10
let x=(0.1*10+0.2*10)/10;
console.log(x===0.3)
- 使用number对象的toFixed方法,只保留一位小数点
(n1 + n2).toFixed(2)
设计模式知道那些?具体用法
- 单例模式:就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。
- 观察者模式: 观察者的使用场合就是:当一个对象的改变需要同时改变其它对象,并且它不知道具体有多少对象需要改变的时候,就应该考虑使用观察者模式。
- 工厂模式:解决了重复实例化的问题,缺点,创建不同对象其中属性和方法都会重复建立,消耗内存;还有函数识别问题等等。
栈,堆,队列
- 栈:先进后出
- 堆:动态分配,无特定顺序
- 队列:先进先出